summaryrefslogtreecommitdiff
path: root/src/upb_msg.c
diff options
context:
space:
mode:
authorJoshua Haberman <joshua@reverberate.org>2009-07-25 15:46:34 -0700
committerJoshua Haberman <joshua@reverberate.org>2009-07-25 15:46:34 -0700
commite373367fb70d4f432db1d3e9c21f5e0d93950e56 (patch)
tree364d3e11dabf15dfa82a9019a687416d92acf22c /src/upb_msg.c
parentb39b463ec9b2fba7440050c4508429cf42c543d4 (diff)
Move parsing functions to header file in anticipation of code generation (want them inlined).
Diffstat (limited to 'src/upb_msg.c')
-rw-r--r--src/upb_msg.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/upb_msg.c b/src/upb_msg.c
index f589d3d..6d6d934 100644
--- a/src/upb_msg.c
+++ b/src/upb_msg.c
@@ -231,7 +231,7 @@ void upb_msg_reuse_array(struct upb_array **arr, uint32_t size, upb_field_type_t
}
struct mm_upb_array *a = (void*)*arr;
if(a->size < size) {
- size = max(16, round_up_to_pow2(size));
+ size = max(4, round_up_to_pow2(size));
size_t type_size = upb_type_info[t].size;
a->a.elements._void = realloc(a->a.elements._void, size * type_size);
/* Zero any newly initialized memory. */
@@ -246,7 +246,6 @@ void upb_msg_reuse_strref(struct upb_string **str) { upb_msg_reuse_str(str, 0);
void upb_msg_reuse_submsg(void **msg, struct upb_msg *m)
{
if(!*msg) *msg = upb_msgdata_new(m);
- else upb_msg_clear(*msg, m); /* Clears set bits, leaves pointers. */
}
/* Serialization/Deserialization. ********************************************/
@@ -275,7 +274,6 @@ static union upb_value_ptr get_value_ptr(void *data, struct upb_msg_field *f)
p = upb_array_getelementptr(*p.arr, len, f->type);
assert(p._void);
}
- upb_msg_set(data, f);
assert(p._void);
return p;
}
@@ -286,8 +284,9 @@ static upb_status_t value_cb(void *udata, uint8_t *buf, uint8_t *end,
struct upb_msg_parse_state *s = udata;
struct upb_msg_field *f = user_field_desc;
union upb_value_ptr p = get_value_ptr(s->top->data, f);
+ upb_msg_set(s->top->data, f);
UPB_CHECK(upb_parse_value(buf, end, f->type, p, outbuf));
- google_protobuf_FieldDescriptorProto *fd = upb_msg_field_descriptor(f, s->top->m);
+ //google_protobuf_FieldDescriptorProto *fd = upb_msg_field_descriptor(f, s->top->m);
//upb_text_printfield(&s->p, *fd->name, f->type, upb_deref(p, f->type), stdout);
return UPB_STATUS_OK;
}
@@ -297,6 +296,7 @@ static void str_cb(void *udata, struct upb_string *str, void *user_field_desc)
struct upb_msg_parse_state *s = udata;
struct upb_msg_field *f = user_field_desc;
union upb_value_ptr p = get_value_ptr(s->top->data, f);
+ upb_msg_set(s->top->data, f);
if(s->byref) {
upb_msg_reuse_strref(p.str);
**p.str = *str;
@@ -312,13 +312,16 @@ static void submsg_start_cb(void *udata, void *user_field_desc)
{
struct upb_msg_parse_state *s = udata;
struct upb_msg_field *f = user_field_desc;
- union upb_value_ptr p = get_value_ptr(s->top->data, f);
- assert(f->ref.msg);
- upb_msg_reuse_submsg(p.msg, f->ref.msg);
+ struct upb_msg *m = f->ref.msg;
+ void *data = s->top->data; /* The message from the existing frame. */
+ union upb_value_ptr p = get_value_ptr(data, f);
+ upb_msg_reuse_submsg(p.msg, m);
+ if(!upb_msg_isset(data, f) || !s->merge)
+ upb_msg_clear(*p.msg, m);
+ upb_msg_set(data, f);
s->top++;
- s->top->m = f->ref.msg;
+ s->top->m = m;
s->top->data = *p.msg;
- if(!s->merge) upb_msg_clear(s->top->data, s->top->m);
//upb_text_push(&s->p, *s->top->m->descriptor->name, stdout);
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback