diff options
author | Joshua Haberman <jhaberman@gmail.com> | 2015-10-21 16:53:36 -0700 |
---|---|---|
committer | Joshua Haberman <jhaberman@gmail.com> | 2015-10-21 16:53:36 -0700 |
commit | a1c8f7ce7cd367696281a16ee54844b19e125328 (patch) | |
tree | 098a899c808717b2bc1260b2793f4027ec29cda7 /upb/def.c | |
parent | 77d45edfb39171aef5e0ae09a471e5d8e2679a7f (diff) | |
parent | c1bc256d4e57863d8e4d1f30b8e5ca2bb0e61896 (diff) |
Merge pull request #43 from haberman/presenceflag
Add flag to MessageDef for whether fields have presence.
Diffstat (limited to 'upb/def.c')
-rw-r--r-- | upb/def.c | 17 |
1 files changed, 17 insertions, 0 deletions
@@ -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) ? |