const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym) { upb_rwlock_rdlock(&s->lock); upb_symtab_ent *e = upb_strtable_lookup(&s->symtab, sym); upb_msgdef *ret = NULL; if(e && e->def->type == UPB_DEF_MSG) { ret = upb_downcast_msgdef(e->def); upb_def_ref(UPB_UPCAST(ret)); } upb_rwlock_unlock(&s->lock); return ret; }
const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym) { upb_rwlock_rdlock(&s->lock); upb_symtab_ent *e = upb_strtable_lookup(&s->symtab, sym); upb_def *ret = NULL; if(e) { ret = e->def; upb_def_ref(ret); } upb_rwlock_unlock(&s->lock); return ret; }
const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base, const char *sym) { upb_rwlock_rdlock(&s->lock); upb_symtab_ent *e = upb_resolve(&s->symtab, base, sym); upb_def *ret = NULL; if(e) { ret = e->def; upb_def_ref(ret); } upb_rwlock_unlock(&s->lock); return ret; }
static void test_cycles() { bool ok; upb_symtab *s = load_test_proto(&s); const upb_msgdef *m; const upb_fielddef *f; const upb_def *def; const upb_def *def2; /* Test cycle detection by making a cyclic def's main refcount go to zero * and then be incremented to one again. */ def = upb_symtab_lookup(s, "A"); upb_def_ref(def, &def); ASSERT(def); ASSERT(upb_def_isfrozen(def)); upb_symtab_unref(s, &s); /* Message A has only one subfield: "optional B b = 1". */ m = upb_downcast_msgdef(def); f = upb_msgdef_itof(m, 1); ASSERT(f); ASSERT(upb_fielddef_hassubdef(f)); ASSERT(upb_msgdef_ntofz(m, "b") == f); ASSERT(upb_msgdef_ntof(m, "b", 1) == f); def2 = upb_fielddef_subdef(f); ASSERT(upb_downcast_msgdef(def2)); ok = strcmp(upb_def_fullname(def2), "B") == 0; ASSERT(ok); upb_def_ref(def2, &def2); upb_def_unref(def, &def); /* We know "def" is still alive because it's reachable from def2. */ ok = strcmp(upb_def_fullname(def), "A") == 0; ASSERT(ok); upb_def_unref(def2, &def2); }
void upb_msgdef_ref(const upb_msgdef *m, const void *owner) { upb_def_ref(upb_upcast(m), owner); }
void upb_fielddef_ref(const upb_fielddef *f, const void *owner) { upb_def_ref(upb_upcast(f), owner); }
void upb_enumdef_ref(const upb_enumdef *e, const void *owner) { upb_def_ref(upb_upcast(e), owner); }
void upb_fielddef_ref(const upb_fielddef *f, const void *owner) { upb_def_ref(UPB_UPCAST(f), owner); }
void upb_enumdef_ref(const upb_enumdef *e, const void *owner) { upb_def_ref(UPB_UPCAST(e), owner); }
void upb_msgdef_ref(const upb_msgdef *m, const void *owner) { upb_def_ref(UPB_UPCAST(m), owner); }