diff --git a/src/api/event.c b/src/api/event.c index 12ad12d0..7c292731 100644 --- a/src/api/event.c +++ b/src/api/event.c @@ -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; diff --git a/src/api/types/channel.c b/src/api/types/channel.c index 1d360dee..9d941663 100644 --- a/src/api/types/channel.c +++ b/src/api/types/channel.c @@ -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; diff --git a/src/event/event.c b/src/event/event.c index a41478d9..e0ccf5ae 100644 --- a/src/event/event.c +++ b/src/event/event.c @@ -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); diff --git a/src/event/event.h b/src/event/event.h index cd125056..98c25876 100644 --- a/src/event/event.h +++ b/src/event/event.h @@ -90,6 +90,8 @@ typedef struct { vec_event_t events; } EventState; +void lovrVariantDestroy(Variant* variant); + bool lovrEventInit(); void lovrEventDestroy(); void lovrEventAddPump(EventPump pump);