@ -68,7 +68,7 @@ struct upb_json_parser {
upb_jsonparser_frame * top ;
upb_jsonparser_frame * top ;
upb_jsonparser_frame * limit ;
upb_jsonparser_frame * limit ;
upb_status * status ;
upb_status status ;
/* Ragel's internal parsing stack for the parsing state machine. */
/* Ragel's internal parsing stack for the parsing state machine. */
int current_state ;
int current_state ;
@ -115,7 +115,8 @@ static upb_selector_t parser_getsel(upb_json_parser *p) {
static bool check_stack ( upb_json_parser * p ) {
static bool check_stack ( upb_json_parser * p ) {
if ( ( p - > top + 1 ) = = p - > limit ) {
if ( ( p - > top + 1 ) = = p - > limit ) {
upb_status_seterrmsg ( p - > status , " Nesting too deep " ) ;
upb_status_seterrmsg ( & p - > status , " Nesting too deep " ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
@ -197,9 +198,10 @@ static bool base64_push(upb_json_parser *p, upb_selector_t sel, const char *ptr,
char output [ 3 ] ;
char output [ 3 ] ;
if ( limit - ptr < 4 ) {
if ( limit - ptr < 4 ) {
upb_status_seterrf ( p - > status ,
upb_status_seterrf ( & p - > status ,
" Base64 input for bytes field not a multiple of 4: %s " ,
" Base64 input for bytes field not a multiple of 4: %s " ,
upb_fielddef_name ( p - > top - > f ) ) ;
upb_fielddef_name ( p - > top - > f ) ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
@ -223,9 +225,10 @@ static bool base64_push(upb_json_parser *p, upb_selector_t sel, const char *ptr,
otherchar :
otherchar :
if ( nonbase64 ( ptr [ 0 ] ) | | nonbase64 ( ptr [ 1 ] ) | | nonbase64 ( ptr [ 2 ] ) | |
if ( nonbase64 ( ptr [ 0 ] ) | | nonbase64 ( ptr [ 1 ] ) | | nonbase64 ( ptr [ 2 ] ) | |
nonbase64 ( ptr [ 3 ] ) ) {
nonbase64 ( ptr [ 3 ] ) ) {
upb_status_seterrf ( p - > status ,
upb_status_seterrf ( & p - > status ,
" Non-base64 characters in bytes field: %s " ,
" Non-base64 characters in bytes field: %s " ,
upb_fielddef_name ( p - > top - > f ) ) ;
upb_fielddef_name ( p - > top - > f ) ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
} if ( ptr [ 2 ] = = ' = ' ) {
} if ( ptr [ 2 ] = = ' = ' ) {
uint32_t val ;
uint32_t val ;
@ -263,10 +266,11 @@ otherchar:
}
}
badpadding :
badpadding :
upb_status_seterrf ( p - > status ,
upb_status_seterrf ( & p - > status ,
" Incorrect base64 padding for field: %s (%.*s) " ,
" Incorrect base64 padding for field: %s (%.*s) " ,
upb_fielddef_name ( p - > top - > f ) ,
upb_fielddef_name ( p - > top - > f ) ,
4 , ptr ) ;
4 , ptr ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
@ -313,7 +317,8 @@ static bool accumulate_realloc(upb_json_parser *p, size_t need) {
mem = upb_env_realloc ( p - > env , p - > accumulate_buf , old_size , new_size ) ;
mem = upb_env_realloc ( p - > env , p - > accumulate_buf , old_size , new_size ) ;
if ( ! mem ) {
if ( ! mem ) {
upb_status_seterrmsg ( p - > status , " Out of memory allocating buffer. " ) ;
upb_status_seterrmsg ( & p - > status , " Out of memory allocating buffer. " ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
@ -336,7 +341,8 @@ static bool accumulate_append(upb_json_parser *p, const char *buf, size_t len,
}
}
if ( ! checked_add ( p - > accumulated_len , len , & need ) ) {
if ( ! checked_add ( p - > accumulated_len , len , & need ) ) {
upb_status_seterrmsg ( p - > status , " Integer overflow. " ) ;
upb_status_seterrmsg ( & p - > status , " Integer overflow. " ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
@ -414,7 +420,8 @@ static bool multipart_text(upb_json_parser *p, const char *buf, size_t len,
switch ( p - > multipart_state ) {
switch ( p - > multipart_state ) {
case MULTIPART_INACTIVE :
case MULTIPART_INACTIVE :
upb_status_seterrmsg (
upb_status_seterrmsg (
p - > status , " Internal error: unexpected state MULTIPART_INACTIVE " ) ;
& p - > status , " Internal error: unexpected state MULTIPART_INACTIVE " ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
case MULTIPART_ACCUMULATE :
case MULTIPART_ACCUMULATE :
@ -673,7 +680,8 @@ static bool parse_number(upb_json_parser *p) {
return true ;
return true ;
err :
err :
upb_status_seterrf ( p - > status , " error parsing number: %s " , buf ) ;
upb_status_seterrf ( & p - > status , " error parsing number: %s " , buf ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
multipart_end ( p ) ;
multipart_end ( p ) ;
return false ;
return false ;
}
}
@ -682,9 +690,10 @@ static bool parser_putbool(upb_json_parser *p, bool val) {
bool ok ;
bool ok ;
if ( upb_fielddef_type ( p - > top - > f ) ! = UPB_TYPE_BOOL ) {
if ( upb_fielddef_type ( p - > top - > f ) ! = UPB_TYPE_BOOL ) {
upb_status_seterrf ( p - > status ,
upb_status_seterrf ( & p - > status ,
" Boolean value specified for non-bool field: %s " ,
" Boolean value specified for non-bool field: %s " ,
upb_fielddef_name ( p - > top - > f ) ) ;
upb_fielddef_name ( p - > top - > f ) ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
@ -735,9 +744,10 @@ static bool start_stringval(upb_json_parser *p) {
multipart_startaccum ( p ) ;
multipart_startaccum ( p ) ;
return true ;
return true ;
} else {
} else {
upb_status_seterrf ( p - > status ,
upb_status_seterrf ( & p - > status ,
" String specified for non-string/non-enum field: %s " ,
" String specified for non-string/non-enum field: %s " ,
upb_fielddef_name ( p - > top - > f ) ) ;
upb_fielddef_name ( p - > top - > f ) ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
}
}
@ -775,7 +785,8 @@ static bool end_stringval(upb_json_parser *p) {
upb_selector_t sel = parser_getsel ( p ) ;
upb_selector_t sel = parser_getsel ( p ) ;
upb_sink_putint32 ( & p - > top - > sink , sel , int_val ) ;
upb_sink_putint32 ( & p - > top - > sink , sel , int_val ) ;
} else {
} else {
upb_status_seterrf ( p - > status , " Enum value unknown: '%.*s' " , len , buf ) ;
upb_status_seterrf ( & p - > status , " Enum value unknown: '%.*s' " , len , buf ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
}
}
break ;
break ;
@ -783,7 +794,8 @@ static bool end_stringval(upb_json_parser *p) {
default :
default :
assert ( false ) ;
assert ( false ) ;
upb_status_seterrmsg ( p - > status , " Internal error in JSON decoder " ) ;
upb_status_seterrmsg ( & p - > status , " Internal error in JSON decoder " ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
ok = false ;
ok = false ;
break ;
break ;
}
}
@ -813,7 +825,8 @@ static bool parse_mapentry_key(upb_json_parser *p) {
p - > top - > f = upb_msgdef_itof ( p - > top - > m , UPB_MAPENTRY_KEY ) ;
p - > top - > f = upb_msgdef_itof ( p - > top - > m , UPB_MAPENTRY_KEY ) ;
if ( p - > top - > f = = NULL ) {
if ( p - > top - > f = = NULL ) {
upb_status_seterrmsg ( p - > status , " mapentry message has no key " ) ;
upb_status_seterrmsg ( & p - > status , " mapentry message has no key " ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
switch ( upb_fielddef_type ( p - > top - > f ) ) {
switch ( upb_fielddef_type ( p - > top - > f ) ) {
@ -836,8 +849,9 @@ static bool parse_mapentry_key(upb_json_parser *p) {
return false ;
return false ;
}
}
} else {
} else {
upb_status_seterrmsg ( p - > status ,
upb_status_seterrmsg ( & p - > status ,
" Map bool key not 'true' or 'false' " ) ;
" Map bool key not 'true' or 'false' " ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
multipart_end ( p ) ;
multipart_end ( p ) ;
@ -855,7 +869,8 @@ static bool parse_mapentry_key(upb_json_parser *p) {
break ;
break ;
}
}
default :
default :
upb_status_seterrmsg ( p - > status , " Invalid field type for map key " ) ;
upb_status_seterrmsg ( & p - > status , " Invalid field type for map key " ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
@ -910,7 +925,8 @@ static bool handle_mapentry(upb_json_parser *p) {
p - > top - > is_mapentry = true ; /* set up to pop frame after value is parsed. */
p - > top - > is_mapentry = true ; /* set up to pop frame after value is parsed. */
p - > top - > mapfield = mapfield ;
p - > top - > mapfield = mapfield ;
if ( p - > top - > f = = NULL ) {
if ( p - > top - > f = = NULL ) {
upb_status_seterrmsg ( p - > status , " mapentry message has no value " ) ;
upb_status_seterrmsg ( & p - > status , " mapentry message has no value " ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
@ -930,7 +946,8 @@ static bool end_membername(upb_json_parser *p) {
if ( ! f ) {
if ( ! f ) {
/* TODO(haberman): Ignore unknown fields if requested/configured to do
/* TODO(haberman): Ignore unknown fields if requested/configured to do
* so . */
* so . */
upb_status_seterrf ( p - > status , " No such field: %.*s \n " , ( int ) len , buf ) ;
upb_status_seterrf ( & p - > status , " No such field: %.*s \n " , ( int ) len , buf ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
@ -1006,9 +1023,10 @@ static bool start_subobject(upb_json_parser *p) {
return true ;
return true ;
} else {
} else {
upb_status_seterrf ( p - > status ,
upb_status_seterrf ( & p - > status ,
" Object specified for non-message/group field: %s " ,
" Object specified for non-message/group field: %s " ,
upb_fielddef_name ( p - > top - > f ) ) ;
upb_fielddef_name ( p - > top - > f ) ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
}
}
@ -1034,9 +1052,10 @@ static bool start_array(upb_json_parser *p) {
assert ( p - > top - > f ) ;
assert ( p - > top - > f ) ;
if ( ! upb_fielddef_isseq ( p - > top - > f ) ) {
if ( ! upb_fielddef_isseq ( p - > top - > f ) ) {
upb_status_seterrf ( p - > status ,
upb_status_seterrf ( & p - > status ,
" Array specified for non-repeated field: %s " ,
" Array specified for non-repeated field: %s " ,
upb_fielddef_name ( p - > top - > f ) ) ;
upb_fielddef_name ( p - > top - > f ) ) ;
upb_env_reporterror ( p - > env , & p - > status ) ;
return false ;
return false ;
}
}
@ -1073,7 +1092,11 @@ static void start_object(upb_json_parser *p) {
static void end_object ( upb_json_parser * p ) {
static void end_object ( upb_json_parser * p ) {
if ( ! p - > top - > is_map ) {
if ( ! p - > top - > is_map ) {
upb_status status ;
upb_status status ;
upb_status_clear ( & status ) ;
upb_sink_endmsg ( & p - > top - > sink , & status ) ;
upb_sink_endmsg ( & p - > top - > sink , & status ) ;
if ( ! upb_ok ( & status ) ) {
upb_env_reporterror ( p - > env , & status ) ;
}
}
}
}
}
@ -1099,11 +1122,11 @@ static void end_object(upb_json_parser *p) {
* final state once , when the closing ' " ' is seen . */
* final state once , when the closing ' " ' is seen . */
# line 1195 "upb / json / parser.rl"
# line 1218 "upb / json / parser.rl"
# line 1107 "upb / json / parser.c"
# line 113 0 "upb / json / parser.c"
static const char _json_actions [ ] = {
static const char _json_actions [ ] = {
0 , 1 , 0 , 1 , 2 , 1 , 3 , 1 ,
0 , 1 , 0 , 1 , 2 , 1 , 3 , 1 ,
5 , 1 , 6 , 1 , 7 , 1 , 8 , 1 ,
5 , 1 , 6 , 1 , 7 , 1 , 8 , 1 ,
@ -1252,7 +1275,7 @@ static const int json_en_value_machine = 27;
static const int json_en_main = 1 ;
static const int json_en_main = 1 ;
# line 1198 "upb / json / parser.rl"
# line 122 1 "upb / json / parser.rl"
size_t parse ( void * closure , const void * hd , const char * buf , size_t size ,
size_t parse ( void * closure , const void * hd , const char * buf , size_t size ,
const upb_bufhandle * handle ) {
const upb_bufhandle * handle ) {
@ -1274,7 +1297,7 @@ size_t parse(void *closure, const void *hd, const char *buf, size_t size,
capture_resume ( parser , buf ) ;
capture_resume ( parser , buf ) ;
# line 1278 "upb / json / parser.c"
# line 1301 "upb / json / parser.c"
{
{
int _klen ;
int _klen ;
unsigned int _trans ;
unsigned int _trans ;
@ -1349,118 +1372,118 @@ _match:
switch ( * _acts + + )
switch ( * _acts + + )
{
{
case 0 :
case 0 :
# line 1110 "upb / json / parser.rl"
# line 1133 "upb / json / parser.rl"
{ p - - ; { cs = stack [ - - top ] ; goto _again ; } }
{ p - - ; { cs = stack [ - - top ] ; goto _again ; } }
break ;
break ;
case 1 :
case 1 :
# line 1111 "upb / json / parser.rl"
# line 1134 "upb / json / parser.rl"
{ p - - ; { stack [ top + + ] = cs ; cs = 10 ; goto _again ; } }
{ p - - ; { stack [ top + + ] = cs ; cs = 10 ; goto _again ; } }
break ;
break ;
case 2 :
case 2 :
# line 1115 "upb / json / parser.rl"
# line 1138 "upb / json / parser.rl"
{ start_text ( parser , p ) ; }
{ start_text ( parser , p ) ; }
break ;
break ;
case 3 :
case 3 :
# line 1116 "upb / json / parser.rl"
# line 1139 "upb / json / parser.rl"
{ CHECK_RETURN_TOP ( end_text ( parser , p ) ) ; }
{ CHECK_RETURN_TOP ( end_text ( parser , p ) ) ; }
break ;
break ;
case 4 :
case 4 :
# line 1122 "upb / json / parser.rl"
# line 1145 "upb / json / parser.rl"
{ start_hex ( parser ) ; }
{ start_hex ( parser ) ; }
break ;
break ;
case 5 :
case 5 :
# line 1123 "upb / json / parser.rl"
# line 1146 "upb / json / parser.rl"
{ hexdigit ( parser , p ) ; }
{ hexdigit ( parser , p ) ; }
break ;
break ;
case 6 :
case 6 :
# line 112 4 "upb / json / parser.rl"
# line 1147 "upb / json / parser.rl"
{ CHECK_RETURN_TOP ( end_hex ( parser ) ) ; }
{ CHECK_RETURN_TOP ( end_hex ( parser ) ) ; }
break ;
break ;
case 7 :
case 7 :
# line 1130 "upb / json / parser.rl"
# line 115 3 "upb / json / parser.rl"
{ CHECK_RETURN_TOP ( escape ( parser , p ) ) ; }
{ CHECK_RETURN_TOP ( escape ( parser , p ) ) ; }
break ;
break ;
case 8 :
case 8 :
# line 1136 "upb / json / parser.rl"
# line 1159 "upb / json / parser.rl"
{ p - - ; { cs = stack [ - - top ] ; goto _again ; } }
{ p - - ; { cs = stack [ - - top ] ; goto _again ; } }
break ;
break ;
case 9 :
case 9 :
# line 1139 "upb / json / parser.rl"
# line 1162 "upb / json / parser.rl"
{ { stack [ top + + ] = cs ; cs = 19 ; goto _again ; } }
{ { stack [ top + + ] = cs ; cs = 19 ; goto _again ; } }
break ;
break ;
case 10 :
case 10 :
# line 1141 "upb / json / parser.rl"
# line 116 4 "upb / json / parser.rl"
{ p - - ; { stack [ top + + ] = cs ; cs = 27 ; goto _again ; } }
{ p - - ; { stack [ top + + ] = cs ; cs = 27 ; goto _again ; } }
break ;
break ;
case 11 :
case 11 :
# line 114 6 "upb / json / parser.rl"
# line 1169 "upb / json / parser.rl"
{ start_member ( parser ) ; }
{ start_member ( parser ) ; }
break ;
break ;
case 12 :
case 12 :
# line 114 7 "upb / json / parser.rl"
# line 1170 "upb / json / parser.rl"
{ CHECK_RETURN_TOP ( end_membername ( parser ) ) ; }
{ CHECK_RETURN_TOP ( end_membername ( parser ) ) ; }
break ;
break ;
case 13 :
case 13 :
# line 1150 "upb / json / parser.rl"
# line 1173 "upb / json / parser.rl"
{ end_member ( parser ) ; }
{ end_member ( parser ) ; }
break ;
break ;
case 14 :
case 14 :
# line 1156 "upb / json / parser.rl"
# line 1179 "upb / json / parser.rl"
{ start_object ( parser ) ; }
{ start_object ( parser ) ; }
break ;
break ;
case 15 :
case 15 :
# line 1159 "upb / json / parser.rl"
# line 1182 "upb / json / parser.rl"
{ end_object ( parser ) ; }
{ end_object ( parser ) ; }
break ;
break ;
case 16 :
case 16 :
# line 1165 "upb / json / parser.rl"
# line 1188 "upb / json / parser.rl"
{ CHECK_RETURN_TOP ( start_array ( parser ) ) ; }
{ CHECK_RETURN_TOP ( start_array ( parser ) ) ; }
break ;
break ;
case 17 :
case 17 :
# line 116 9 "upb / json / parser.rl"
# line 1192 "upb / json / parser.rl"
{ end_array ( parser ) ; }
{ end_array ( parser ) ; }
break ;
break ;
case 18 :
case 18 :
# line 1174 "upb / json / parser.rl"
# line 119 7 "upb / json / parser.rl"
{ start_number ( parser , p ) ; }
{ start_number ( parser , p ) ; }
break ;
break ;
case 19 :
case 19 :
# line 1175 "upb / json / parser.rl"
# line 1198 "upb / json / parser.rl"
{ CHECK_RETURN_TOP ( end_number ( parser , p ) ) ; }
{ CHECK_RETURN_TOP ( end_number ( parser , p ) ) ; }
break ;
break ;
case 20 :
case 20 :
# line 1177 "upb / json / parser.rl"
# line 1200 "upb / json / parser.rl"
{ CHECK_RETURN_TOP ( start_stringval ( parser ) ) ; }
{ CHECK_RETURN_TOP ( start_stringval ( parser ) ) ; }
break ;
break ;
case 21 :
case 21 :
# line 1178 "upb / json / parser.rl"
# line 120 1 "upb / json / parser.rl"
{ CHECK_RETURN_TOP ( end_stringval ( parser ) ) ; }
{ CHECK_RETURN_TOP ( end_stringval ( parser ) ) ; }
break ;
break ;
case 22 :
case 22 :
# line 1180 "upb / json / parser.rl"
# line 1203 "upb / json / parser.rl"
{ CHECK_RETURN_TOP ( parser_putbool ( parser , true ) ) ; }
{ CHECK_RETURN_TOP ( parser_putbool ( parser , true ) ) ; }
break ;
break ;
case 23 :
case 23 :
# line 118 2 "upb / json / parser.rl"
# line 1205 "upb / json / parser.rl"
{ CHECK_RETURN_TOP ( parser_putbool ( parser , false ) ) ; }
{ CHECK_RETURN_TOP ( parser_putbool ( parser , false ) ) ; }
break ;
break ;
case 24 :
case 24 :
# line 1184 "upb / json / parser.rl"
# line 1207 "upb / json / parser.rl"
{ /* null value */ }
{ /* null value */ }
break ;
break ;
case 25 :
case 25 :
# line 1186 "upb / json / parser.rl"
# line 1209 "upb / json / parser.rl"
{ CHECK_RETURN_TOP ( start_subobject ( parser ) ) ; }
{ CHECK_RETURN_TOP ( start_subobject ( parser ) ) ; }
break ;
break ;
case 26 :
case 26 :
# line 1187 "upb / json / parser.rl"
# line 1210 "upb / json / parser.rl"
{ end_subobject ( parser ) ; }
{ end_subobject ( parser ) ; }
break ;
break ;
case 27 :
case 27 :
# line 119 2 "upb / json / parser.rl"
# line 1215 "upb / json / parser.rl"
{ p - - ; { cs = stack [ - - top ] ; goto _again ; } }
{ p - - ; { cs = stack [ - - top ] ; goto _again ; } }
break ;
break ;
# line 1464 "upb / json / parser.c"
# line 1487 "upb / json / parser.c"
}
}
}
}
@ -1473,10 +1496,11 @@ _again:
_out : { }
_out : { }
}
}
# line 1219 "upb / json / parser.rl"
# line 1242 "upb / json / parser.rl"
if ( p ! = pe ) {
if ( p ! = pe ) {
upb_status_seterrf ( parser - > status , " Parse error at %s \n " , p ) ;
upb_status_seterrf ( & parser - > status , " Parse error at %s \n " , p ) ;
upb_env_reporterror ( parser - > env , & parser - > status ) ;
} else {
} else {
capture_suspend ( parser , & p ) ;
capture_suspend ( parser , & p ) ;
}
}
@ -1513,13 +1537,13 @@ static void json_parser_reset(upb_json_parser *p) {
/* Emit Ragel initialization of the parser. */
/* Emit Ragel initialization of the parser. */
# line 1517 "upb / json / parser.c"
# line 154 1 "upb / json / parser.c"
{
{
cs = json_start ;
cs = json_start ;
top = 0 ;
top = 0 ;
}
}
# line 125 8 "upb / json / parser.rl"
# line 1282 "upb / json / parser.rl"
p - > current_state = cs ;
p - > current_state = cs ;
p - > parser_top = top ;
p - > parser_top = top ;
accumulate_clear ( p ) ;
accumulate_clear ( p ) ;