4 int lqtL_qt_metacall (lua_State
*L
, QObject
*self
,
5 QMetaObject::Call call
, const char *name
,
6 int index
, void **args
) {
7 QObject
*call_helper
= (QObject
*)NULL
;
8 lua_getfield(L
, LUA_REGISTRYINDEX
, LQT_METACALLER
);
9 if (lua_isuserdata(L
, -1)) {
10 call_helper
= (QObject
*)lqtL_toudata(L
, -1, "QObject*");
13 if (call_helper
!=NULL
) {
14 int callindex
= 0, oldtop
= 0;
15 oldtop
= lua_gettop(L
);
16 lqtL_pushudata(L
, self
, name
); // (1)
17 lua_getfield(L
, -1, LQT_OBJSIGS
); // (2)
18 //qDebug() << lua_gettop(L) << luaL_typename(L, -1);
19 lua_rawgeti(L
, -1, index
+ 1); // (3)
20 if (!lua_isstring(L
, -1)) {
22 lua_settop(L
, oldtop
); // (0)
23 QMetaObject::activate(self
, self
->metaObject(), index
, args
);
25 callindex
= call_helper
->metaObject()->indexOfSlot(lua_tostring(L
, -1));
27 lua_getfield(L
, -1, LQT_OBJSLOTS
); // (2)
28 lua_rawgeti(L
, -1, index
+1); // (3)
29 lua_remove(L
, -2); // (2)
30 index
= call_helper
->qt_metacall(call
, callindex
, args
);
33 //qDebug() << "no call_helper found";
38 const char add_method_func
[] =
39 "return function(qobj, signature, func)\n"
40 " local qname = 'LuaObject('..tostring(qobj)..')'\n"
41 " local stringdata = qobj['"LQT_OBJMETASTRING
"']\n"
42 " local data = qobj['"LQT_OBJMETADATA
"']\n"
43 " local slots = qobj['"LQT_OBJSLOTS
"']\n"
44 " local sigs = qobj['"LQT_OBJSIGS
"']\n"
45 " if stringdata==nil then\n"
46 " --print'adding a slot!'\n"
48 " stringdata = qname..'\\0'\n"
49 " data = setmetatable({}, {__index=table})\n"
50 " data:insert(1) -- revision\n"
51 " data:insert(0) -- class name\n"
52 " data:insert(0) -- class info (1)\n"
53 " data:insert(0) -- class info (2)\n"
54 " data:insert(0) -- number of methods\n"
55 " data:insert(10) -- beginning of methods\n"
56 " data:insert(0) -- number of properties\n"
57 " data:insert(0) -- beginning of properties\n"
58 " data:insert(0) -- number of enums/sets\n"
59 " data:insert(0) -- beginning of enums/sets\n"
60 " slots = setmetatable({}, {__index=table})\n"
61 " sigs = setmetatable({}, {__index=table})\n"
63 " local name, args = string.match(signature, '^(.*)(%b())$')\n"
64 " local arg_list = ''\n"
65 " if args=='()' then\n"
68 " local argnum = select(2, string.gsub(args, '.+,', ','))+1\n"
69 " for i = 1, argnum do\n"
70 " if i>1 then arg_list=arg_list..', ' end\n"
71 " arg_list = arg_list .. 'arg' .. i\n"
74 " --print(arg_list, signature)\n"
75 " local sig, params = #stringdata + #arg_list + 1, #stringdata -- , ty, tag, flags\n"
76 " stringdata = stringdata .. arg_list .. '\\0' .. signature .. '\\0'\n"
77 " data:insert(sig) -- print(sig, string.byte(stringdata, sig, sig+4), string.char(string.byte(stringdata, sig+1, sig+6)))\n"
78 " data:insert(params) -- print(params, string.char(string.byte(stringdata, params+1, params+10)))\n"
79 " data:insert(#stringdata-1) -- print(#stringdata-1, (string.byte(stringdata, #stringdata)))\n"
80 " data:insert(#stringdata-1) -- print(#stringdata-1, (string.byte(stringdata, #stringdata)))\n"
82 " data:insert(0x0a)\n"
83 " slots:insert(func)\n"
84 " sigs:insert('__slot'..signature:match'%b()')\n"
86 " data:insert(0x05)\n"
87 " slots:insert(false)\n"
88 " sigs:insert(false)\n"
90 " data[5] = data[5] + 1\n"
91 " qobj['"LQT_OBJMETASTRING
"'] = stringdata\n"
92 " qobj['"LQT_OBJMETADATA
"'] = data\n"
93 " qobj['"LQT_OBJSLOTS
"'] = slots\n"
94 " qobj['"LQT_OBJSIGS
"'] = sigs\n"
97 void lqtL_pushaddmethod (lua_State
*L
) {
98 luaL_dostring(L
, add_method_func
);