From b77db146466a113bbfb9e56472bda1975f7a25a5 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Sat, 17 Jul 2010 15:13:05 -0700 Subject: Fixed broken submsg support in upb_streamdata. --- core/upb_stream.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) (limited to 'core') diff --git a/core/upb_stream.c b/core/upb_stream.c index bda11de..e63ba00 100644 --- a/core/upb_stream.c +++ b/core/upb_stream.c @@ -14,24 +14,30 @@ void upb_streamdata(upb_src *src, upb_sink *sink, upb_status *status) { upb_fielddef *f; upb_string *str = NULL; - while((f = upb_src_getdef(src)) != NULL) { - CHECKSINK(upb_sink_putdef(sink, f)); - if(upb_issubmsg(f)) { - // We always recurse into submessages, but the putdef above already told - // the sink that. - } else if(upb_isstring(f)) { - str = upb_string_tryrecycle(str); - CHECKSRC(upb_src_getstr(src, str)); - CHECKSINK(upb_sink_putstr(sink, str)); - } else { - // Primitive type. - upb_value val; - CHECKSRC(upb_src_getval(src, upb_value_addrof(&val))); - CHECKSINK(upb_sink_putval(sink, val)); + int depth = 0; + while(1) { + while((f = upb_src_getdef(src)) != NULL) { + CHECKSINK(upb_sink_putdef(sink, f)); + if(upb_issubmsg(f)) { + upb_src_startmsg(src); + upb_sink_startmsg(sink); + ++depth; + } else if(upb_isstring(f)) { + str = upb_string_tryrecycle(str); + CHECKSRC(upb_src_getstr(src, str)); + CHECKSINK(upb_sink_putstr(sink, str)); + } else { + // Primitive type. + upb_value val; + CHECKSRC(upb_src_getval(src, upb_value_addrof(&val))); + CHECKSINK(upb_sink_putval(sink, val)); + } } + // If we're not EOF now, the loop terminated due to an error. + CHECKSRC(upb_src_eof(src)); + if (depth == 0) break; + --depth; } - // If we're not EOF now, the loop terminated due to an error. - CHECKSRC(upb_src_eof(src)); return; src_err: -- cgit v1.2.3