Changes to upb_def to stop using upb_msg.

pull/13171/head
Joshua Haberman 15 years ago
parent a8d3f8e543
commit cfe0ef08c1
  1. 109
      src/upb_def.c
  2. 7
      src/upb_def.h

@ -184,39 +184,39 @@ static void unresolveddef_free(struct _upb_unresolveddef *def) {
/* upb_fielddef ***************************************************************/ /* upb_fielddef ***************************************************************/
static void fielddef_init(upb_fielddef *f, static upb_fielddef *fielddef_new(upb_src *src)
google_protobuf_FieldDescriptorProto *fd)
{ {
f->type = fd->type; upb_fielddef *f = malloc(sizeof(*f));
f->label = fd->label;
f->number = fd->number;
f->name = upb_string_getref(fd->name, UPB_REF_FROZEN);
f->def = NULL; f->def = NULL;
f->owned = false; f->owned = false;
assert(fd->set_flags.has.type_name == upb_hasdef(f)); upb_src_startmsg(src);
if(fd->set_flags.has.type_name) { upb_fielddef *parsed_f;
f->def = UPB_UPCAST(upb_unresolveddef_new(fd->type_name)); while((parsed_f = upb_src_getdef(src))) {
f->owned = true; switch(parsed_f->field_number) {
case GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FIELDNUM:
CHECK(upb_src_getval(src, &f->type));
case GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_FIELDNUM:
CHECK(upb_src_getval(src, &f->label));
case GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NUMBER_FIELDNUM:
CHECK(upb_src_getval(src, &f->number));
case GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_FIELDNUM:
CHECK(upb_src_getval(src, &f->name));
case GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPENAME_FIELDNUM:
CHECK(upb_src_getval(src, &f->type_name));
f->def = UPB_UPCAST(upb_unresolveddef_new(fd->type_name));
f->owned = true;
}
} }
} upb_src_endmsg(src);
assert((f->def != NULL) == upb_hasdef(f));
static upb_fielddef *fielddef_new(google_protobuf_FieldDescriptorProto *fd)
{
upb_fielddef *f = malloc(sizeof(*f));
fielddef_init(f, fd);
return f; return f;
} }
static void fielddef_uninit(upb_fielddef *f) static void fielddef_free(upb_fielddef *f) {
{
upb_string_unref(f->name); upb_string_unref(f->name);
if(upb_hasdef(f) && f->owned) { if(upb_hasdef(f) && f->owned) {
upb_def_unref(f->def); upb_def_unref(f->def);
} }
}
static void fielddef_free(upb_fielddef *f) {
fielddef_uninit(f);
free(f); free(f);
} }
@ -248,21 +248,6 @@ static int compare_fielddefs(const void *e1, const void *e2) {
return compare_fields(*(void**)e1, *(void**)e2); return compare_fields(*(void**)e1, *(void**)e2);
} }
static int compare_fds(const void *e1, const void *e2) {
upb_fielddef f1, f2;
fielddef_init(&f1, *(void**)e1);
fielddef_init(&f2, *(void**)e2);
int ret = compare_fields(&f1, &f2);
fielddef_uninit(&f1);
fielddef_uninit(&f2);
return ret;
}
void upb_fielddef_sortfds(google_protobuf_FieldDescriptorProto **fds, size_t num)
{
qsort(fds, num, sizeof(*fds), compare_fds);
}
static void fielddef_sort(upb_fielddef **defs, size_t num) static void fielddef_sort(upb_fielddef **defs, size_t num)
{ {
qsort(defs, num, sizeof(*defs), compare_fielddefs); qsort(defs, num, sizeof(*defs), compare_fielddefs);
@ -355,23 +340,45 @@ typedef struct {
upb_strptr string; upb_strptr string;
} iton_ent; } iton_ent;
static upb_enumdef *enumdef_new(google_protobuf_EnumDescriptorProto *ed, static void insert_enum_value(upb_src *src, upb_enumdef *e)
upb_strptr fqname) {
upb_src_startmsg(src);
int32_t number = -1;
upb_string *name = NULL;
while((f = upb_src_getdef(src)) != NULL) {
switch(f->field_number) {
case GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NUMBER_FIELDNUM:
upb_src_getval(src, &number);
break;
case GOOGLE_PROTOBUF_ENUMVALUDESCRIPTORPROTO_NAME_FIELDNUM:
upb_src_getval(src, &name);
break;
default:
upb_src_skipval(src);
}
}
upb_src_endmsg(src);
ntoi_ent ntoi_ent = {{value->name, 0}, value->number};
iton_ent iton_ent = {{value->number, 0}, value->name};
upb_strtable_insert(&e->ntoi, &ntoi_ent.e);
upb_inttable_insert(&e->iton, &iton_ent.e);
}
static upb_enumdef *enumdef_new(upb_src *src, upb_strptr fqname)
{ {
upb_enumdef *e = malloc(sizeof(*e)); upb_enumdef *e = malloc(sizeof(*e));
upb_def_init(&e->base, UPB_DEF_ENUM, fqname); upb_def_init(&e->base, UPB_DEF_ENUM, fqname);
int num_values = ed->set_flags.has.value ? upb_strtable_init(&e->ntoi, 0, sizeof(ntoi_ent));
google_protobuf_EnumValueDescriptorProto_array_len(ed->value) : 0; upb_inttable_init(&e->iton, 0, sizeof(iton_ent));
upb_strtable_init(&e->ntoi, num_values, sizeof(ntoi_ent)); upb_src_startmsg(src);
upb_inttable_init(&e->iton, num_values, sizeof(iton_ent));
upb_fielddef *f;
for(int i = 0; i < num_values; i++) { while((f = upb_src_getdef(src)) != NULL) {
google_protobuf_EnumValueDescriptorProto *value = if(f->number == GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_FIELDNUM) {
google_protobuf_EnumValueDescriptorProto_array_get(ed->value, i); insert_enum_value(src, e);
ntoi_ent ntoi_ent = {{value->name, 0}, value->number}; } else {
iton_ent iton_ent = {{value->number, 0}, value->name}; upb_src_skipval(src);
upb_strtable_insert(&e->ntoi, &ntoi_ent.e); }
upb_inttable_insert(&e->iton, &iton_ent.e);
} }
return e; return e;
} }

@ -126,13 +126,6 @@ INLINE bool upb_elem_ismm(upb_fielddef *f) {
return upb_isstring(f) || upb_issubmsg(f); return upb_isstring(f) || upb_issubmsg(f);
} }
// Internal-only interface for the upb compiler.
// Sorts the given fielddefs in-place, according to what we think is an optimal
// ordering of fields. This can change from upb release to upb release.
struct google_protobuf_FieldDescriptorProto;
void upb_fielddef_sortfds(struct google_protobuf_FieldDescriptorProto **fds,
size_t num);
/* upb_msgdef *****************************************************************/ /* upb_msgdef *****************************************************************/
struct google_protobuf_EnumDescriptorProto; struct google_protobuf_EnumDescriptorProto;

Loading…
Cancel
Save