summaryrefslogtreecommitdiff
path: root/upb/bindings/lua/msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'upb/bindings/lua/msg.c')
-rw-r--r--upb/bindings/lua/msg.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/upb/bindings/lua/msg.c b/upb/bindings/lua/msg.c
index e983f46..df5a143 100644
--- a/upb/bindings/lua/msg.c
+++ b/upb/bindings/lua/msg.c
@@ -100,16 +100,21 @@ static void *lupb_newuserdata(lua_State *L, size_t size, const char *type) {
* it is an internal memory management detail. Other objects refer to this
* object from their userdata to keep the arena-owned data alive. */
+typedef struct {
+ upb_arena *arena;
+} lupb_arena;
+
upb_arena *lupb_arena_check(lua_State *L, int narg) {
- return luaL_checkudata(L, narg, LUPB_ARENA);
+ lupb_arena *a = luaL_checkudata(L, narg, LUPB_ARENA);
+ return a ? a->arena : NULL;
}
int lupb_arena_new(lua_State *L) {
- upb_arena *a = lupb_newuserdata(L, sizeof(upb_arena), LUPB_ARENA);
+ lupb_arena *a = lupb_newuserdata(L, sizeof(lupb_arena), LUPB_ARENA);
/* TODO(haberman): use Lua alloc func as block allocator? Would need to
* verify that all cases of upb_malloc in msg/table are longjmp-safe. */
- upb_arena_init(a);
+ a->arena = upb_arena_new();
return 1;
}
@@ -140,7 +145,7 @@ static void lupb_arena_initsingleton(lua_State *L) {
static int lupb_arena_gc(lua_State *L) {
upb_arena *a = lupb_arena_check(L, 1);
- upb_arena_uninit(a);
+ upb_arena_free(a);
return 0;
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback