use separate slot implementation for each module
[lqt.git] / common / lqt_qt.cpp
blobc5938a5a9fc08869406b19370cd1cf72bccc53da
1 #include "lqt_qt.hpp"
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)) {
14 lua_pop(L, 3); // (0)
15 lua_settop(L, oldtop); // (0)
16 QMetaObject::activate(self, self->metaObject(), index, args);
17 } else {
18 callindex = acceptor->metaObject()->indexOfSlot(lua_tostring(L, -1));
19 // qDebug() << "Found slot" << name << lua_tostring(L,-1) << "on" << acceptor->objectName() << "with index" << callindex;
20 lua_pop(L, 2); // (1)
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);
26 return -1;
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"
39 " --initialize\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"
54 " end\n"
55 " local name, args = string.match(signature, '^(.*)(%b())$')\n"
56 " local arg_list = ''\n"
57 " if args=='()' then\n"
58 " arg_list=''\n"
59 " else\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"
64 " end\n"
65 " end\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"
73 " if func then\n"
74 " data:insert(0x0a)\n"
75 " slots:insert(func)\n"
76 " sigs:insert('__slot'..signature:match'%b()')\n"
77 " else\n"
78 " data:insert(0x05)\n"
79 " slots:insert(false)\n"
80 " sigs:insert(false)\n"
81 " end\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"
87 "end\n";
89 void lqtL_pushaddmethod (lua_State *L) {
90 luaL_dostring(L, add_method_func);