summaryrefslogtreecommitdiff
path: root/upb/symtab.c
diff options
context:
space:
mode:
authorJosh Haberman <haberman@google.com>2013-05-11 16:45:38 -0700
committerJosh Haberman <haberman@google.com>2013-05-11 16:45:38 -0700
commitcfdb9907cb87d15eaab72ceefbfa42fd7a4c3127 (patch)
tree63f5d70ad64daeeb4ffc777c2c3afd50e2e281b1 /upb/symtab.c
parent7d3e2bd2c4cfd1296d1d6f996d7548de26540d41 (diff)
Synced with 3 months of Google-internal development.
Major changes: - Got rid of all bytestream interfaces in favor of using regular handlers. - new Pipeline object represents a upb pipeline, does bump allocation internally to manage memory. - proto2 support now can handle extensions.
Diffstat (limited to 'upb/symtab.c')
-rw-r--r--upb/symtab.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/upb/symtab.c b/upb/symtab.c
index cd82bdd..2092787 100644
--- a/upb/symtab.c
+++ b/upb/symtab.c
@@ -10,8 +10,6 @@
#include <stdlib.h>
#include <string.h>
-#include "upb/bytestream.h"
-
bool upb_symtab_isfrozen(const upb_symtab *s) {
return upb_refcounted_isfrozen(upb_upcast(s));
}
@@ -77,16 +75,18 @@ const upb_def **upb_symtab_getdefs(const upb_symtab *s, upb_deftype_t type,
const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym,
const void *owner) {
- const upb_value *v = upb_strtable_lookup(&s->symtab, sym);
- upb_def *ret = v ? upb_value_getptr(*v) : NULL;
+ upb_value v;
+ upb_def *ret = upb_strtable_lookup(&s->symtab, sym, &v) ?
+ upb_value_getptr(v) : NULL;
if (ret) upb_def_ref(ret, owner);
return ret;
}
const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym,
const void *owner) {
- const upb_value *v = upb_strtable_lookup(&s->symtab, sym);
- upb_def *def = v ? upb_value_getptr(*v) : NULL;
+ upb_value v;
+ upb_def *def = upb_strtable_lookup(&s->symtab, sym, &v) ?
+ upb_value_getptr(v) : NULL;
upb_msgdef *ret = NULL;
if(def && def->type == UPB_DEF_MSG) {
ret = upb_downcast_msgdef_mutable(def);
@@ -103,8 +103,8 @@ static upb_def *upb_resolvename(const upb_strtable *t,
if(sym[0] == UPB_SYMBOL_SEPARATOR) {
// Symbols starting with '.' are absolute, so we do a single lookup.
// Slice to omit the leading '.'
- const upb_value *v = upb_strtable_lookup(t, sym + 1);
- return v ? upb_value_getptr(*v) : NULL;
+ upb_value v;
+ return upb_strtable_lookup(t, sym + 1, &v) ? upb_value_getptr(v) : NULL;
} else {
// Remove components from base until we find an entry or run out.
// TODO: This branch is totally broken, but currently not used.
@@ -134,8 +134,9 @@ static bool upb_resolve_dfs(const upb_def *def, upb_strtable *addtab,
upb_status *s) {
// Memoize results of this function for efficiency (since we're traversing a
// DAG this is not needed to limit the depth of the search).
- const upb_value *v = upb_inttable_lookup(seen, (uintptr_t)def);
- if (v) return upb_value_getbool(*v);
+ upb_value v;
+ if (upb_inttable_lookup(seen, (uintptr_t)def, &v))
+ return upb_value_getbool(v);
// Visit submessages for all messages in the SCC.
bool need_dup = false;
@@ -143,10 +144,10 @@ static bool upb_resolve_dfs(const upb_def *def, upb_strtable *addtab,
do {
assert(upb_def_isfrozen(def));
if (def->type == UPB_DEF_FIELD) continue;
- const upb_value *v = upb_strtable_lookup(addtab, upb_def_fullname(def));
- if (v) {
+ upb_value v;
+ if (upb_strtable_lookup(addtab, upb_def_fullname(def), &v)) {
// Because we memoize we should not visit a node after we have dup'd it.
- assert(((upb_def*)upb_value_getptr(*v))->came_from_user);
+ assert(((upb_def*)upb_value_getptr(v))->came_from_user);
need_dup = true;
}
const upb_msgdef *m = upb_dyncast_msgdef(def);
@@ -169,7 +170,7 @@ static bool upb_resolve_dfs(const upb_def *def, upb_strtable *addtab,
do {
if (def->type == UPB_DEF_FIELD) continue;
const char *name = upb_def_fullname(def);
- if (upb_strtable_lookup(addtab, name) == NULL) {
+ if (!upb_strtable_lookup(addtab, name, NULL)) {
upb_def *newdef = upb_def_dup(def, new_owner);
if (!newdef) goto oom;
newdef->came_from_user = false;
@@ -210,7 +211,7 @@ bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, int n, void *ref_donor,
status, "Anonymous defs cannot be added to a symtab");
goto err;
}
- if (upb_strtable_lookup(&addtab, fullname) != NULL) {
+ if (upb_strtable_lookup(&addtab, fullname, NULL)) {
upb_status_seterrf(status, "Conflicting defs named '%s'", fullname);
goto err;
}
@@ -263,10 +264,8 @@ bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, int n, void *ref_donor,
}
if (!upb_fielddef_resolvedefault(f)) {
- upb_byteregion *r = upb_value_getbyteregion(upb_fielddef_default(f));
- size_t len;
- const char *ptr = upb_byteregion_getptr(r, 0, &len);
- upb_status_seterrf(status, "couldn't resolve enum default '%s'", ptr);
+ upb_status_seterrf(status, "couldn't resolve enum default '%s'",
+ upb_fielddef_defaultstr(f, NULL));
goto err;
}
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback