From e0dbd33c2d4776d6b2213dd82f344166eafde438 Mon Sep 17 00:00:00 2001 From: Benoit Germain Date: Tue, 1 Aug 2017 09:40:44 +0200 Subject: Fix for deep-aware modules Don't crash when using a module that creates Lanes-compatible deep userdata. Added a sample deep-aware module. --- deep_test/deep_test.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++ deep_test/deep_test.lua | 13 +++++++ 2 files changed, 104 insertions(+) create mode 100644 deep_test/deep_test.c create mode 100644 deep_test/deep_test.lua (limited to 'deep_test') diff --git a/deep_test/deep_test.c b/deep_test/deep_test.c new file mode 100644 index 0000000..a48ecb2 --- /dev/null +++ b/deep_test/deep_test.c @@ -0,0 +1,91 @@ +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" + +#include "deep.h" + +#if (defined PLATFORM_WIN32) || (defined PLATFORM_POCKETPC) +#define LANES_API __declspec(dllexport) +#else +#define LANES_API +#endif // (defined PLATFORM_WIN32) || (defined PLATFORM_POCKETPC) + +// ################################################################################################ + +static int deep_tostring(lua_State* L) +{ + lua_pushliteral( L, "I am a deep_test"); + return 1; +} + +// ################################################################################################ + +static luaL_Reg const deep_mt[] = +{ + { "__tostring", deep_tostring}, + { NULL, NULL } +}; + +// ################################################################################################ + +static void* deep_test_id( lua_State* L, enum eDeepOp op_) +{ + switch( op_) + { + case eDO_new: + { + void* allocUD; + lua_Alloc allocF = lua_getallocf( L, &allocUD); + void* deep_test = allocF( allocUD, NULL, 0, sizeof(void*)); + return deep_test; + } + + case eDO_delete: + { + void* allocUD; + lua_Alloc allocF = lua_getallocf( L, &allocUD); + void* deep_test = lua_touserdata( L, 1); + allocF( allocUD, deep_test, sizeof(void*), 0); + return NULL; + } + + case eDO_metatable: + { + lua_newtable( L); + luaL_setfuncs( L, deep_mt, 0); + luaG_pushdeepversion( L); + return NULL; + } + + case eDO_module: + return "deep_test"; + + default: + { + return NULL; + } + } +} + +// ################################################################################################ + +int luaD_new_deep(lua_State* L) +{ + return luaG_newdeepuserdata( L, deep_test_id); +} + +// ################################################################################################ + +static luaL_Reg const deep_module[] = +{ + { "new_deep", luaD_new_deep}, + { NULL, NULL} +}; + +// ################################################################################################ + +extern int __declspec(dllexport) luaopen_deep_test(lua_State* L) +{ + luaL_newlib( L, deep_module); + return 1; +} diff --git a/deep_test/deep_test.lua b/deep_test/deep_test.lua new file mode 100644 index 0000000..034c07d --- /dev/null +++ b/deep_test/deep_test.lua @@ -0,0 +1,13 @@ +-- create a deep-aware full userdata while Lanes isn't loaded +local dt = require "deep_test" +local deep = dt.new_deep() +print( deep) + +-- now load Lanes and see if that userdata is transferable + +local lanes = require("lanes").configure() + +local l = lanes.linda "my linda" +l.put( "key", deep) +local out = l.get( "key") +print( out) \ No newline at end of file -- cgit v1.2.3-55-g6feb