summaryrefslogtreecommitdiff
path: root/upb/bindings
diff options
context:
space:
mode:
authorJoshua Haberman <jhaberman@gmail.com>2017-07-04 17:02:48 -0700
committerJoshua Haberman <jhaberman@gmail.com>2017-07-04 17:02:48 -0700
commit9cb10577fcefa3ed004e0bbdc61e6238e8137e3c (patch)
treee270ff7b0f782dadf2942f6816b071aa2a134e21 /upb/bindings
parent76fcdd2ee92e8f7852f96ccd49fe776236ae4e60 (diff)
First version of a real C codegen for upb.
Also includes an implementation of the conformance tests to display what the API usage will be like. There is still a lot to do, and things that are broken (oneofs, repeated fields, etc), but it's a good start.
Diffstat (limited to 'upb/bindings')
-rw-r--r--upb/bindings/lua/def.c78
-rw-r--r--upb/bindings/lua/msg.c4
2 files changed, 80 insertions, 2 deletions
diff --git a/upb/bindings/lua/def.c b/upb/bindings/lua/def.c
index 5133831..194acc3 100644
--- a/upb/bindings/lua/def.c
+++ b/upb/bindings/lua/def.c
@@ -211,6 +211,7 @@ bool lupb_def_pushwrapper(lua_State *L, const upb_def *def,
type = LUPB_ENUMDEF;
break;
default:
+ printf("Def type: %d\n", (int)upb_def_type(def));
UPB_UNREACHABLE();
}
@@ -231,6 +232,15 @@ static int lupb_def_type(lua_State *L) {
return 1;
}
+void lupb_filedef_pushwrapper(lua_State *L, const upb_filedef *f,
+ const void *ref_donor);
+
+static int lupb_def_file(lua_State *L) {
+ const upb_def *def = lupb_def_check(L, 1);
+ lupb_filedef_pushwrapper(L, upb_def_file(def), NULL);
+ return 1;
+}
+
static int lupb_def_freeze(lua_State *L) {
upb_def *def = lupb_def_checkmutable(L, 1);
CHK(upb_def_freeze(&def, 1, &status));
@@ -263,6 +273,7 @@ static int lupb_def_setfullname(lua_State *L) {
#define LUPB_COMMON_DEF_METHODS \
{"def_type", lupb_def_type}, \
+ {"file", lupb_def_file}, \
{"full_name", lupb_def_fullname}, \
{"freeze", lupb_def_freeze}, \
{"is_frozen", lupb_def_isfrozen}, \
@@ -296,6 +307,15 @@ static int lupb_fielddef_new(lua_State *L) {
/* Getters */
+void lupb_oneofdef_pushwrapper(lua_State *L, const upb_oneofdef *o,
+ const void *ref_donor);
+
+static int lupb_fielddef_containingoneof(lua_State *L) {
+ const upb_fielddef *f = lupb_fielddef_check(L, 1);
+ lupb_oneofdef_pushwrapper(L, upb_fielddef_containingoneof(f), NULL);
+ return 1;
+}
+
static int lupb_fielddef_containingtype(lua_State *L) {
const upb_fielddef *f = lupb_fielddef_check(L, 1);
lupb_msgdef_pushwrapper(L, upb_fielddef_containingtype(f), NULL);
@@ -349,6 +369,12 @@ static int lupb_fielddef_default(lua_State *L) {
return 1;
}
+static int lupb_fielddef_descriptortype(lua_State *L) {
+ const upb_fielddef *f = lupb_fielddef_check(L, 1);
+ lua_pushnumber(L, upb_fielddef_descriptortype(f));
+ return 1;
+}
+
static int lupb_fielddef_getsel(lua_State *L) {
const upb_fielddef *f = lupb_fielddef_check(L, 1);
upb_selector_t sel;
@@ -593,9 +619,11 @@ static const struct luaL_Reg lupb_fielddef_mm[] = {
static const struct luaL_Reg lupb_fielddef_m[] = {
LUPB_COMMON_DEF_METHODS
+ {"containing_oneof", lupb_fielddef_containingoneof},
{"containing_type", lupb_fielddef_containingtype},
{"containing_type_name", lupb_fielddef_containingtypename},
{"default", lupb_fielddef_default},
+ {"descriptor_type", lupb_fielddef_descriptortype},
{"getsel", lupb_fielddef_getsel},
{"has_subdef", lupb_fielddef_hassubdef},
{"index", lupb_fielddef_index},
@@ -681,6 +709,24 @@ static int lupb_oneofdef_field(lua_State *L) {
return 1;
}
+static int lupb_oneofiter_next(lua_State *L) {
+ upb_oneof_iter *i = lua_touserdata(L, lua_upvalueindex(1));
+ if (upb_oneof_done(i)) return 0;
+ lupb_fielddef_pushwrapper(L, upb_oneof_iter_field(i), NULL);
+ upb_oneof_next(i);
+ return 1;
+}
+
+static int lupb_oneofdef_fields(lua_State *L) {
+ const upb_oneofdef *o = lupb_oneofdef_check(L, 1);
+ upb_oneof_iter *i = lua_newuserdata(L, sizeof(upb_oneof_iter));
+ upb_oneof_begin(i, o);
+ /* Need to guarantee that the msgdef outlives the iter. */
+ lua_pushvalue(L, 1);
+ lua_pushcclosure(L, &lupb_oneofiter_next, 2);
+ return 1;
+}
+
static int lupb_oneofdef_len(lua_State *L) {
const upb_oneofdef *o = lupb_oneofdef_check(L, 1);
lua_pushinteger(L, upb_oneofdef_numfields(o));
@@ -711,6 +757,7 @@ static int lupb_oneofdef_setname(lua_State *L) {
static const struct luaL_Reg lupb_oneofdef_m[] = {
{"containing_type", lupb_oneofdef_containingtype},
{"field", lupb_oneofdef_field},
+ {"fields", lupb_oneofdef_fields},
{"name", lupb_oneofdef_name},
{"add", lupb_oneofdef_add},
@@ -1008,6 +1055,29 @@ static int lupb_filedef_def(lua_State *L) {
return 1;
}
+static int lupb_filedefdepiter_next(lua_State *L) {
+ const upb_filedef *f = lupb_filedef_check(L, lua_upvalueindex(1));
+ size_t i = lua_tointeger(L, lua_upvalueindex(2));
+
+ if (i >= upb_filedef_depcount(f)) {
+ return 0;
+ }
+
+ lupb_filedef_pushwrapper(L, upb_filedef_dep(f, i), NULL);
+ lua_pushinteger(L, i + 1);
+ lua_replace(L, lua_upvalueindex(2));
+ return 1;
+}
+
+
+static int lupb_filedef_dependencies(lua_State *L) {
+ lupb_filedef_check(L, 1);
+ lua_pushvalue(L, 1);
+ lua_pushnumber(L, 0); /* Index, starts at zero. */
+ lua_pushcclosure(L, &lupb_filedefdepiter_next, 2);
+ return 1;
+}
+
static int lupb_filedef_name(lua_State *L) {
const upb_filedef *f = lupb_filedef_check(L, 1);
lua_pushstring(L, upb_filedef_name(f));
@@ -1020,6 +1090,12 @@ static int lupb_filedef_package(lua_State *L) {
return 1;
}
+static int lupb_filedef_syntax(lua_State *L) {
+ const upb_filedef *f = lupb_filedef_check(L, 1);
+ lua_pushnumber(L, upb_filedef_syntax(f));
+ return 1;
+}
+
static int lupb_filedef_len(lua_State *L) {
const upb_filedef *f = lupb_filedef_check(L, 1);
lua_pushinteger(L, upb_filedef_defcount(f));
@@ -1078,8 +1154,10 @@ static const struct luaL_Reg lupb_filedef_mm[] = {
static const struct luaL_Reg lupb_filedef_m[] = {
{"def", lupb_filedef_def},
{"defs", lupb_filedef_defs},
+ {"dependencies", lupb_filedef_dependencies},
{"name", lupb_filedef_name},
{"package", lupb_filedef_package},
+ {"syntax", lupb_filedef_syntax},
{"set_name", lupb_filedef_setname},
{"set_package", lupb_filedef_setpackage},
diff --git a/upb/bindings/lua/msg.c b/upb/bindings/lua/msg.c
index 41163bc..dc8420f 100644
--- a/upb/bindings/lua/msg.c
+++ b/upb/bindings/lua/msg.c
@@ -434,7 +434,7 @@ static upb_msgval lupb_tomsgval(lua_State *L, upb_fieldtype_t type, int narg,
case UPB_TYPE_BYTES: {
size_t len;
const char *ptr = lupb_checkstring(L, narg, &len);
- return upb_msgval_str(ptr, len);
+ return upb_msgval_str(upb_stringview_make(ptr, len));
}
case UPB_TYPE_MESSAGE:
UPB_ASSERT(lmsgclass);
@@ -1014,7 +1014,7 @@ static int lupb_msg_index(lua_State *L) {
if (upb_msg_has(lmsg->msg, field_index, l)) {
upb_msgval val = upb_msg_get(lmsg->msg, field_index, l);
lua_pop(L, 1);
- lua_pushlstring(L, val.str.ptr, val.str.len);
+ lua_pushlstring(L, val.str.data, val.str.size);
lupb_uservalseti(L, 1, lupb_fieldindex(f), -1);
}
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback