summaryrefslogtreecommitdiff
path: root/upb/bindings
diff options
context:
space:
mode:
authorJoshua Haberman <jhaberman@gmail.com>2019-01-14 10:56:58 -0800
committerJoshua Haberman <jhaberman@gmail.com>2019-01-14 10:56:58 -0800
commitcb26d883d1290ed258e5594454c2ffe0526b13f9 (patch)
tree8ca8c172333c159d8bf6c4e315376cdfb2f66882 /upb/bindings
parenta9c375f8ea81e52d832653c963da72033c9a98be (diff)
WIP.
Diffstat (limited to 'upb/bindings')
-rw-r--r--upb/bindings/lua/def.c9
-rw-r--r--upb/bindings/lua/msg.c13
-rw-r--r--upb/bindings/lua/upb/pb.c8
3 files changed, 17 insertions, 13 deletions
diff --git a/upb/bindings/lua/def.c b/upb/bindings/lua/def.c
index 76510be..c38b6d1 100644
--- a/upb/bindings/lua/def.c
+++ b/upb/bindings/lua/def.c
@@ -15,13 +15,14 @@
#define LUPB_SYMTAB "lupb.symtab"
#define LUPB_OBJCACHE "lupb.objcache"
-#define CHK(pred) do { \
- upb_status status = UPB_STATUS_INIT; \
- pred; \
+#define CHK(pred) \
+ do { \
+ upb_status status; \
+ upb_status_clear(&status); \
+ pred; \
lupb_checkstatus(L, &status); \
} while (0)
-
/* lupb_wrapper ***************************************************************/
/* Wrappers around upb objects. */
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;
}
diff --git a/upb/bindings/lua/upb/pb.c b/upb/bindings/lua/upb/pb.c
index bca2ee8..2edefe0 100644
--- a/upb/bindings/lua/upb/pb.c
+++ b/upb/bindings/lua/upb/pb.c
@@ -27,17 +27,15 @@ static int lupb_pb_decode(lua_State *L) {
static int lupb_pb_encode(lua_State *L) {
const upb_msglayout *layout;
const upb_msg *msg = lupb_msg_checkmsg2(L, 1, &layout);
- upb_arena arena;
+ upb_arena *arena = upb_arena_new();
size_t size;
char *result;
- upb_arena_init(&arena);
-
- result = upb_encode(msg, (const void*)layout, &arena, &size);
+ result = upb_encode(msg, (const void*)layout, arena, &size);
/* Free resources before we potentially bail on error. */
lua_pushlstring(L, result, size);
- upb_arena_uninit(&arena);
+ upb_arena_free(arena);
/* TODO(haberman): check for error. */
return 1;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback