Some more fixes for PHP.

pull/13171/head
Joshua Haberman 6 years ago
parent 04923fc26e
commit 315c167bed
  1. 204
      upb/def.c
  2. 7
      upb/def.h
  3. 1
      upb/pb/compile_decoder.c
  4. 6
      upb/upb.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) {

@ -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. */

@ -890,6 +890,7 @@ void upb_pbcodecache_free(upb_pbcodecache *c) {
}
upb_inttable_uninit(&c->groups);
upb_arena_free(c->arena);
upb_gfree(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;
}

Loading…
Cancel
Save