summaryrefslogtreecommitdiff
path: root/upb
diff options
context:
space:
mode:
authorJoshua Haberman <jhaberman@gmail.com>2019-01-23 12:58:20 -0800
committerJoshua Haberman <jhaberman@gmail.com>2019-01-23 12:58:20 -0800
commit315c167bedbe33386e0bffd537d1f28eb259c986 (patch)
tree3539617796376e261a2ec6e619b18bc28a95cc4c /upb
parent04923fc26e1ca9f935fe10fb0de0fa932f7aa8b4 (diff)
Some more fixes for PHP.
Diffstat (limited to 'upb')
-rw-r--r--upb/def.c204
-rw-r--r--upb/def.h7
-rw-r--r--upb/pb/compile_decoder.c1
-rw-r--r--upb/upb.c6
4 files changed, 115 insertions, 103 deletions
diff --git a/upb/def.c b/upb/def.c
index f816c4f..38ef9fa 100644
--- a/upb/def.c
+++ b/upb/def.c
@@ -106,6 +106,12 @@ struct upb_filedef {
int ext_count;
};
+struct upb_symtab {
+ upb_arena *arena;
+ upb_strtable syms; /* full_name -> packed def ptr */
+ upb_strtable files; /* file_name -> upb_filedef* */
+};
+
/* Inside a symtab we store tagged pointers to specific def types. */
typedef enum {
UPB_DEFTYPE_MSG = 0,
@@ -124,12 +130,6 @@ static upb_value pack_def(const void *ptr, upb_deftype_t type) {
return upb_value_constptr((const void*)num);
}
-struct upb_symtab {
- upb_arena *arena;
- upb_strtable syms; /* full_name -> packed def ptr */
- upb_strtable files; /* file_name -> upb_filedef* */
-};
-
/* isalpha() etc. from <ctype.h> are locale-dependent, which we don't want. */
static bool upb_isbetween(char c, char low, char high) {
return c >= low && c <= high;
@@ -825,97 +825,6 @@ void upb_oneof_iter_setdone(upb_oneof_iter *iter) {
upb_inttable_iter_setdone(iter);
}
-/* upb_filedef ****************************************************************/
-
-const char *upb_filedef_name(const upb_filedef *f) {
- return f->name;
-}
-
-const char *upb_filedef_package(const upb_filedef *f) {
- return f->package;
-}
-
-const char *upb_filedef_phpprefix(const upb_filedef *f) {
- return f->phpprefix;
-}
-
-const char *upb_filedef_phpnamespace(const upb_filedef *f) {
- return f->phpnamespace;
-}
-
-upb_syntax_t upb_filedef_syntax(const upb_filedef *f) {
- return f->syntax;
-}
-
-int upb_filedef_msgcount(const upb_filedef *f) {
- return f->msg_count;
-}
-
-int upb_filedef_depcount(const upb_filedef *f) {
- return f->dep_count;
-}
-
-int upb_filedef_enumcount(const upb_filedef *f) {
- return f->enum_count;
-}
-
-const upb_filedef *upb_filedef_dep(const upb_filedef *f, int i) {
- return i < 0 || i >= f->dep_count ? NULL : f->deps[i];
-}
-
-const upb_msgdef *upb_filedef_msg(const upb_filedef *f, int i) {
- return i < 0 || i >= f->msg_count ? NULL : &f->msgs[i];
-}
-
-const upb_enumdef *upb_filedef_enum(const upb_filedef *f, int i) {
- return i < 0 || i >= f->enum_count ? NULL : &f->enums[i];
-}
-
-void upb_symtab_free(upb_symtab *s) {
- upb_arena_free(s->arena);
- upb_gfree(s);
-}
-
-upb_symtab *upb_symtab_new() {
- upb_symtab *s = upb_gmalloc(sizeof(*s));
- upb_alloc *alloc;
-
- if (!s) {
- return NULL;
- }
-
- s->arena = upb_arena_new();
- alloc = upb_arena_alloc(s->arena);
-
- if (!upb_strtable_init2(&s->syms, UPB_CTYPE_CONSTPTR, alloc) ||
- !upb_strtable_init2(&s->files, UPB_CTYPE_CONSTPTR, alloc)) {
- upb_arena_free(s->arena);
- upb_gfree(s);
- s = NULL;
- }
- return s;
-}
-
-const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym) {
- upb_value v;
- return upb_strtable_lookup(&s->syms, sym, &v) ?
- unpack_def(v, UPB_DEFTYPE_MSG) : NULL;
-}
-
-const upb_msgdef *upb_symtab_lookupmsg2(const upb_symtab *s, const char *sym,
- size_t len) {
- upb_value v;
- return upb_strtable_lookup2(&s->syms, sym, len, &v) ?
- unpack_def(v, UPB_DEFTYPE_MSG) : NULL;
-}
-
-const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym) {
- upb_value v;
- return upb_strtable_lookup(&s->syms, sym, &v) ?
- unpack_def(v, UPB_DEFTYPE_ENUM) : NULL;
-}
-
-
/* Code to build defs from descriptor protos. *********************************/
/* There is a question of how much validation to do here. It will be difficult
@@ -1593,8 +1502,9 @@ static bool build_filedef(
if (!upb_strtable_lookup2(&ctx->symtab->files, dep_name.data,
dep_name.size, &v)) {
upb_status_seterrf(ctx->status,
- "Depends on file '%s', but it has not been loaded",
- dep_name.data);
+ "Depends on file '" UPB_STRVIEW_FORMAT
+ "', but it has not been loaded",
+ UPB_STRVIEW_ARGS(dep_name));
return false;
}
file->deps[i] = upb_value_getconstptr(v);
@@ -1656,6 +1566,102 @@ static bool upb_symtab_addtotabs(upb_symtab *s, symtab_addctx *ctx,
return true;
}
+/* upb_filedef ****************************************************************/
+
+const char *upb_filedef_name(const upb_filedef *f) {
+ return f->name;
+}
+
+const char *upb_filedef_package(const upb_filedef *f) {
+ return f->package;
+}
+
+const char *upb_filedef_phpprefix(const upb_filedef *f) {
+ return f->phpprefix;
+}
+
+const char *upb_filedef_phpnamespace(const upb_filedef *f) {
+ return f->phpnamespace;
+}
+
+upb_syntax_t upb_filedef_syntax(const upb_filedef *f) {
+ return f->syntax;
+}
+
+int upb_filedef_msgcount(const upb_filedef *f) {
+ return f->msg_count;
+}
+
+int upb_filedef_depcount(const upb_filedef *f) {
+ return f->dep_count;
+}
+
+int upb_filedef_enumcount(const upb_filedef *f) {
+ return f->enum_count;
+}
+
+const upb_filedef *upb_filedef_dep(const upb_filedef *f, int i) {
+ return i < 0 || i >= f->dep_count ? NULL : f->deps[i];
+}
+
+const upb_msgdef *upb_filedef_msg(const upb_filedef *f, int i) {
+ return i < 0 || i >= f->msg_count ? NULL : &f->msgs[i];
+}
+
+const upb_enumdef *upb_filedef_enum(const upb_filedef *f, int i) {
+ return i < 0 || i >= f->enum_count ? NULL : &f->enums[i];
+}
+
+void upb_symtab_free(upb_symtab *s) {
+ upb_arena_free(s->arena);
+ upb_gfree(s);
+}
+
+upb_symtab *upb_symtab_new() {
+ upb_symtab *s = upb_gmalloc(sizeof(*s));
+ upb_alloc *alloc;
+
+ if (!s) {
+ return NULL;
+ }
+
+ s->arena = upb_arena_new();
+ alloc = upb_arena_alloc(s->arena);
+
+ if (!upb_strtable_init2(&s->syms, UPB_CTYPE_CONSTPTR, alloc) ||
+ !upb_strtable_init2(&s->files, UPB_CTYPE_CONSTPTR, alloc)) {
+ upb_arena_free(s->arena);
+ upb_gfree(s);
+ s = NULL;
+ }
+ return s;
+}
+
+const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym) {
+ upb_value v;
+ return upb_strtable_lookup(&s->syms, sym, &v) ?
+ unpack_def(v, UPB_DEFTYPE_MSG) : NULL;
+}
+
+const upb_msgdef *upb_symtab_lookupmsg2(const upb_symtab *s, const char *sym,
+ size_t len) {
+ upb_value v;
+ return upb_strtable_lookup2(&s->syms, sym, len, &v) ?
+ unpack_def(v, UPB_DEFTYPE_MSG) : NULL;
+}
+
+const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym) {
+ upb_value v;
+ return upb_strtable_lookup(&s->syms, sym, &v) ?
+ unpack_def(v, UPB_DEFTYPE_ENUM) : NULL;
+}
+
+const upb_filedef *upb_symtab_lookupfile(const upb_symtab *s, const char *name) {
+ upb_value v;
+ return upb_strtable_lookup(&s->files, name, &v) ? upb_value_getconstptr(v)
+ : NULL;
+}
+
const upb_filedef *upb_symtab_addfile(
upb_symtab *s, const google_protobuf_FileDescriptorProto *file_proto,
upb_status *status) {
diff --git a/upb/def.h b/upb/def.h
index 2c336c5..9a722f3 100644
--- a/upb/def.h
+++ b/upb/def.h
@@ -818,6 +818,7 @@ const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym);
const upb_msgdef *upb_symtab_lookupmsg2(
const upb_symtab *s, const char *sym, size_t len);
const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym);
+const upb_filedef *upb_symtab_lookupfile(const upb_symtab *s, const char *name);
int upb_symtab_filecount(const upb_symtab *s);
const upb_filedef *upb_symtab_addfile(
upb_symtab *s, const google_protobuf_FileDescriptorProto *file,
@@ -850,10 +851,14 @@ class upb::SymbolTable {
return MessageDefPtr(upb_symtab_lookupmsg(ptr_.get(), sym));
}
- const EnumDefPtr LookupEnum(const char *sym) const {
+ EnumDefPtr LookupEnum(const char *sym) const {
return EnumDefPtr(upb_symtab_lookupenum(ptr_.get(), sym));
}
+ FileDefPtr LookupFile(const char *name) const {
+ return FileDefPtr(upb_symtab_lookupfile(ptr_.get(), name));
+ }
+
/* TODO: iteration? */
/* Adds the given serialized FileDescriptorProto to the pool. */
diff --git a/upb/pb/compile_decoder.c b/upb/pb/compile_decoder.c
index 75cff48..89f000a 100644
--- a/upb/pb/compile_decoder.c
+++ b/upb/pb/compile_decoder.c
@@ -890,6 +890,7 @@ void upb_pbcodecache_free(upb_pbcodecache *c) {
}
upb_inttable_uninit(&c->groups);
+ upb_arena_free(c->arena);
upb_gfree(c);
}
diff --git a/upb/upb.c b/upb/upb.c
index d8d2723..9f80639 100644
--- a/upb/upb.c
+++ b/upb/upb.c
@@ -191,10 +191,8 @@ upb_arena *upb_arena_init(void *mem, size_t n, upb_alloc *alloc) {
}
}
- a = mem;
- mem = (char*)mem + sizeof(*a);
+ a = (void*)((char*)mem + n - sizeof(*a));
n -= sizeof(*a);
- upb_arena_addblock(a, mem, n, owned);
a->alloc.func = &upb_arena_doalloc;
a->block_alloc = &upb_alloc_global;
@@ -205,6 +203,8 @@ upb_arena *upb_arena_init(void *mem, size_t n, upb_alloc *alloc) {
a->block_head = NULL;
a->block_alloc = alloc;
+ upb_arena_addblock(a, mem, n, owned);
+
return a;
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback