Parse nested listvalue in json for ruby (#5867)
* Add conformance test for nested listvalue
* Fix upb for parsing repeated Value/ListValue
* Add failed repeated ListValue conformance test into php failure list
diff --git a/php/ext/google/protobuf/upb.c b/php/ext/google/protobuf/upb.c
index 8452334..4872835 100644
--- a/php/ext/google/protobuf/upb.c
+++ b/php/ext/google/protobuf/upb.c
@@ -12768,6 +12768,11 @@
/* The table mapping json name to fielddef for this message. */
upb_strtable *name_table;
+ /* We are in a repeated-field context. We need this flag to decide whether to
+ * handle the array as a normal repeated field or a
+ * google.protobuf.ListValue/google.protobuf.Value. */
+ bool is_repeated;
+
/* We are in a repeated-field context, ready to emit mapentries as
* submessages. This flag alters the start-of-object (open-brace) behavior to
* begin a sequence of mapentry messages rather than a single submessage. */
@@ -13808,6 +13813,7 @@
inner->m = p->top->m;
inner->f = p->top->f;
inner->name_table = NULL;
+ inner->is_repeated = false;
inner->is_map = false;
inner->is_mapentry = false;
inner->is_any = false;
@@ -14284,6 +14290,7 @@
inner->m = p->top->m;
inner->f = p->top->f;
inner->name_table = NULL;
+ inner->is_repeated = false;
inner->is_map = false;
inner->is_mapentry = false;
inner->is_any = false;
@@ -14431,6 +14438,7 @@
inner->m = mapentrymsg;
inner->name_table = NULL;
inner->mapfield = mapfield;
+ inner->is_repeated = false;
inner->is_map = false;
inner->is_any = false;
inner->any_frame = NULL;
@@ -14555,6 +14563,7 @@
inner = p->top + 1;
inner->m = NULL;
inner->f = NULL;
+ inner->is_repeated = false;
inner->is_map = false;
inner->is_mapentry = false;
inner->is_any = false;
@@ -14579,6 +14588,7 @@
inner->name_table = NULL;
inner->mapfield = p->top->f;
inner->f = NULL;
+ inner->is_repeated = false;
inner->is_map = true;
inner->is_mapentry = false;
inner->is_any = false;
@@ -14602,6 +14612,7 @@
inner->m = upb_fielddef_msgsubdef(p->top->f);
set_name_table(p, inner);
inner->f = NULL;
+ inner->is_repeated = false;
inner->is_map = false;
inner->is_mapentry = false;
inner->is_unknown_field = false;
@@ -14704,10 +14715,14 @@
} else {
return false;
}
- } else if (is_wellknown_field(p, UPB_WELLKNOWN_LISTVALUE)) {
+ } else if (is_wellknown_field(p, UPB_WELLKNOWN_LISTVALUE) &&
+ (!upb_fielddef_isseq(p->top->f) ||
+ p->top->is_repeated)) {
if (!start_subobject(p)) return false;
start_listvalue_object(p);
- } else if (is_wellknown_field(p, UPB_WELLKNOWN_VALUE)) {
+ } else if (is_wellknown_field(p, UPB_WELLKNOWN_VALUE) &&
+ (!upb_fielddef_isseq(p->top->f) ||
+ p->top->is_repeated)) {
if (!start_subobject(p)) return false;
start_value_object(p, VALUE_LISTVALUE);
if (!start_subobject(p)) return false;
@@ -14719,6 +14734,7 @@
inner->m = NULL;
inner->name_table = NULL;
inner->f = NULL;
+ inner->is_repeated = false;
inner->is_map = false;
inner->is_mapentry = false;
inner->is_any = false;
@@ -14745,6 +14761,7 @@
inner->m = p->top->m;
inner->name_table = NULL;
inner->f = p->top->f;
+ inner->is_repeated = true;
inner->is_map = false;
inner->is_mapentry = false;
inner->is_any = false;
@@ -15778,6 +15795,7 @@
p->top = p->stack;
p->top->f = NULL;
+ p->top->is_repeated = false;
p->top->is_map = false;
p->top->is_mapentry = false;
p->top->is_any = false;