4 int lqtL_qt_metacall (lua_State
*L
, QObject
*self
, QObject
*acceptor
,
5 QMetaObject::Call call
, const char *name
,
6 int index
, void **args
) {
7 int callindex
= 0, oldtop
= 0;
8 oldtop
= lua_gettop(L
);
9 lqtL_pushudata(L
, self
, name
); // (1)
10 lua_getfield(L
, -1, LQT_OBJSIGS
); // (2)
11 //qDebug() << lua_gettop(L) << luaL_typename(L, -1);
12 lua_rawgeti(L
, -1, index
+ 1); // (3)
13 if (!lua_isstring(L
, -1)) {
15 lua_settop(L
, oldtop
); // (0)
16 QMetaObject::activate(self
, self
->metaObject(), index
, args
);
18 callindex
= acceptor
->metaObject()->indexOfSlot(lua_tostring(L
, -1));
19 // qDebug() << "Found slot" << name << lua_tostring(L,-1) << "on" << acceptor->objectName() << "with index" << callindex;
21 lua_getfield(L
, -1, LQT_OBJSLOTS
); // (2)
22 lua_rawgeti(L
, -1, index
+1); // (3)
23 lua_remove(L
, -2); // (2)
24 index
= acceptor
->qt_metacall(call
, callindex
, args
);
30 const char add_method_func
[] =
31 "return function(qobj, signature, func)\n"
32 " local qname = 'LuaObject('..tostring(qobj)..')'\n"
33 " local stringdata = qobj['"LQT_OBJMETASTRING
"']\n"
34 " local data = qobj['"LQT_OBJMETADATA
"']\n"
35 " local slots = qobj['"LQT_OBJSLOTS
"']\n"
36 " local sigs = qobj['"LQT_OBJSIGS
"']\n"
37 " if stringdata==nil then\n"
38 " --print'adding a slot!'\n"
40 " stringdata = qname..'\\0'\n"
41 " data = setmetatable({}, {__index=table})\n"
42 " data:insert(1) -- revision\n"
43 " data:insert(0) -- class name\n"
44 " data:insert(0) -- class info (1)\n"
45 " data:insert(0) -- class info (2)\n"
46 " data:insert(0) -- number of methods\n"
47 " data:insert(10) -- beginning of methods\n"
48 " data:insert(0) -- number of properties\n"
49 " data:insert(0) -- beginning of properties\n"
50 " data:insert(0) -- number of enums/sets\n"
51 " data:insert(0) -- beginning of enums/sets\n"
52 " slots = setmetatable({}, {__index=table})\n"
53 " sigs = setmetatable({}, {__index=table})\n"
55 " local name, args = string.match(signature, '^(.*)(%b())$')\n"
56 " local arg_list = ''\n"
57 " if args=='()' then\n"
60 " local argnum = select(2, string.gsub(args, '.+,', ','))+1\n"
61 " for i = 1, argnum do\n"
62 " if i>1 then arg_list=arg_list..', ' end\n"
63 " arg_list = arg_list .. 'arg' .. i\n"
66 " --print(arg_list, signature)\n"
67 " local sig, params = #stringdata + #arg_list + 1, #stringdata -- , ty, tag, flags\n"
68 " stringdata = stringdata .. arg_list .. '\\0' .. signature .. '\\0'\n"
69 " data:insert(sig) -- print(sig, string.byte(stringdata, sig, sig+4), string.char(string.byte(stringdata, sig+1, sig+6)))\n"
70 " data:insert(params) -- print(params, string.char(string.byte(stringdata, params+1, params+10)))\n"
71 " data:insert(#stringdata-1) -- print(#stringdata-1, (string.byte(stringdata, #stringdata)))\n"
72 " data:insert(#stringdata-1) -- print(#stringdata-1, (string.byte(stringdata, #stringdata)))\n"
74 " data:insert(0x0a)\n"
75 " slots:insert(func)\n"
76 " sigs:insert('__slot'..signature:match'%b()')\n"
78 " data:insert(0x05)\n"
79 " slots:insert(false)\n"
80 " sigs:insert(false)\n"
82 " data[5] = data[5] + 1\n"
83 " qobj['"LQT_OBJMETASTRING
"'] = stringdata\n"
84 " qobj['"LQT_OBJMETADATA
"'] = data\n"
85 " qobj['"LQT_OBJSLOTS
"'] = slots\n"
86 " qobj['"LQT_OBJSIGS
"'] = sigs\n"
89 void lqtL_pushaddmethod (lua_State
*L
) {
90 luaL_dostring(L
, add_method_func
);