aboutsummaryrefslogtreecommitdiff
path: root/php/ext
diff options
context:
space:
mode:
authorPaul Yang <TeBoring@users.noreply.github.com>2018-10-12 13:46:26 -0700
committerGitHub <noreply@github.com>2018-10-12 13:46:26 -0700
commitd2d4b403b580690b3cb25cb3d2b32d567044619e (patch)
treebd08eb19cae7662e438121180a9c1b162a886723 /php/ext
parent39df66e1f797e0b558f0cce3efa07d21c83333fa (diff)
downloadprotobuf-d2d4b403b580690b3cb25cb3d2b32d567044619e.tar.gz
Sync upb for unknown fix (#5240)
Diffstat (limited to 'php/ext')
-rw-r--r--php/ext/google/protobuf/upb.c156
1 files changed, 95 insertions, 61 deletions
diff --git a/php/ext/google/protobuf/upb.c b/php/ext/google/protobuf/upb.c
index 2179e2c74..049e2bb06 100644
--- a/php/ext/google/protobuf/upb.c
+++ b/php/ext/google/protobuf/upb.c
@@ -12659,6 +12659,9 @@ typedef struct {
* because |f| is the field in the *current* message (i.e., the map-entry
* message itself), not the parent's field that leads to this map. */
const upb_fielddef *mapfield;
+
+ /* True if the field to be parsed is unknown. */
+ bool is_unknown_field;
} upb_jsonparser_frame;
struct upb_json_parser {
@@ -13464,6 +13467,10 @@ static bool end_bool(upb_json_parser *p, bool val) {
start_value_object(p, VALUE_BOOLVALUE);
}
+ if (p->top->is_unknown_field) {
+ return true;
+ }
+
if (!parser_putbool(p, val)) {
return false;
}
@@ -13570,6 +13577,7 @@ static bool start_stringval(upb_json_parser *p) {
inner->name_table = NULL;
inner->is_map = false;
inner->is_mapentry = false;
+ inner->is_unknown_field = false;
p->top = inner;
if (upb_fielddef_type(p->top->f) == UPB_TYPE_STRING) {
@@ -14061,6 +14069,7 @@ static bool handle_mapentry(upb_json_parser *p) {
inner->name_table = NULL;
inner->mapfield = mapfield;
inner->is_map = false;
+ inner->is_unknown_field = false;
/* Don't set this to true *yet* -- we reuse parsing handlers below to push
* the key field value to the sink, and these handlers will pop the frame
@@ -14091,6 +14100,8 @@ static bool end_membername(upb_json_parser *p) {
UPB_ASSERT(!p->top->f);
if (!p->top->m) {
+ p->top->is_unknown_field = true;
+ multipart_end(p);
return true;
}
@@ -14107,6 +14118,7 @@ static bool end_membername(upb_json_parser *p) {
return true;
} else if (p->ignore_json_unknown) {
+ p->top->is_unknown_field = true;
multipart_end(p);
return true;
} else {
@@ -14138,10 +14150,11 @@ static void end_member(upb_json_parser *p) {
}
p->top->f = NULL;
+ p->top->is_unknown_field = false;
}
static bool start_subobject(upb_json_parser *p) {
- if (p->top->f == NULL) {
+ if (p->top->is_unknown_field) {
upb_jsonparser_frame *inner;
if (!check_stack(p)) return false;
@@ -14150,6 +14163,7 @@ static bool start_subobject(upb_json_parser *p) {
inner->f = NULL;
inner->is_map = false;
inner->is_mapentry = false;
+ inner->is_unknown_field = false;
p->top = inner;
return true;
}
@@ -14171,6 +14185,7 @@ static bool start_subobject(upb_json_parser *p) {
inner->f = NULL;
inner->is_map = true;
inner->is_mapentry = false;
+ inner->is_unknown_field = false;
p->top = inner;
return true;
@@ -14191,6 +14206,7 @@ static bool start_subobject(upb_json_parser *p) {
inner->f = NULL;
inner->is_map = false;
inner->is_mapentry = false;
+ inner->is_unknown_field = false;
p->top = inner;
return true;
@@ -14290,7 +14306,18 @@ static bool start_array(upb_json_parser *p) {
start_listvalue_object(p);
}
- UPB_ASSERT(p->top->f);
+ if (p->top->is_unknown_field) {
+ inner = p->top + 1;
+ inner->m = NULL;
+ inner->name_table = NULL;
+ inner->f = NULL;
+ inner->is_map = false;
+ inner->is_mapentry = false;
+ inner->is_unknown_field = true;
+ p->top = inner;
+
+ return true;
+ }
if (!upb_fielddef_isseq(p->top->f)) {
upb_status_seterrf(&p->status,
@@ -14310,6 +14337,7 @@ static bool start_array(upb_json_parser *p) {
inner->f = p->top->f;
inner->is_map = false;
inner->is_mapentry = false;
+ inner->is_unknown_field = false;
p->top = inner;
return true;
@@ -14321,6 +14349,11 @@ static void end_array(upb_json_parser *p) {
UPB_ASSERT(p->top > p->stack);
p->top--;
+
+ if (p->top->is_unknown_field) {
+ return;
+ }
+
sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSEQ);
upb_sink_endseq(&p->top->sink, sel);
@@ -14340,13 +14373,13 @@ static void end_array(upb_json_parser *p) {
}
static void start_object(upb_json_parser *p) {
- if (!p->top->is_map) {
+ if (!p->top->is_map && p->top->m != NULL) {
upb_sink_startmsg(&p->top->sink);
}
}
static void end_object(upb_json_parser *p) {
- if (!p->top->is_map) {
+ if (!p->top->is_map && p->top->m != NULL) {
upb_status status;
upb_status_clear(&status);
upb_sink_endmsg(&p->top->sink, &status);
@@ -14458,7 +14491,7 @@ static void end_structvalue_object(upb_json_parser *p) {
}
static bool is_top_level(upb_json_parser *p) {
- return p->top == p->stack && p->top->f == NULL;
+ return p->top == p->stack && p->top->f == NULL && !p->top->is_unknown_field;
}
static bool is_wellknown_msg(upb_json_parser *p, upb_wellknowntype_t type) {
@@ -14521,11 +14554,11 @@ static bool is_string_wrapper_object(upb_json_parser *p) {
* final state once, when the closing '"' is seen. */
-//#line 2114 "upb/json/parser.rl"
+//#line 2147 "upb/json/parser.rl"
-//#line 1983 "upb/json/parser.c"
+//#line 2016 "upb/json/parser.c"
static const char _json_actions[] = {
0, 1, 0, 1, 1, 1, 3, 1,
4, 1, 6, 1, 7, 1, 8, 1,
@@ -14776,7 +14809,7 @@ static const int json_en_value_machine = 76;
static const int json_en_main = 1;
-//#line 2117 "upb/json/parser.rl"
+//#line 2150 "upb/json/parser.rl"
size_t parse(void *closure, const void *hd, const char *buf, size_t size,
const upb_bufhandle *handle) {
@@ -14799,7 +14832,7 @@ size_t parse(void *closure, const void *hd, const char *buf, size_t size,
capture_resume(parser, buf);
-//#line 2257 "upb/json/parser.c"
+//#line 2290 "upb/json/parser.c"
{
int _klen;
unsigned int _trans;
@@ -14874,83 +14907,83 @@ _match:
switch ( *_acts++ )
{
case 1:
-//#line 1988 "upb/json/parser.rl"
+//#line 2021 "upb/json/parser.rl"
{ p--; {cs = stack[--top]; goto _again;} }
break;
case 2:
-//#line 1990 "upb/json/parser.rl"
+//#line 2023 "upb/json/parser.rl"
{ p--; {stack[top++] = cs; cs = 24; goto _again;} }
break;
case 3:
-//#line 1994 "upb/json/parser.rl"
+//#line 2027 "upb/json/parser.rl"
{ start_text(parser, p); }
break;
case 4:
-//#line 1995 "upb/json/parser.rl"
+//#line 2028 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_text(parser, p)); }
break;
case 5:
-//#line 2001 "upb/json/parser.rl"
+//#line 2034 "upb/json/parser.rl"
{ start_hex(parser); }
break;
case 6:
-//#line 2002 "upb/json/parser.rl"
+//#line 2035 "upb/json/parser.rl"
{ hexdigit(parser, p); }
break;
case 7:
-//#line 2003 "upb/json/parser.rl"
+//#line 2036 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_hex(parser)); }
break;
case 8:
-//#line 2009 "upb/json/parser.rl"
+//#line 2042 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(escape(parser, p)); }
break;
case 9:
-//#line 2015 "upb/json/parser.rl"
+//#line 2048 "upb/json/parser.rl"
{ p--; {cs = stack[--top]; goto _again;} }
break;
case 10:
-//#line 2027 "upb/json/parser.rl"
+//#line 2060 "upb/json/parser.rl"
{ start_duration_base(parser, p); }
break;
case 11:
-//#line 2028 "upb/json/parser.rl"
+//#line 2061 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_duration_base(parser, p)); }
break;
case 12:
-//#line 2030 "upb/json/parser.rl"
+//#line 2063 "upb/json/parser.rl"
{ p--; {cs = stack[--top]; goto _again;} }
break;
case 13:
-//#line 2035 "upb/json/parser.rl"
+//#line 2068 "upb/json/parser.rl"
{ start_timestamp_base(parser, p); }
break;
case 14:
-//#line 2036 "upb/json/parser.rl"
+//#line 2069 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_timestamp_base(parser, p)); }
break;
case 15:
-//#line 2038 "upb/json/parser.rl"
+//#line 2071 "upb/json/parser.rl"
{ start_timestamp_fraction(parser, p); }
break;
case 16:
-//#line 2039 "upb/json/parser.rl"
+//#line 2072 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_timestamp_fraction(parser, p)); }
break;
case 17:
-//#line 2041 "upb/json/parser.rl"
+//#line 2074 "upb/json/parser.rl"
{ start_timestamp_zone(parser, p); }
break;
case 18:
-//#line 2042 "upb/json/parser.rl"
+//#line 2075 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_timestamp_zone(parser, p)); }
break;
case 19:
-//#line 2044 "upb/json/parser.rl"
+//#line 2077 "upb/json/parser.rl"
{ p--; {cs = stack[--top]; goto _again;} }
break;
case 20:
-//#line 2049 "upb/json/parser.rl"
+//#line 2082 "upb/json/parser.rl"
{
if (is_wellknown_msg(parser, UPB_WELLKNOWN_TIMESTAMP)) {
{stack[top++] = cs; cs = 48; goto _again;}
@@ -14962,78 +14995,78 @@ _match:
}
break;
case 21:
-//#line 2060 "upb/json/parser.rl"
+//#line 2093 "upb/json/parser.rl"
{ p--; {stack[top++] = cs; cs = 76; goto _again;} }
break;
case 22:
-//#line 2065 "upb/json/parser.rl"
+//#line 2098 "upb/json/parser.rl"
{ start_member(parser); }
break;
case 23:
-//#line 2066 "upb/json/parser.rl"
+//#line 2099 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_membername(parser)); }
break;
case 24:
-//#line 2069 "upb/json/parser.rl"
+//#line 2102 "upb/json/parser.rl"
{ end_member(parser); }
break;
case 25:
-//#line 2075 "upb/json/parser.rl"
+//#line 2108 "upb/json/parser.rl"
{ start_object(parser); }
break;
case 26:
-//#line 2078 "upb/json/parser.rl"
+//#line 2111 "upb/json/parser.rl"
{ end_object(parser); }
break;
case 27:
-//#line 2084 "upb/json/parser.rl"
+//#line 2117 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(start_array(parser)); }
break;
case 28:
-//#line 2088 "upb/json/parser.rl"
+//#line 2121 "upb/json/parser.rl"
{ end_array(parser); }
break;
case 29:
-//#line 2093 "upb/json/parser.rl"
+//#line 2126 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(start_number(parser, p)); }
break;
case 30:
-//#line 2094 "upb/json/parser.rl"
+//#line 2127 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_number(parser, p)); }
break;
case 31:
-//#line 2096 "upb/json/parser.rl"
+//#line 2129 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(start_stringval(parser)); }
break;
case 32:
-//#line 2097 "upb/json/parser.rl"
+//#line 2130 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_stringval(parser)); }
break;
case 33:
-//#line 2099 "upb/json/parser.rl"
+//#line 2132 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_bool(parser, true)); }
break;
case 34:
-//#line 2101 "upb/json/parser.rl"
+//#line 2134 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_bool(parser, false)); }
break;
case 35:
-//#line 2103 "upb/json/parser.rl"
+//#line 2136 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_null(parser)); }
break;
case 36:
-//#line 2105 "upb/json/parser.rl"
+//#line 2138 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(start_subobject_full(parser)); }
break;
case 37:
-//#line 2106 "upb/json/parser.rl"
+//#line 2139 "upb/json/parser.rl"
{ end_subobject_full(parser); }
break;
case 38:
-//#line 2111 "upb/json/parser.rl"
+//#line 2144 "upb/json/parser.rl"
{ p--; {cs = stack[--top]; goto _again;} }
break;
-//#line 2491 "upb/json/parser.c"
+//#line 2524 "upb/json/parser.c"
}
}
@@ -15050,34 +15083,34 @@ _again:
while ( __nacts-- > 0 ) {
switch ( *__acts++ ) {
case 0:
-//#line 1986 "upb/json/parser.rl"
+//#line 2019 "upb/json/parser.rl"
{ p--; {cs = stack[--top]; goto _again;} }
break;
case 26:
-//#line 2078 "upb/json/parser.rl"
+//#line 2111 "upb/json/parser.rl"
{ end_object(parser); }
break;
case 30:
-//#line 2094 "upb/json/parser.rl"
+//#line 2127 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_number(parser, p)); }
break;
case 33:
-//#line 2099 "upb/json/parser.rl"
+//#line 2132 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_bool(parser, true)); }
break;
case 34:
-//#line 2101 "upb/json/parser.rl"
+//#line 2134 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_bool(parser, false)); }
break;
case 35:
-//#line 2103 "upb/json/parser.rl"
+//#line 2136 "upb/json/parser.rl"
{ CHECK_RETURN_TOP(end_null(parser)); }
break;
case 37:
-//#line 2106 "upb/json/parser.rl"
+//#line 2139 "upb/json/parser.rl"
{ end_subobject_full(parser); }
break;
-//#line 2535 "upb/json/parser.c"
+//#line 2568 "upb/json/parser.c"
}
}
}
@@ -15085,7 +15118,7 @@ _again:
_out: {}
}
-//#line 2139 "upb/json/parser.rl"
+//#line 2172 "upb/json/parser.rl"
if (p != pe) {
upb_status_seterrf(&parser->status, "Parse error at '%.*s'\n", pe - p, p);
@@ -15117,9 +15150,9 @@ bool end(void *closure, const void *hd) {
parse(parser, hd, &eof_ch, 0, NULL);
return parser->current_state >=
-//#line 2575 "upb/json/parser.c"
+//#line 2608 "upb/json/parser.c"
105
-//#line 2169 "upb/json/parser.rl"
+//#line 2202 "upb/json/parser.rl"
;
}
@@ -15131,16 +15164,17 @@ static void json_parser_reset(upb_json_parser *p) {
p->top->f = NULL;
p->top->is_map = false;
p->top->is_mapentry = false;
+ p->top->is_unknown_field = false;
/* Emit Ragel initialization of the parser. */
-//#line 2592 "upb/json/parser.c"
+//#line 2626 "upb/json/parser.c"
{
cs = json_start;
top = 0;
}
-//#line 2183 "upb/json/parser.rl"
+//#line 2217 "upb/json/parser.rl"
p->current_state = cs;
p->parser_top = top;
accumulate_clear(p);