no uint with msvc
[lqt.git] / common / lqt_qt.cpp
blob910c79668d96179b06970ba4ba0fb983774f0534
1 #include "lqt_qt.hpp"
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*");
12 lua_pop(L, 1);
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)) {
21 lua_pop(L, 3); // (0)
22 lua_settop(L, oldtop); // (0)
23 QMetaObject::activate(self, self->metaObject(), index, args);
24 } else {
25 callindex = call_helper->metaObject()->indexOfSlot(lua_tostring(L, -1));
26 lua_pop(L, 2); // (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";
34 return -1;
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"
47 " --initialize\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"
62 " end\n"
63 " local name, args = string.match(signature, '^(.*)(%b())$')\n"
64 " local arg_list = ''\n"
65 " if args=='()' then\n"
66 " arg_list=''\n"
67 " else\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"
72 " end\n"
73 " end\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"
81 " if func then\n"
82 " data:insert(0x0a)\n"
83 " slots:insert(func)\n"
84 " sigs:insert('__slot'..signature:match'%b()')\n"
85 " else\n"
86 " data:insert(0x05)\n"
87 " slots:insert(false)\n"
88 " sigs:insert(false)\n"
89 " end\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"
95 "end\n";
97 void lqtL_pushaddmethod (lua_State *L) {
98 luaL_dostring(L, add_method_func);