From b33d86abb9997c1c056d2f6e55a9754dffed5f48 Mon Sep 17 00:00:00 2001 From: Benoit Germain Date: Fri, 30 Nov 2018 11:13:21 +0100 Subject: Fix clonable userdata uservalue transfer --- deep_test/deep_test.c | 27 ++++++++++++++++++++++++++- deep_test/deep_test.vcxproj | 8 +++++++- deep_test/deep_test.vcxproj.filters | 6 ++++++ deep_test/deep_test.vcxproj.user | 2 +- deep_test/deeptest.lua | 13 +++++++------ 5 files changed, 47 insertions(+), 9 deletions(-) (limited to 'deep_test') diff --git a/deep_test/deep_test.c b/deep_test/deep_test.c index 7edd33f..9585a3c 100644 --- a/deep_test/deep_test.c +++ b/deep_test/deep_test.c @@ -6,6 +6,7 @@ #include "lauxlib.h" #include "deep.h" +#include "compat.h" #if (defined PLATFORM_WIN32) || (defined PLATFORM_POCKETPC) #define LANES_API __declspec(dllexport) @@ -123,6 +124,27 @@ static int clonable_set( lua_State* L) // ################################################################################################ +static int clonable_setuv( lua_State* L) +{ + struct s_MyClonableUserdata* self = (struct s_MyClonableUserdata*) lua_touserdata( L, 1); + int uv = (int) luaL_optinteger( L, 2, 1); + lua_settop( L, 3); + lua_pushboolean( L, lua_setiuservalue( L, 1, uv) != 0); + return 1; +} + +// ################################################################################################ + +static int clonable_getuv( lua_State* L) +{ + struct s_MyClonableUserdata* self = (struct s_MyClonableUserdata*) lua_touserdata( L, 1); + int uv = (int) luaL_optinteger( L, 2, 1); + lua_getiuservalue( L, 1, uv); + return 1; +} + +// ################################################################################################ + static int clonable_tostring(lua_State* L) { struct s_MyClonableUserdata* self = (struct s_MyClonableUserdata*) lua_touserdata( L, 1); @@ -170,6 +192,8 @@ static luaL_Reg const clonable_mt[] = { "__gc", clonable_gc}, { "__lanesclone", clonable_lanesclone}, { "set", clonable_set}, + { "setuv", clonable_setuv}, + { "getuv", clonable_getuv}, { NULL, NULL } }; @@ -177,7 +201,8 @@ static luaL_Reg const clonable_mt[] = int luaD_new_clonable( lua_State* L) { - lua_newuserdata( L, sizeof( struct s_MyClonableUserdata)); + int nuv = (int) luaL_optinteger( L, 1, 1); + lua_newuserdatauv( L, sizeof( struct s_MyClonableUserdata), nuv); luaL_setmetatable( L, "clonable"); return 1; } diff --git a/deep_test/deep_test.vcxproj b/deep_test/deep_test.vcxproj index 110a191..d94b855 100644 --- a/deep_test/deep_test.vcxproj +++ b/deep_test/deep_test.vcxproj @@ -65,7 +65,7 @@ MultiByte - Application + DynamicLibrary false v141 true @@ -132,6 +132,10 @@ lua53.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(SolutionDir)..\lualib;%(AdditionalLibraryDirectories) + + xcopy /R /F /Y /I "$(TargetPath)" $(SolutionDir)..\framework\ + Copy to framework + @@ -224,11 +228,13 @@ + + diff --git a/deep_test/deep_test.vcxproj.filters b/deep_test/deep_test.vcxproj.filters index b5c696f..93f6148 100644 --- a/deep_test/deep_test.vcxproj.filters +++ b/deep_test/deep_test.vcxproj.filters @@ -24,6 +24,9 @@ Lanes + + Lanes + @@ -32,6 +35,9 @@ Lanes + + Lanes + diff --git a/deep_test/deep_test.vcxproj.user b/deep_test/deep_test.vcxproj.user index 372bf91..f6a2db8 100644 --- a/deep_test/deep_test.vcxproj.user +++ b/deep_test/deep_test.vcxproj.user @@ -3,7 +3,7 @@ D:\Boulot\anubis\Lua\framework\lua53.exe WindowsLocalDebugger - -i deeptest.lua + -i -- deeptest.lua D:\Boulot\anubis\Lua\bindings\Lanes\lanes\deep_test\ diff --git a/deep_test/deeptest.lua b/deep_test/deeptest.lua index c0bbab4..16059d9 100644 --- a/deep_test/deeptest.lua +++ b/deep_test/deeptest.lua @@ -4,16 +4,17 @@ local l = lanes.linda "my linda" -- we will transfer userdata created by this module, so we need to make Lanes aware of it local dt = lanes.require "deep_test" -local test_deep = true -local test_clonable = false +local test_deep = false +local test_clonable = true local performTest = function( obj_) - obj_:set(666) + obj_:set( 666) + obj_:setuv( 1, "my uservalue") print( "immediate:", obj_) l:set( "key", obj_) local out = l:get( "key") - print( "out of linda:", out) + print( "out of linda:", out, out:getuv( 1)) local g = lanes.gen( "package" @@ -21,13 +22,13 @@ local performTest = function( obj_) 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_) + print( "in lane:", obj_, obj_:getuv( 1)) return obj_ end ) h = g( obj_) local from_lane = h[1] - print( "from lane:", from_lane) + print( "from lane:", from_lane, from_lane:getuv( 1)) end if test_deep then -- cgit v1.2.3-55-g6feb