@@ -332,7 +332,15 @@ fn test_scope_userdata_ref() -> Result<()> {
332332 let data = MyUserData ( Cell :: new ( 1 ) ) ;
333333 lua. scope ( |scope| {
334334 let ud = scope. create_userdata_ref ( & data) ?;
335- modify_userdata ( & lua, ud)
335+ modify_userdata ( & lua, & ud) ?;
336+
337+ // We can only borrow userdata scoped
338+ assert ! ( ( matches!( ud. borrow:: <MyUserData >( ) , Err ( Error :: UserDataTypeMismatch ) ) ) ) ;
339+ ud. borrow_scoped :: < MyUserData , ( ) > ( |ud_inst| {
340+ assert_eq ! ( ud_inst. 0 . get( ) , 2 ) ;
341+ } ) ?;
342+
343+ Ok ( ( ) )
336344 } ) ?;
337345 assert_eq ! ( data. 0 . get( ) , 2 ) ;
338346
@@ -362,9 +370,16 @@ fn test_scope_userdata_ref_mut() -> Result<()> {
362370 let mut data = MyUserData ( 1 ) ;
363371 lua. scope ( |scope| {
364372 let ud = scope. create_userdata_ref_mut ( & mut data) ?;
365- modify_userdata ( & lua, ud)
373+ modify_userdata ( & lua, & ud) ?;
374+
375+ assert ! ( ( matches!( ud. borrow_mut:: <MyUserData >( ) , Err ( Error :: UserDataTypeMismatch ) ) ) ) ;
376+ ud. borrow_mut_scoped :: < MyUserData , ( ) > ( |ud_inst| {
377+ ud_inst. 0 += 10 ;
378+ } ) ?;
379+
380+ Ok ( ( ) )
366381 } ) ?;
367- assert_eq ! ( data. 0 , 2 ) ;
382+ assert_eq ! ( data. 0 , 12 ) ;
368383
369384 Ok ( ( ) )
370385}
@@ -415,27 +430,47 @@ fn test_scope_any_userdata_ref() -> Result<()> {
415430 let data = Cell :: new ( 1i64 ) ;
416431 lua. scope ( |scope| {
417432 let ud = scope. create_any_userdata_ref ( & data) ?;
418- modify_userdata ( & lua, ud)
433+ modify_userdata ( & lua, & ud)
419434 } ) ?;
420435 assert_eq ! ( data. get( ) , 2 ) ;
421436
422437 Ok ( ( ) )
423438}
424439
425- fn modify_userdata ( lua : & Lua , ud : AnyUserData ) -> Result < ( ) > {
426- let f: Function = lua
427- . load (
428- r#"
429- function(u)
430- u:inc()
431- u:dec()
432- u:inc()
433- end
434- "# ,
435- )
436- . eval ( ) ?;
440+ #[ test]
441+ fn test_scope_any_userdata_ref_mut ( ) -> Result < ( ) > {
442+ let lua = Lua :: new ( ) ;
437443
438- f. call :: < ( ) > ( ud) ?;
444+ lua. register_userdata_type :: < i64 > ( |reg| {
445+ reg. add_method_mut ( "inc" , |_, data, ( ) | {
446+ * data += 1 ;
447+ Ok ( ( ) )
448+ } ) ;
449+
450+ reg. add_method_mut ( "dec" , |_, data, ( ) | {
451+ * data -= 1 ;
452+ Ok ( ( ) )
453+ } ) ;
454+ } ) ?;
455+
456+ let mut data = 1i64 ;
457+ lua. scope ( |scope| {
458+ let ud = scope. create_any_userdata_ref_mut ( & mut data) ?;
459+ modify_userdata ( & lua, & ud)
460+ } ) ?;
461+ assert_eq ! ( data, 2 ) ;
439462
440463 Ok ( ( ) )
441464}
465+
466+ fn modify_userdata ( lua : & Lua , ud : & AnyUserData ) -> Result < ( ) > {
467+ lua. load (
468+ r#"
469+ local u = ...
470+ u:inc()
471+ u:dec()
472+ u:inc()
473+ "# ,
474+ )
475+ . call ( ud)
476+ }
0 commit comments