summaryrefslogtreecommitdiff
path: root/src/upb_decoder.c
diff options
context:
space:
mode:
authorJoshua Haberman <joshua@reverberate.org>2010-07-03 19:19:36 -0700
committerJoshua Haberman <joshua@reverberate.org>2010-07-03 19:19:36 -0700
commit9d051254b35b2bf838f1753a24fe490fb448e428 (patch)
tree362cf3a0ff040b2eeccbbb530b9e60aeb13b05ab /src/upb_decoder.c
parent5ea7f943f9fd70fa1ada694b4532b71af55f8861 (diff)
Implemented upb_baredecoder, for bootstrapping.
Diffstat (limited to 'src/upb_decoder.c')
-rw-r--r--src/upb_decoder.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/upb_decoder.c b/src/upb_decoder.c
index 6f1e437..dd8ffcd 100644
--- a/src/upb_decoder.c
+++ b/src/upb_decoder.c
@@ -316,9 +316,6 @@ bool upb_decoder_skipval(upb_decoder *d);
upb_fielddef *upb_decoder_getdef(upb_decoder *d)
{
- uint32_t key;
- upb_wire_type_t wire_type;
-
// Detect end-of-submessage.
if(upb_decoder_offset(d) >= d->top->end_offset) {
d->src.eof = true;
@@ -328,9 +325,11 @@ upb_fielddef *upb_decoder_getdef(upb_decoder *d)
// Handles the packed field case.
if(d->field) return d->field;
+ uint32_t key = 0;
again:
if(!upb_decoder_readv32(d, &key)) return NULL;
- wire_type = key & 0x7;
+ upb_wire_type_t wire_type = key & 0x7;
+ int32_t field_number = key >> 3;
if(wire_type == UPB_WIRE_TYPE_DELIMITED) {
// For delimited wire values we parse the length now, since we need it in
@@ -348,7 +347,7 @@ again:
}
// Look up field by tag number.
- upb_fielddef *f = upb_msg_itof(d->top->msgdef, key >> 3);
+ upb_fielddef *f = upb_msg_itof(d->top->msgdef, field_number);
if (!f) {
// Unknown field. If/when the upb_src interface supports reporting
@@ -557,6 +556,8 @@ upb_decoder *upb_decoder_new(upb_msgdef *msgdef)
void upb_decoder_free(upb_decoder *d)
{
+ upb_string_unref(d->str);
+ if(d->buf) upb_string_unref(d->buf);
free(d);
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback