aboutsummaryrefslogtreecommitdiff
path: root/deep_test
diff options
context:
space:
mode:
Diffstat (limited to 'deep_test')
-rw-r--r--deep_test/deep_test.c54
-rw-r--r--deep_test/deep_test.lua6
2 files changed, 45 insertions, 15 deletions
diff --git a/deep_test/deep_test.c b/deep_test/deep_test.c
index a48ecb2..abe9fdc 100644
--- a/deep_test/deep_test.c
+++ b/deep_test/deep_test.c
@@ -1,3 +1,5 @@
1#include <malloc.h>
2
1#include "lua.h" 3#include "lua.h"
2#include "lualib.h" 4#include "lualib.h"
3#include "lauxlib.h" 5#include "lauxlib.h"
@@ -10,19 +12,46 @@
10#define LANES_API 12#define LANES_API
11#endif // (defined PLATFORM_WIN32) || (defined PLATFORM_POCKETPC) 13#endif // (defined PLATFORM_WIN32) || (defined PLATFORM_POCKETPC)
12 14
15struct s_MyDeepUserdata
16{
17 lua_Integer val;
18};
19static void* deep_test_id( lua_State* L, enum eDeepOp op_);
20
21// ################################################################################################
22
23static int deep_set( lua_State* L)
24{
25 struct s_MyDeepUserdata* self = luaG_todeep( L, deep_test_id, 1);
26 lua_Integer i = lua_tointeger( L, 2);
27 self->val = i;
28 return 0;
29}
30
13// ################################################################################################ 31// ################################################################################################
14 32
15static int deep_tostring(lua_State* L) 33static int deep_tostring( lua_State* L)
16{ 34{
17 lua_pushliteral( L, "I am a deep_test"); 35 struct s_MyDeepUserdata* self = luaG_todeep( L, deep_test_id, 1);
36 lua_pushfstring( L, "deep_test(%d)", self->val);
18 return 1; 37 return 1;
19} 38}
20 39
21// ################################################################################################ 40// ################################################################################################
22 41
42static int deep_gc( lua_State* L)
43{
44 struct s_MyDeepUserdata* self = luaG_todeep( L, deep_test_id, 1);
45 return 0;
46}
47
48// ################################################################################################
49
23static luaL_Reg const deep_mt[] = 50static luaL_Reg const deep_mt[] =
24{ 51{
25 { "__tostring", deep_tostring}, 52 { "__tostring", deep_tostring},
53 { "__gc", deep_gc},
54 { "set", deep_set},
26 { NULL, NULL } 55 { NULL, NULL }
27}; 56};
28 57
@@ -34,26 +63,25 @@ static void* deep_test_id( lua_State* L, enum eDeepOp op_)
34 { 63 {
35 case eDO_new: 64 case eDO_new:
36 { 65 {
37 void* allocUD; 66 struct s_MyDeepUserdata* deep_test = (struct s_MyDeepUserdata*) malloc( sizeof(struct s_MyDeepUserdata));
38 lua_Alloc allocF = lua_getallocf( L, &allocUD); 67 deep_test->val = 0;
39 void* deep_test = allocF( allocUD, NULL, 0, sizeof(void*));
40 return deep_test; 68 return deep_test;
41 } 69 }
42 70
43 case eDO_delete: 71 case eDO_delete:
44 { 72 {
45 void* allocUD; 73 struct s_MyDeepUserdata* deep_test = (struct s_MyDeepUserdata*) lua_touserdata( L, 1);
46 lua_Alloc allocF = lua_getallocf( L, &allocUD); 74 free( deep_test);
47 void* deep_test = lua_touserdata( L, 1);
48 allocF( allocUD, deep_test, sizeof(void*), 0);
49 return NULL; 75 return NULL;
50 } 76 }
51 77
52 case eDO_metatable: 78 case eDO_metatable:
53 { 79 {
54 lua_newtable( L); 80 lua_newtable( L); // mt
55 luaL_setfuncs( L, deep_mt, 0); 81 luaL_setfuncs( L, deep_mt, 0); // mt
56 luaG_pushdeepversion( L); 82 lua_pushvalue( L, -1); // mt mt
83 lua_setfield( L, -2, "__index"); // mt
84 luaG_pushdeepversion( L); // mt version
57 return NULL; 85 return NULL;
58 } 86 }
59 87
@@ -69,7 +97,7 @@ static void* deep_test_id( lua_State* L, enum eDeepOp op_)
69 97
70// ################################################################################################ 98// ################################################################################################
71 99
72int luaD_new_deep(lua_State* L) 100int luaD_new_deep( lua_State* L)
73{ 101{
74 return luaG_newdeepuserdata( L, deep_test_id); 102 return luaG_newdeepuserdata( L, deep_test_id);
75} 103}
diff --git a/deep_test/deep_test.lua b/deep_test/deep_test.lua
index 034c07d..fd78115 100644
--- a/deep_test/deep_test.lua
+++ b/deep_test/deep_test.lua
@@ -1,13 +1,15 @@
1-- create a deep-aware full userdata while Lanes isn't loaded 1-- create a deep-aware full userdata while Lanes isn't loaded
2local dt = require "deep_test" 2local dt = require "deep_test"
3local deep = dt.new_deep() 3local deep = dt.new_deep()
4deep:set(666)
4print( deep) 5print( deep)
5 6
6-- now load Lanes and see if that userdata is transferable 7-- now load Lanes and see if that userdata is transferable
7 8--[[
8local lanes = require("lanes").configure() 9local lanes = require("lanes").configure()
9 10
10local l = lanes.linda "my linda" 11local l = lanes.linda "my linda"
11l.put( "key", deep) 12l.put( "key", deep)
12local out = l.get( "key") 13local out = l.get( "key")
13print( out) \ No newline at end of file 14print( out)
15]] \ No newline at end of file