From 54e788bc121218f8f1a978ee136e4d0faa67370d Mon Sep 17 00:00:00 2001 From: Benoit Germain Date: Wed, 23 Jun 2021 14:44:43 +0200 Subject: updated deep userdata unit test to expose issue #189 --- deep_test/deep_test.c | 25 +++++++++++++++++++++++++ deep_test/deeptest.lua | 35 ++++++++++++++++++++++++++--------- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/deep_test/deep_test.c b/deep_test/deep_test.c index 61c81c5..4bee7fe 100644 --- a/deep_test/deep_test.c +++ b/deep_test/deep_test.c @@ -35,6 +35,29 @@ static int deep_set( lua_State* L) // ################################################################################################ +// won't actually do anything as deep userdata don't have uservalue slots +static int deep_setuv( lua_State* L) +{ + struct s_MyDeepUserdata* self = luaG_todeep( L, deep_test_id, 1); + int uv = (int) luaL_optinteger( L, 2, 1); + lua_settop( L, 3); + lua_pushboolean( L, lua_setiuservalue( L, 1, uv) != 0); + return 1; +} + +// ################################################################################################ + +// won't actually do anything as deep userdata don't have uservalue slots +static int deep_getuv( lua_State* L) +{ + struct s_MyDeepUserdata* self = luaG_todeep( L, deep_test_id, 1); + int uv = (int) luaL_optinteger( L, 2, 1); + lua_getiuservalue( L, 1, uv); + return 1; +} + +// ################################################################################################ + static int deep_tostring( lua_State* L) { struct s_MyDeepUserdata* self = luaG_todeep( L, deep_test_id, 1); @@ -57,6 +80,8 @@ static luaL_Reg const deep_mt[] = { "__tostring", deep_tostring}, { "__gc", deep_gc}, { "set", deep_set}, + { "setuv", deep_setuv}, + { "getuv", deep_getuv}, { NULL, NULL } }; diff --git a/deep_test/deeptest.lua b/deep_test/deeptest.lua index 16059d9..bc183a0 100644 --- a/deep_test/deeptest.lua +++ b/deep_test/deeptest.lua @@ -5,25 +5,32 @@ local l = lanes.linda "my linda" local dt = lanes.require "deep_test" local test_deep = false -local test_clonable = true +local test_clonable = false +local test_clonable_as_upvalue = true -local performTest = function( obj_) +local performTest = function( obj_, uservalue_) + -- setup the userdata with some value and a uservalue obj_:set( 666) - obj_:setuv( 1, "my uservalue") - print( "immediate:", obj_) + obj_:setuv( 1, uservalue_) + -- read back the contents of the object + print( "immediate:", obj_, obj_:getuv( 1)) + + -- send the object in a linda, get it back out, read the contents l:set( "key", obj_) local out = l:get( "key") print( "out of linda:", out, out:getuv( 1)) + -- send the object in a lane through parameter passing, the lane body returns it as return value, read the contents local g = lanes.gen( "package" , { required = { "deep_test"} -- we will transfer userdata created by this module, so we need to make this lane aware of it } - , function( obj_) - print( "in lane:", obj_, obj_:getuv( 1)) - return obj_ + , function( param_) + -- read contents inside lane + print( "in lane:", param_, param_:getuv( 1)) + return param_ end ) h = g( obj_) @@ -32,9 +39,19 @@ local performTest = function( obj_) end if test_deep then - performTest( dt.new_deep()) + performTest( dt.new_deep(), "some uservalue") end if test_clonable then - performTest( dt.new_clonable()) + performTest( dt.new_clonable(), "my uservalue") end + +if test_clonable_as_upvalue then + local clonable = dt.new_clonable() + -- pull clonable as upvalue in a function + local f = function() + print( clonable) + end + -- set function as uservalue of clonable (thus, clonable is referenced as upvalue in its function uservalue) + performTest( clonable, f) +end \ No newline at end of file -- cgit v1.2.3-55-g6feb