1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#include "luax_class.hpp"
#include "luax_runtime.h"
#include "luax_cfunctions.h"
namespace Luax
{
int LuaxPlainClass::registry(lua_State* L)
{
LUAX_STATE(L);
// params:
// 1: class name
cc8* type = state.GetValue<cc8*>(1, "");
lua_newtable(L); // class table
// GetClassName()
lua_pushstring(L, type);
lua_pushcclosure(L, luax_c_getupvalue, 1);
lua_setfield(L, -2, "GetClassName");
// New()
lua_pushvalue(L, -1); // class table
lua_pushcclosure(L, l_New, 1);
lua_setfield(L, -2, "New");
// Extend()
lua_pushvalue(L, -1); // class table
lua_setfield(L, -2, "__index");
return 1;
}
///
/// NewnԻȡCtorCtorʼʵ
///
int LuaxPlainClass::l_New(lua_State* L)
{
LUAX_STATE(L);
// upvalues:
// 1: class table
// params:
// n: params
int n = lua_gettop(L);
int classTable = lua_upvalueindex(1);
lua_newtable(L); // instance table
// instance metatable Ϊ class
lua_pushvalue(L, classTable);
lua_setmetatable(L, -2);
lua_getfield(L, classTable, "Ctor");
if (!lua_isnil(L, -1))
{
// stack:
// -1: Ctor()
// -2: instance
// -3~-n-2: params
lua_insert(L, -2 - n);
// stack:
// -1: instance
// -2~-n-1: params
// -n-2: Ctor()
lua_pushvalue(L, -1);
// stack:
// -1: instance
// -2: instance
// -3~-n-2: params
// -n-3: Ctor
lua_insert(L, -3 - n);
// stack:
// -1: instance
// -2~-n-1: params
// -n-2: Ctor()
// -n-3: instance
lua_insert(L, -1 - n);
// stack:
// -1~-n: params
// -n-1: instance
// -n-2: Ctor()
// -n-3: instance
lua_pcall(L, n + 1, 0, 0);
}
else
{
state.Pop();
}
return 1;
}
}
|