aboutsummaryrefslogtreecommitdiff
path: root/deep_test
diff options
context:
space:
mode:
authorBenoit Germain <b n t DOT g e r m a i n AT g m a i l DOT c o m>2018-11-07 19:16:36 +0100
committerBenoit Germain <b n t DOT g e r m a i n AT g m a i l DOT c o m>2018-11-07 19:16:36 +0100
commita142eb1e1ee81919d10b55bb7fa2e33636098d85 (patch)
tree21ef5c830ce4b4e845454af4274beabd073cc720 /deep_test
parent91155c74fc10fa98ad6257d5309bfd13d4a61cf0 (diff)
downloadlanes-a142eb1e1ee81919d10b55bb7fa2e33636098d85.tar.gz
lanes-a142eb1e1ee81919d10b55bb7fa2e33636098d85.tar.bz2
lanes-a142eb1e1ee81919d10b55bb7fa2e33636098d85.zip
__lanesclone mechanism should actually work now
Diffstat (limited to 'deep_test')
-rw-r--r--deep_test/deep_test.c80
-rw-r--r--deep_test/deeptest.lua53
2 files changed, 94 insertions, 39 deletions
diff --git a/deep_test/deep_test.c b/deep_test/deep_test.c
index 8f34fe5..4aac586 100644
--- a/deep_test/deep_test.c
+++ b/deep_test/deep_test.c
@@ -80,10 +80,7 @@ static void* deep_test_id( lua_State* L, enum eDeepOp op_)
80 80
81 case eDO_metatable: 81 case eDO_metatable:
82 { 82 {
83 lua_newtable( L); // mt 83 luaL_getmetatable( L, "deep"); // mt
84 luaL_setfuncs( L, deep_mt, 0); // mt
85 lua_pushvalue( L, -1); // mt mt
86 lua_setfield( L, -2, "__index"); // mt
87 luaG_pushdeepversion( L); // mt version 84 luaG_pushdeepversion( L); // mt version
88 return NULL; 85 return NULL;
89 } 86 }
@@ -115,6 +112,16 @@ struct s_MyClonableUserdata
115 112
116// ################################################################################################ 113// ################################################################################################
117 114
115static int clonable_set( lua_State* L)
116{
117 struct s_MyClonableUserdata* self = (struct s_MyClonableUserdata*) lua_touserdata( L, 1);
118 lua_Integer i = lua_tointeger( L, 2);
119 self->val = i;
120 return 0;
121}
122
123// ################################################################################################
124
118static int clonable_tostring(lua_State* L) 125static int clonable_tostring(lua_State* L)
119{ 126{
120 struct s_MyClonableUserdata* self = (struct s_MyClonableUserdata*) lua_touserdata( L, 1); 127 struct s_MyClonableUserdata* self = (struct s_MyClonableUserdata*) lua_touserdata( L, 1);
@@ -124,13 +131,34 @@ static int clonable_tostring(lua_State* L)
124 131
125// ################################################################################################ 132// ################################################################################################
126 133
134static int clonable_gc( lua_State* L)
135{
136 struct s_MyClonableUserdata* self = (struct s_MyClonableUserdata*) lua_touserdata( L, 1);
137 return 0;
138}
139
140// ################################################################################################
141
127static int clonable_lanesclone( lua_State* L) 142static int clonable_lanesclone( lua_State* L)
128{ 143{
129 // no need to set the metatable, the Lane copying mechanism will take care of it 144 switch( lua_gettop( L))
130 struct s_MyClonableUserdata* self = lua_touserdata( L, 1); 145 {
131 struct s_MyClonableUserdata* to = lua_newuserdata( L, sizeof( struct s_MyClonableUserdata)); 146 case 0:
132 memcpy( to, self, sizeof(struct s_MyClonableUserdata)); 147 lua_pushinteger( L, sizeof( struct s_MyClonableUserdata));
133 return 1; 148 return 1;
149
150 case 2:
151 {
152 struct s_MyClonableUserdata* self = lua_touserdata( L, 1);
153 struct s_MyClonableUserdata* from = lua_touserdata( L, 2);
154 *self = *from;
155 return 0;
156 }
157
158 default:
159 (void) luaL_error( L, "Lanes called clonable_lanesclone with unexpected parameters");
160 }
161 return 0;
134} 162}
135 163
136// ################################################################################################ 164// ################################################################################################
@@ -138,9 +166,9 @@ static int clonable_lanesclone( lua_State* L)
138static luaL_Reg const clonable_mt[] = 166static luaL_Reg const clonable_mt[] =
139{ 167{
140 { "__tostring", clonable_tostring}, 168 { "__tostring", clonable_tostring},
141 //{ "__gc", deep_gc}, 169 { "__gc", clonable_gc},
142 { "__lanesclone", clonable_lanesclone}, 170 { "__lanesclone", clonable_lanesclone},
143 //{ "set", deep_set}, 171 { "set", clonable_set},
144 { NULL, NULL } 172 { NULL, NULL }
145}; 173};
146 174
@@ -149,15 +177,7 @@ static luaL_Reg const clonable_mt[] =
149int luaD_new_clonable( lua_State* L) 177int luaD_new_clonable( lua_State* L)
150{ 178{
151 lua_newuserdata( L, sizeof( struct s_MyClonableUserdata)); 179 lua_newuserdata( L, sizeof( struct s_MyClonableUserdata));
152 if( luaL_getmetatable( L, "clonable") == LUA_TNIL) // u mt? 180 luaL_setmetatable( L, "clonable");
153 {
154 lua_pop( L, 1); // u
155 lua_newtable( L); // u mt
156 luaL_setfuncs( L, clonable_mt, 0);
157 lua_pushvalue(L, -1); // u mt mt
158 lua_setfield(L, -2, "__index"); // u mt
159 }
160 lua_setmetatable( L, -2); // u
161 return 1; 181 return 1;
162} 182}
163 183
@@ -175,6 +195,24 @@ static luaL_Reg const deep_module[] =
175 195
176extern int __declspec(dllexport) luaopen_deep_test(lua_State* L) 196extern int __declspec(dllexport) luaopen_deep_test(lua_State* L)
177{ 197{
178 luaL_newlib( L, deep_module); 198 luaL_newlib( L, deep_module); // M
199
200 // preregister the metatables for the types we can instanciate so that Lanes can know about them
201 if( luaL_newmetatable( L, "clonable")) // M mt
202 {
203 luaL_setfuncs( L, clonable_mt, 0);
204 lua_pushvalue(L, -1); // M mt mt
205 lua_setfield(L, -2, "__index"); // M mt
206 }
207 lua_setfield(L, -2, "__clonableMT"); // M
208
209 if( luaL_newmetatable( L, "deep")) // mt
210 {
211 luaL_setfuncs( L, deep_mt, 0);
212 lua_pushvalue(L, -1); // mt mt
213 lua_setfield(L, -2, "__index"); // mt
214 }
215 lua_setfield(L, -2, "__deepMT"); // M
216
179 return 1; 217 return 1;
180} 218}
diff --git a/deep_test/deeptest.lua b/deep_test/deeptest.lua
index 3b514dd..c0bbab4 100644
--- a/deep_test/deeptest.lua
+++ b/deep_test/deeptest.lua
@@ -1,22 +1,39 @@
1-- create a deep-aware full userdata while Lanes isn't loaded 1local lanes = require("lanes").configure{ with_timers = false}
2local dt = require "deep_test" 2local l = lanes.linda "my linda"
3local deep = dt.new_deep()
4deep:set(666)
5print( deep)
6 3
7local clonable = dt.new_clonable() 4-- we will transfer userdata created by this module, so we need to make Lanes aware of it
5local dt = lanes.require "deep_test"
8 6
9-- now load Lanes and see if that userdata is transferable 7local test_deep = true
10--[[ 8local test_clonable = false
11local lanes = require("lanes").configure() 9
12local l = lanes.linda "my linda" 10local performTest = function( obj_)
11 obj_:set(666)
12 print( "immediate:", obj_)
13
14 l:set( "key", obj_)
15 local out = l:get( "key")
16 print( "out of linda:", out)
17
18 local g = lanes.gen(
19 "package"
20 , {
21 required = { "deep_test"} -- we will transfer userdata created by this module, so we need to make this lane aware of it
22 }
23 , function( obj_)
24 print( "in lane:", obj_)
25 return obj_
26 end
27 )
28 h = g( obj_)
29 local from_lane = h[1]
30 print( "from lane:", from_lane)
31end
13 32
14l:set( "key", deep) 33if test_deep then
15local deep_out = l:get( "key") 34 performTest( dt.new_deep())
16print( deep_out) 35end
17 36
18lanes.register() 37if test_clonable then
19l:set( "key", clonable) 38 performTest( dt.new_clonable())
20local clonable_out = l:get( "key") 39end
21print( clonable_out)
22--]] \ No newline at end of file