Fix crash on repeated calls to Channel:peek;

This commit is contained in:
bjorn 2019-01-12 20:50:43 -08:00
parent 5382bc3379
commit aa56cbc7b0
4 changed files with 18 additions and 4 deletions

View File

@ -57,8 +57,8 @@ int luax_pushvariant(lua_State* L, Variant* variant) {
case TYPE_NIL: lua_pushnil(L); return 1;
case TYPE_BOOLEAN: lua_pushboolean(L, variant->value.boolean); return 1;
case TYPE_NUMBER: lua_pushnumber(L, variant->value.number); return 1;
case TYPE_STRING: lua_pushstring(L, variant->value.string); free(variant->value.string); return 1;
case TYPE_OBJECT: luax_pushobject(L, variant->value.ref); lovrRelease(variant->value.ref); return 1;
case TYPE_STRING: lua_pushstring(L, variant->value.string); return 1;
case TYPE_OBJECT: luax_pushobject(L, variant->value.ref); return 1;
}
}
@ -109,7 +109,9 @@ static int nextEvent(lua_State* L) {
case EVENT_CUSTOM:
for (int i = 0; i < event.data.custom.count; i++) {
luax_pushvariant(L, &event.data.custom.data[i]);
Variant* variant = &event.data.custom.data[i];
luax_pushvariant(L, variant);
lovrVariantDestroy(variant);
}
return event.data.custom.count + 1;

View File

@ -37,7 +37,9 @@ int l_lovrChannelPop(lua_State* L) {
Channel* channel = luax_checktype(L, 1, Channel);
luax_checktimeout(L, 2, &timeout);
if (lovrChannelPop(channel, &variant, timeout)) {
return luax_pushvariant(L, &variant);
luax_pushvariant(L, &variant);
lovrVariantDestroy(&variant);
return 1;
}
lua_pushnil(L);
return 1;

View File

@ -5,6 +5,14 @@
static EventState state;
void lovrVariantDestroy(Variant* variant) {
switch (variant->type) {
case TYPE_STRING: free(variant->value.string); return;
case TYPE_OBJECT: lovrRelease(variant->value.ref); return;
default: return;
}
}
bool lovrEventInit() {
if (state.initialized) return false;
vec_init(&state.pumps);

View File

@ -90,6 +90,8 @@ typedef struct {
vec_event_t events;
} EventState;
void lovrVariantDestroy(Variant* variant);
bool lovrEventInit();
void lovrEventDestroy();
void lovrEventAddPump(EventPump pump);