aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Germain <bnt.germain@gmail.com>2021-06-23 14:44:43 +0200
committerBenoit Germain <bnt.germain@gmail.com>2021-06-23 14:44:43 +0200
commit54e788bc121218f8f1a978ee136e4d0faa67370d (patch)
treeabbb96bbe5d683aabc85ddfd803734550221db73
parentd1ef9b97e356805c622e4832ec76289bae391a6e (diff)
downloadlanes-54e788bc121218f8f1a978ee136e4d0faa67370d.tar.gz
lanes-54e788bc121218f8f1a978ee136e4d0faa67370d.tar.bz2
lanes-54e788bc121218f8f1a978ee136e4d0faa67370d.zip
updated deep userdata unit test to expose issue #189
-rw-r--r--deep_test/deep_test.c25
-rw-r--r--deep_test/deeptest.lua35
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)
35 35
36// ################################################################################################ 36// ################################################################################################
37 37
38// won't actually do anything as deep userdata don't have uservalue slots
39static int deep_setuv( lua_State* L)
40{
41 struct s_MyDeepUserdata* self = luaG_todeep( L, deep_test_id, 1);
42 int uv = (int) luaL_optinteger( L, 2, 1);
43 lua_settop( L, 3);
44 lua_pushboolean( L, lua_setiuservalue( L, 1, uv) != 0);
45 return 1;
46}
47
48// ################################################################################################
49
50// won't actually do anything as deep userdata don't have uservalue slots
51static int deep_getuv( lua_State* L)
52{
53 struct s_MyDeepUserdata* self = luaG_todeep( L, deep_test_id, 1);
54 int uv = (int) luaL_optinteger( L, 2, 1);
55 lua_getiuservalue( L, 1, uv);
56 return 1;
57}
58
59// ################################################################################################
60
38static int deep_tostring( lua_State* L) 61static int deep_tostring( lua_State* L)
39{ 62{
40 struct s_MyDeepUserdata* self = luaG_todeep( L, deep_test_id, 1); 63 struct s_MyDeepUserdata* self = luaG_todeep( L, deep_test_id, 1);
@@ -57,6 +80,8 @@ static luaL_Reg const deep_mt[] =
57 { "__tostring", deep_tostring}, 80 { "__tostring", deep_tostring},
58 { "__gc", deep_gc}, 81 { "__gc", deep_gc},
59 { "set", deep_set}, 82 { "set", deep_set},
83 { "setuv", deep_setuv},
84 { "getuv", deep_getuv},
60 { NULL, NULL } 85 { NULL, NULL }
61}; 86};
62 87
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"
5local dt = lanes.require "deep_test" 5local dt = lanes.require "deep_test"
6 6
7local test_deep = false 7local test_deep = false
8local test_clonable = true 8local test_clonable = false
9local test_clonable_as_upvalue = true
9 10
10local performTest = function( obj_) 11local performTest = function( obj_, uservalue_)
12 -- setup the userdata with some value and a uservalue
11 obj_:set( 666) 13 obj_:set( 666)
12 obj_:setuv( 1, "my uservalue") 14 obj_:setuv( 1, uservalue_)
13 print( "immediate:", obj_)
14 15
16 -- read back the contents of the object
17 print( "immediate:", obj_, obj_:getuv( 1))
18
19 -- send the object in a linda, get it back out, read the contents
15 l:set( "key", obj_) 20 l:set( "key", obj_)
16 local out = l:get( "key") 21 local out = l:get( "key")
17 print( "out of linda:", out, out:getuv( 1)) 22 print( "out of linda:", out, out:getuv( 1))
18 23
24 -- send the object in a lane through parameter passing, the lane body returns it as return value, read the contents
19 local g = lanes.gen( 25 local g = lanes.gen(
20 "package" 26 "package"
21 , { 27 , {
22 required = { "deep_test"} -- we will transfer userdata created by this module, so we need to make this lane aware of it 28 required = { "deep_test"} -- we will transfer userdata created by this module, so we need to make this lane aware of it
23 } 29 }
24 , function( obj_) 30 , function( param_)
25 print( "in lane:", obj_, obj_:getuv( 1)) 31 -- read contents inside lane
26 return obj_ 32 print( "in lane:", param_, param_:getuv( 1))
33 return param_
27 end 34 end
28 ) 35 )
29 h = g( obj_) 36 h = g( obj_)
@@ -32,9 +39,19 @@ local performTest = function( obj_)
32end 39end
33 40
34if test_deep then 41if test_deep then
35 performTest( dt.new_deep()) 42 performTest( dt.new_deep(), "some uservalue")
36end 43end
37 44
38if test_clonable then 45if test_clonable then
39 performTest( dt.new_clonable()) 46 performTest( dt.new_clonable(), "my uservalue")
40end 47end
48
49if test_clonable_as_upvalue then
50 local clonable = dt.new_clonable()
51 -- pull clonable as upvalue in a function
52 local f = function()
53 print( clonable)
54 end
55 -- set function as uservalue of clonable (thus, clonable is referenced as upvalue in its function uservalue)
56 performTest( clonable, f)
57end \ No newline at end of file