Skip to content

Commit 0ab8d5e

Browse files
committed
Merge pull request protocolbuffers#9 from cfallin/map-fields
Added msgdef flag to indicate map_entry protos.
2 parents efffb86 + 3bd667e commit 0ab8d5e

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

tests/test_def.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,20 @@ static void test_partial_freeze() {
328328
upb_msgdef_unref(m3, &m3);
329329
}
330330

331+
static void test_descriptor_flags() {
332+
upb_msgdef *m = upb_msgdef_new(&m);
333+
ASSERT(upb_msgdef_mapentry(m) == false);
334+
upb_status s = UPB_STATUS_INIT;
335+
upb_msgdef_setfullname(m, "TestMessage", &s);
336+
ASSERT(upb_ok(&s));
337+
upb_msgdef_setmapentry(m, true);
338+
ASSERT(upb_msgdef_mapentry(m) == true);
339+
upb_msgdef *m2 = upb_msgdef_dup(m, &m2);
340+
ASSERT(upb_msgdef_mapentry(m2) == true);
341+
upb_msgdef_unref(m, &m);
342+
upb_msgdef_unref(m2, &m2);
343+
}
344+
331345
int run_tests(int argc, char *argv[]) {
332346
if (argc < 2) {
333347
fprintf(stderr, "Usage: test_def <test.proto.pb>\n");
@@ -343,5 +357,6 @@ int run_tests(int argc, char *argv[]) {
343357
test_freeze_free();
344358
test_partial_freeze();
345359
test_noreftracking();
360+
test_descriptor_flags();
346361
return 0;
347362
}

upb/def.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,6 +1270,7 @@ upb_msgdef *upb_msgdef_new(const void *owner) {
12701270
if (!upb_def_init(UPB_UPCAST(m), UPB_DEF_MSG, &vtbl, owner)) goto err2;
12711271
if (!upb_inttable_init(&m->itof, UPB_CTYPE_PTR)) goto err2;
12721272
if (!upb_strtable_init(&m->ntof, UPB_CTYPE_PTR)) goto err1;
1273+
m->map_entry = false;
12731274
return m;
12741275

12751276
err1:
@@ -1284,6 +1285,7 @@ upb_msgdef *upb_msgdef_dup(const upb_msgdef *m, const void *owner) {
12841285
if (!newm) return NULL;
12851286
bool ok = upb_def_setfullname(UPB_UPCAST(newm),
12861287
upb_def_fullname(UPB_UPCAST(m)), NULL);
1288+
newm->map_entry = m->map_entry;
12871289
UPB_ASSERT_VAR(ok, ok);
12881290
upb_msg_iter i;
12891291
for(upb_msg_begin(&i, m); !upb_msg_done(&i); upb_msg_next(&i)) {
@@ -1387,6 +1389,15 @@ int upb_msgdef_numfields(const upb_msgdef *m) {
13871389
return upb_strtable_count(&m->ntof);
13881390
}
13891391

1392+
void upb_msgdef_setmapentry(upb_msgdef *m, bool map_entry) {
1393+
assert(!upb_msgdef_isfrozen(m));
1394+
m->map_entry = map_entry;
1395+
}
1396+
1397+
bool upb_msgdef_mapentry(const upb_msgdef *m) {
1398+
return m->map_entry;
1399+
}
1400+
13901401
void upb_msg_begin(upb_msg_iter *iter, const upb_msgdef *m) {
13911402
upb_inttable_begin(iter, &m->itof);
13921403
}

upb/def.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,10 @@ UPB_DEFINE_DEF(upb::MessageDef, msgdef, MSG, UPB_QUOTE(
712712
// just be moved into symtab.c?
713713
MessageDef* Dup(const void* owner) const;
714714

715+
// Is this message a map entry?
716+
void setmapentry(bool map_entry);
717+
bool mapentry() const;
718+
715719
// Iteration over fields. The order is undefined.
716720
class iterator : public std::iterator<std::forward_iterator_tag, FieldDef*> {
717721
public:
@@ -758,14 +762,19 @@ UPB_DEFINE_STRUCT(upb_msgdef, upb_def,
758762
upb_inttable itof; // int to field
759763
upb_strtable ntof; // name to field
760764

765+
// Is this a map-entry message?
766+
// TODO: set this flag properly for static descriptors; regenerate
767+
// descriptor.upb.c.
768+
bool map_entry;
769+
761770
// TODO(haberman): proper extension ranges (there can be multiple).
762771
));
763772

764773
#define UPB_MSGDEF_INIT(name, selector_count, submsg_field_count, itof, ntof, \
765774
refs, ref2s) \
766775
{ \
767776
UPB_DEF_INIT(name, UPB_DEF_MSG, refs, ref2s), selector_count, \
768-
submsg_field_count, itof, ntof \
777+
submsg_field_count, itof, ntof, false \
769778
}
770779

771780
UPB_BEGIN_EXTERN_C // {
@@ -813,6 +822,9 @@ UPB_INLINE upb_fielddef *upb_msgdef_ntof_mutable(upb_msgdef *m,
813822
return (upb_fielddef *)upb_msgdef_ntof(m, name, len);
814823
}
815824

825+
void upb_msgdef_setmapentry(upb_msgdef *m, bool map_entry);
826+
bool upb_msgdef_mapentry(const upb_msgdef *m);
827+
816828
// upb_msg_iter i;
817829
// for(upb_msg_begin(&i, m); !upb_msg_done(&i); upb_msg_next(&i)) {
818830
// upb_fielddef *f = upb_msg_iter_field(&i);
@@ -1266,6 +1278,12 @@ inline const FieldDef *MessageDef::FindFieldByName(const char *name,
12661278
inline MessageDef* MessageDef::Dup(const void *owner) const {
12671279
return upb_msgdef_dup(this, owner);
12681280
}
1281+
inline void MessageDef::setmapentry(bool map_entry) {
1282+
upb_msgdef_setmapentry(this, map_entry);
1283+
}
1284+
inline bool MessageDef::mapentry() const {
1285+
return upb_msgdef_mapentry(this);
1286+
}
12691287
inline MessageDef::iterator MessageDef::begin() { return iterator(this); }
12701288
inline MessageDef::iterator MessageDef::end() { return iterator::end(this); }
12711289
inline MessageDef::const_iterator MessageDef::begin() const {

0 commit comments

Comments
 (0)