aboutsummaryrefslogtreecommitdiff
path: root/deep_test/deep_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'deep_test/deep_test.cpp')
-rw-r--r--deep_test/deep_test.cpp66
1 files changed, 30 insertions, 36 deletions
diff --git a/deep_test/deep_test.cpp b/deep_test/deep_test.cpp
index 3467939..b11445b 100644
--- a/deep_test/deep_test.cpp
+++ b/deep_test/deep_test.cpp
@@ -5,6 +5,21 @@
5#include <memory.h> 5#include <memory.h>
6#include <assert.h> 6#include <assert.h>
7 7
8class MyDeepFactory : public DeepFactory
9{
10 private:
11
12 DeepPrelude* newDeepObjectInternal(lua_State* L) const override;
13 void deleteDeepObjectInternal(lua_State* L, DeepPrelude* o_) const override;
14 void createMetatable(lua_State* L) const override
15 {
16 luaL_getmetatable(L, "deep");
17 }
18 char const* moduleName() const override { return "deep_test"; }
19};
20
21static MyDeepFactory g_MyDeepFactory;
22
8// ################################################################################################ 23// ################################################################################################
9 24
10// a lanes-deep userdata. needs DeepPrelude and luaG_newdeepuserdata from Lanes code. 25// a lanes-deep userdata. needs DeepPrelude and luaG_newdeepuserdata from Lanes code.
@@ -15,44 +30,25 @@ struct MyDeepUserdata : public DeepPrelude // Deep userdata MUST start with a De
15 30
16// ################################################################################################ 31// ################################################################################################
17 32
18[[nodiscard]] static void* deep_test_id(lua_State* L, DeepOp op_) 33DeepPrelude* MyDeepFactory::newDeepObjectInternal(lua_State* L) const
19{ 34{
20 switch( op_) 35 MyDeepUserdata* deep_test = new MyDeepUserdata{ g_MyDeepFactory };
21 { 36 return deep_test;
22 case DeepOp::New: 37}
23 {
24 MyDeepUserdata* deep_test = new MyDeepUserdata;
25 return deep_test;
26 }
27
28 case DeepOp::Delete:
29 {
30 MyDeepUserdata* deep_test = static_cast<MyDeepUserdata*>(lua_touserdata( L, 1));
31 delete deep_test;
32 return nullptr;
33 }
34
35 case DeepOp::Metatable:
36 {
37 luaL_getmetatable( L, "deep"); // mt
38 return nullptr;
39 }
40 38
41 case DeepOp::Module: 39// ################################################################################################
42 return (void*)"deep_test";
43 40
44 default: 41void MyDeepFactory::deleteDeepObjectInternal(lua_State* L, DeepPrelude* o_) const
45 { 42{
46 return nullptr; 43 MyDeepUserdata* deep_test = static_cast<MyDeepUserdata*>(o_);
47 } 44 delete deep_test;
48 }
49} 45}
50 46
51// ################################################################################################ 47// ################################################################################################
52 48
53[[nodiscard]] static int deep_set(lua_State* L) 49[[nodiscard]] static int deep_set(lua_State* L)
54{ 50{
55 MyDeepUserdata* self = static_cast<MyDeepUserdata*>(luaG_todeep(L, deep_test_id, 1)); 51 MyDeepUserdata* const self{ static_cast<MyDeepUserdata*>(g_MyDeepFactory.toDeep(L, 1)) };
56 lua_Integer i = lua_tointeger( L, 2); 52 lua_Integer i = lua_tointeger( L, 2);
57 self->val = i; 53 self->val = i;
58 return 0; 54 return 0;
@@ -60,10 +56,9 @@ struct MyDeepUserdata : public DeepPrelude // Deep userdata MUST start with a De
60 56
61// ################################################################################################ 57// ################################################################################################
62 58
63// won't actually do anything as deep userdata don't have uservalue slots
64[[nodiscard]] static int deep_setuv(lua_State* L) 59[[nodiscard]] static int deep_setuv(lua_State* L)
65{ 60{
66 MyDeepUserdata* self = static_cast<MyDeepUserdata*>(luaG_todeep(L, deep_test_id, 1)); 61 MyDeepUserdata* const self{ static_cast<MyDeepUserdata*>(g_MyDeepFactory.toDeep(L, 1)) };
67 int uv = (int) luaL_optinteger(L, 2, 1); 62 int uv = (int) luaL_optinteger(L, 2, 1);
68 lua_settop( L, 3); 63 lua_settop( L, 3);
69 lua_pushboolean( L, lua_setiuservalue( L, 1, uv) != 0); 64 lua_pushboolean( L, lua_setiuservalue( L, 1, uv) != 0);
@@ -75,7 +70,7 @@ struct MyDeepUserdata : public DeepPrelude // Deep userdata MUST start with a De
75// won't actually do anything as deep userdata don't have uservalue slots 70// won't actually do anything as deep userdata don't have uservalue slots
76[[nodiscard]] static int deep_getuv(lua_State* L) 71[[nodiscard]] static int deep_getuv(lua_State* L)
77{ 72{
78 MyDeepUserdata* self = static_cast<MyDeepUserdata*>(luaG_todeep(L, deep_test_id, 1)); 73 MyDeepUserdata* const self{ static_cast<MyDeepUserdata*>(g_MyDeepFactory.toDeep(L, 1)) };
79 int uv = (int) luaL_optinteger(L, 2, 1); 74 int uv = (int) luaL_optinteger(L, 2, 1);
80 lua_getiuservalue( L, 1, uv); 75 lua_getiuservalue( L, 1, uv);
81 return 1; 76 return 1;
@@ -85,7 +80,7 @@ struct MyDeepUserdata : public DeepPrelude // Deep userdata MUST start with a De
85 80
86[[nodiscard]] static int deep_tostring(lua_State* L) 81[[nodiscard]] static int deep_tostring(lua_State* L)
87{ 82{
88 MyDeepUserdata* self = static_cast<MyDeepUserdata*>(luaG_todeep(L, deep_test_id, 1)); 83 MyDeepUserdata* const self{ static_cast<MyDeepUserdata*>(g_MyDeepFactory.toDeep(L, 1)) };
89 lua_pushfstring(L, "%p:deep(%d)", lua_topointer(L, 1), self->val); 84 lua_pushfstring(L, "%p:deep(%d)", lua_topointer(L, 1), self->val);
90 return 1; 85 return 1;
91} 86}
@@ -94,7 +89,7 @@ struct MyDeepUserdata : public DeepPrelude // Deep userdata MUST start with a De
94 89
95[[nodiscard]] static int deep_gc(lua_State* L) 90[[nodiscard]] static int deep_gc(lua_State* L)
96{ 91{
97 MyDeepUserdata* self = static_cast<MyDeepUserdata*>(luaG_todeep(L, deep_test_id, 1)); 92 MyDeepUserdata* const self{ static_cast<MyDeepUserdata*>(g_MyDeepFactory.toDeep(L, 1)) };
98 return 0; 93 return 0;
99} 94}
100 95
@@ -115,9 +110,8 @@ static luaL_Reg const deep_mt[] =
115int luaD_new_deep( lua_State* L) 110int luaD_new_deep( lua_State* L)
116{ 111{
117 int const nuv{ static_cast<int>(luaL_optinteger(L, 1, 0)) }; 112 int const nuv{ static_cast<int>(luaL_optinteger(L, 1, 0)) };
118 // no additional parameter to luaG_newdeepuserdata!
119 lua_settop(L, 0); 113 lua_settop(L, 0);
120 return luaG_newdeepuserdata(Dest{ L }, deep_test_id, nuv); 114 return g_MyDeepFactory.pushDeepUserdata(Dest{ L }, nuv);
121} 115}
122 116
123// ################################################################################################ 117// ################################################################################################