luaA_object_emit_signal: Fix a crash on non-objects
This was first fixed in79b1f5aba1
, but3fbb5f15
reintroduced the crash. The only "real" change in here is that there is now a "return;" after the warn("Trying...");. The rest is just re-indentation. Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
3b08f0d73a
commit
a8fa910586
|
@ -254,36 +254,36 @@ luaA_object_emit_signal(lua_State *L, int oud,
|
||||||
{
|
{
|
||||||
int oud_abs = luaA_absindex(L, oud);
|
int oud_abs = luaA_absindex(L, oud);
|
||||||
lua_object_t *obj = lua_touserdata(L, oud);
|
lua_object_t *obj = lua_touserdata(L, oud);
|
||||||
if(!obj)
|
if(!obj) {
|
||||||
warn("Trying to emit signal '%s' on non-object", name);
|
warn("Trying to emit signal '%s' on non-object", name);
|
||||||
else {
|
return;
|
||||||
signal_t *sigfound = signal_array_getbyid(&obj->signals,
|
|
||||||
a_strhash((const unsigned char *) name));
|
|
||||||
if(sigfound)
|
|
||||||
{
|
|
||||||
int nbfunc = sigfound->sigfuncs.len;
|
|
||||||
luaL_checkstack(L, lua_gettop(L) + nbfunc + nargs + 2, "too much signal");
|
|
||||||
/* Push all functions and then execute, because this list can change
|
|
||||||
* while executing funcs. */
|
|
||||||
foreach(func, sigfound->sigfuncs)
|
|
||||||
luaA_object_push_item(L, oud_abs, (void *) *func);
|
|
||||||
|
|
||||||
for(int i = 0; i < nbfunc; i++)
|
|
||||||
{
|
|
||||||
/* push object */
|
|
||||||
lua_pushvalue(L, oud_abs);
|
|
||||||
/* push all args */
|
|
||||||
for(int j = 0; j < nargs; j++)
|
|
||||||
lua_pushvalue(L, - nargs - nbfunc - 1 + i);
|
|
||||||
/* push first function */
|
|
||||||
lua_pushvalue(L, - nargs - nbfunc - 1 + i);
|
|
||||||
/* remove this first function */
|
|
||||||
lua_remove(L, - nargs - nbfunc - 2 + i);
|
|
||||||
luaA_dofunction(L, nargs + 1, 0);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
warn("Trying to emit unknown signal '%s'", name);
|
|
||||||
}
|
}
|
||||||
|
signal_t *sigfound = signal_array_getbyid(&obj->signals,
|
||||||
|
a_strhash((const unsigned char *) name));
|
||||||
|
if(sigfound)
|
||||||
|
{
|
||||||
|
int nbfunc = sigfound->sigfuncs.len;
|
||||||
|
luaL_checkstack(L, lua_gettop(L) + nbfunc + nargs + 2, "too much signal");
|
||||||
|
/* Push all functions and then execute, because this list can change
|
||||||
|
* while executing funcs. */
|
||||||
|
foreach(func, sigfound->sigfuncs)
|
||||||
|
luaA_object_push_item(L, oud_abs, (void *) *func);
|
||||||
|
|
||||||
|
for(int i = 0; i < nbfunc; i++)
|
||||||
|
{
|
||||||
|
/* push object */
|
||||||
|
lua_pushvalue(L, oud_abs);
|
||||||
|
/* push all args */
|
||||||
|
for(int j = 0; j < nargs; j++)
|
||||||
|
lua_pushvalue(L, - nargs - nbfunc - 1 + i);
|
||||||
|
/* push first function */
|
||||||
|
lua_pushvalue(L, - nargs - nbfunc - 1 + i);
|
||||||
|
/* remove this first function */
|
||||||
|
lua_remove(L, - nargs - nbfunc - 2 + i);
|
||||||
|
luaA_dofunction(L, nargs + 1, 0);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
warn("Trying to emit unknown signal '%s'", name);
|
||||||
|
|
||||||
/* Then emit signal on the class */
|
/* Then emit signal on the class */
|
||||||
lua_pushvalue(L, oud);
|
lua_pushvalue(L, oud);
|
||||||
|
|
Loading…
Reference in New Issue