summaryrefslogtreecommitdiff
path: root/upb/def.c
diff options
context:
space:
mode:
authorJosh Haberman <jhaberman@gmail.com>2015-10-14 18:02:34 -0700
committerJosh Haberman <jhaberman@gmail.com>2015-10-14 18:02:34 -0700
commitbc53c1bc4621e172a20fb0966c7ee9342d9a8dda (patch)
tree37d3be5287e3078cfa35efc81634977236000c5a /upb/def.c
parent77d45edfb39171aef5e0ae09a471e5d8e2679a7f (diff)
Add flag to MessageDef for whether fields have presence.
Diffstat (limited to 'upb/def.c')
-rw-r--r--upb/def.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/upb/def.c b/upb/def.c
index 79e7562..000c7f4 100644
--- a/upb/def.c
+++ b/upb/def.c
@@ -1213,6 +1213,16 @@ bool upb_fielddef_ismap(const upb_fielddef *f) {
upb_msgdef_mapentry(upb_fielddef_msgsubdef(f));
}
+bool upb_fielddef_haspresence(const upb_fielddef *f) {
+ if (upb_fielddef_isseq(f)) return false;
+ if (upb_fielddef_issubmsg(f)) return true;
+
+ /* Primitive field: return true unless there is a message that specifies
+ * presence should not exist. */
+ if (f->msg_is_symbolic || !f->msg.def) return true;
+ return f->msg.def->primitives_have_presence;
+}
+
bool upb_fielddef_hassubdef(const upb_fielddef *f) {
return upb_fielddef_issubmsg(f) || upb_fielddef_type(f) == UPB_TYPE_ENUM;
}
@@ -1269,6 +1279,7 @@ upb_msgdef *upb_msgdef_new(const void *owner) {
if (!upb_strtable_init(&m->ntof, UPB_CTYPE_PTR)) goto err2;
if (!upb_strtable_init(&m->ntoo, UPB_CTYPE_PTR)) goto err1;
m->map_entry = false;
+ m->primitives_have_presence = true;
return m;
err1:
@@ -1291,6 +1302,7 @@ upb_msgdef *upb_msgdef_dup(const upb_msgdef *m, const void *owner) {
upb_def_fullname(upb_msgdef_upcast(m)),
NULL);
newm->map_entry = m->map_entry;
+ newm->primitives_have_presence = m->primitives_have_presence;
UPB_ASSERT_VAR(ok, ok);
for(upb_msg_field_begin(&i, m);
!upb_msg_field_done(&i);
@@ -1435,6 +1447,11 @@ bool upb_msgdef_addoneof(upb_msgdef *m, upb_oneofdef *o, const void *ref_donor,
return true;
}
+void upb_msgdef_setprimitiveshavepresence(upb_msgdef *m, bool have_presence) {
+ assert(!upb_msgdef_isfrozen(m));
+ m->primitives_have_presence = have_presence;
+}
+
const upb_fielddef *upb_msgdef_itof(const upb_msgdef *m, uint32_t i) {
upb_value val;
return upb_inttable_lookup32(&m->itof, i, &val) ?
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback