| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440 | 
#line 1 "upb/json/parser.rl"/*** upb::json::Parser (upb_json_parser)**** A parser that uses the Ragel State Machine Compiler to generate** the finite automata.**** Ragel only natively handles regular languages, but we can manually** program it a bit to handle context-free languages like JSON, by using** the "fcall" and "fret" constructs.**** This parser can handle the basics, but needs several things to be fleshed** out:**** - handling of unicode escape sequences (including high surrogate pairs).** - properly check and report errors for unknown fields, stack overflow,**   improper array nesting (or lack of nesting).** - handling of base64 sequences with padding characters.** - handling of push-back (non-success returns from sink functions).** - handling of keys/escape-sequences/etc that span input buffers.*/#include <ctype.h>#include <errno.h>#include <float.h>#include <math.h>#include <stdint.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include "upb/json/parser.h"#include "upb/pb/encoder.h"#include "upb/port_def.inc"#define UPB_JSON_MAX_DEPTH 64/* Type of value message */enum {  VALUE_NULLVALUE   = 0,  VALUE_NUMBERVALUE = 1,  VALUE_STRINGVALUE = 2,  VALUE_BOOLVALUE   = 3,  VALUE_STRUCTVALUE = 4,  VALUE_LISTVALUE   = 5};/* Forward declare */static bool is_top_level(upb_json_parser *p);static bool is_wellknown_msg(upb_json_parser *p, upb_wellknowntype_t type);static bool is_wellknown_field(upb_json_parser *p, upb_wellknowntype_t type);static bool is_number_wrapper_object(upb_json_parser *p);static bool does_number_wrapper_start(upb_json_parser *p);static bool does_number_wrapper_end(upb_json_parser *p);static bool is_string_wrapper_object(upb_json_parser *p);static bool does_string_wrapper_start(upb_json_parser *p);static bool does_string_wrapper_end(upb_json_parser *p);static bool does_fieldmask_start(upb_json_parser *p);static bool does_fieldmask_end(upb_json_parser *p);static void start_fieldmask_object(upb_json_parser *p);static void end_fieldmask_object(upb_json_parser *p);static void start_wrapper_object(upb_json_parser *p);static void end_wrapper_object(upb_json_parser *p);static void start_value_object(upb_json_parser *p, int value_type);static void end_value_object(upb_json_parser *p);static void start_listvalue_object(upb_json_parser *p);static void end_listvalue_object(upb_json_parser *p);static void start_structvalue_object(upb_json_parser *p);static void end_structvalue_object(upb_json_parser *p);static void start_object(upb_json_parser *p);static void end_object(upb_json_parser *p);static void start_any_object(upb_json_parser *p, const char *ptr);static bool end_any_object(upb_json_parser *p, const char *ptr);static bool start_subobject(upb_json_parser *p);static void end_subobject(upb_json_parser *p);static void start_member(upb_json_parser *p);static void end_member(upb_json_parser *p);static bool end_membername(upb_json_parser *p);static void start_any_member(upb_json_parser *p, const char *ptr);static void end_any_member(upb_json_parser *p, const char *ptr);static bool end_any_membername(upb_json_parser *p);size_t parse(void *closure, const void *hd, const char *buf, size_t size,             const upb_bufhandle *handle);static bool end(void *closure, const void *hd);static const char eof_ch = 'e';/* stringsink */typedef struct {  upb_byteshandler handler;  upb_bytessink sink;  char *ptr;  size_t len, size;} upb_stringsink;static void *stringsink_start(void *_sink, const void *hd, size_t size_hint) {  upb_stringsink *sink = _sink;  sink->len = 0;  UPB_UNUSED(hd);  UPB_UNUSED(size_hint);  return sink;}static size_t stringsink_string(void *_sink, const void *hd, const char *ptr,                                size_t len, const upb_bufhandle *handle) {  upb_stringsink *sink = _sink;  size_t new_size = sink->size;  UPB_UNUSED(hd);  UPB_UNUSED(handle);  while (sink->len + len > new_size) {    new_size *= 2;  }  if (new_size != sink->size) {    sink->ptr = realloc(sink->ptr, new_size);    sink->size = new_size;  }  memcpy(sink->ptr + sink->len, ptr, len);  sink->len += len;  return len;}void upb_stringsink_init(upb_stringsink *sink) {  upb_byteshandler_init(&sink->handler);  upb_byteshandler_setstartstr(&sink->handler, stringsink_start, NULL);  upb_byteshandler_setstring(&sink->handler, stringsink_string, NULL);  upb_bytessink_reset(&sink->sink, &sink->handler, sink);  sink->size = 32;  sink->ptr = malloc(sink->size);  sink->len = 0;}void upb_stringsink_uninit(upb_stringsink *sink) { free(sink->ptr); }typedef struct {  /* For encoding Any value field in binary format. */  upb_handlercache *encoder_handlercache;  upb_stringsink stringsink;  /* For decoding Any value field in json format. */  upb_json_codecache *parser_codecache;  upb_sink sink;  upb_json_parser *parser;  /* Mark the range of uninterpreted values in json input before type url. */  const char *before_type_url_start;  const char *before_type_url_end;  /* Mark the range of uninterpreted values in json input after type url. */  const char *after_type_url_start;} upb_jsonparser_any_frame;typedef struct {  upb_sink sink;  /* The current message in which we're parsing, and the field whose value we're   * expecting next. */  const upb_msgdef *m;  const upb_fielddef *f;  /* The table mapping json name to fielddef for this message. */  const 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. */  bool is_map;  /* We are in a map-entry message context. This flag is set when parsing the   * value field of a single map entry and indicates to all value-field parsers   * (subobjects, strings, numbers, and bools) that the map-entry submessage   * should end as soon as the value is parsed. */  bool is_mapentry;  /* If |is_map| or |is_mapentry| is true, |mapfield| refers to the parent   * message's map field that we're currently parsing. This differs from |f|   * 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;  /* We are in an Any message context. This flag is set when parsing the Any   * message and indicates to all field parsers (subobjects, strings, numbers,   * and bools) that the parsed field should be serialized as binary data or   * cached (type url not found yet). */  bool is_any;  /* The type of packed message in Any. */  upb_jsonparser_any_frame *any_frame;  /* True if the field to be parsed is unknown. */  bool is_unknown_field;} upb_jsonparser_frame;static void init_frame(upb_jsonparser_frame* frame) {  frame->m = NULL;  frame->f = NULL;  frame->name_table = NULL;  frame->is_repeated = false;  frame->is_map = false;  frame->is_mapentry = false;  frame->mapfield = NULL;  frame->is_any = false;  frame->any_frame = NULL;  frame->is_unknown_field = false;}struct upb_json_parser {  upb_arena *arena;  const upb_json_parsermethod *method;  upb_bytessink input_;  /* Stack to track the JSON scopes we are in. */  upb_jsonparser_frame stack[UPB_JSON_MAX_DEPTH];  upb_jsonparser_frame *top;  upb_jsonparser_frame *limit;  upb_status *status;  /* Ragel's internal parsing stack for the parsing state machine. */  int current_state;  int parser_stack[UPB_JSON_MAX_DEPTH];  int parser_top;  /* The handle for the current buffer. */  const upb_bufhandle *handle;  /* Accumulate buffer.  See details in parser.rl. */  const char *accumulated;  size_t accumulated_len;  char *accumulate_buf;  size_t accumulate_buf_size;  /* Multi-part text data.  See details in parser.rl. */  int multipart_state;  upb_selector_t string_selector;  /* Input capture.  See details in parser.rl. */  const char *capture;  /* Intermediate result of parsing a unicode escape sequence. */  uint32_t digit;  /* For resolve type url in Any. */  const upb_symtab *symtab;  /* Whether to proceed if unknown field is met. */  bool ignore_json_unknown;  /* Cache for parsing timestamp due to base and zone are handled in different   * handlers. */  struct tm tm;};static upb_jsonparser_frame* start_jsonparser_frame(upb_json_parser *p) {  upb_jsonparser_frame *inner;  inner = p->top + 1;  init_frame(inner);  return inner;}struct upb_json_codecache {  upb_arena *arena;  upb_inttable methods;   /* upb_msgdef* -> upb_json_parsermethod* */};struct upb_json_parsermethod {  const upb_json_codecache *cache;  upb_byteshandler input_handler_;  /* Maps json_name -> fielddef */  upb_strtable name_table;};#define PARSER_CHECK_RETURN(x) if (!(x)) return falsestatic upb_jsonparser_any_frame *json_parser_any_frame_new(    upb_json_parser *p) {  upb_jsonparser_any_frame *frame;  frame = upb_arena_malloc(p->arena, sizeof(upb_jsonparser_any_frame));  frame->encoder_handlercache = upb_pb_encoder_newcache();  frame->parser_codecache = upb_json_codecache_new();  frame->parser = NULL;  frame->before_type_url_start = NULL;  frame->before_type_url_end = NULL;  frame->after_type_url_start = NULL;  upb_stringsink_init(&frame->stringsink);  return frame;}static void json_parser_any_frame_set_payload_type(    upb_json_parser *p,    upb_jsonparser_any_frame *frame,    const upb_msgdef *payload_type) {  const upb_handlers *h;  const upb_json_parsermethod *parser_method;  upb_pb_encoder *encoder;  /* Initialize encoder. */  h = upb_handlercache_get(frame->encoder_handlercache, payload_type);  encoder = upb_pb_encoder_create(p->arena, h, frame->stringsink.sink);  /* Initialize parser. */  parser_method = upb_json_codecache_get(frame->parser_codecache, payload_type);  upb_sink_reset(&frame->sink, h, encoder);  frame->parser =      upb_json_parser_create(p->arena, parser_method, p->symtab, frame->sink,                             p->status, p->ignore_json_unknown);}static void json_parser_any_frame_free(upb_jsonparser_any_frame *frame) {  upb_handlercache_free(frame->encoder_handlercache);  upb_json_codecache_free(frame->parser_codecache);  upb_stringsink_uninit(&frame->stringsink);}static bool json_parser_any_frame_has_type_url(  upb_jsonparser_any_frame *frame) {  return frame->parser != NULL;}static bool json_parser_any_frame_has_value_before_type_url(  upb_jsonparser_any_frame *frame) {  return frame->before_type_url_start != frame->before_type_url_end;}static bool json_parser_any_frame_has_value_after_type_url(  upb_jsonparser_any_frame *frame) {  return frame->after_type_url_start != NULL;}static bool json_parser_any_frame_has_value(  upb_jsonparser_any_frame *frame) {  return json_parser_any_frame_has_value_before_type_url(frame) ||         json_parser_any_frame_has_value_after_type_url(frame);}static void json_parser_any_frame_set_before_type_url_end(    upb_jsonparser_any_frame *frame,    const char *ptr) {  if (frame->parser == NULL) {    frame->before_type_url_end = ptr;  }}static void json_parser_any_frame_set_after_type_url_start_once(    upb_jsonparser_any_frame *frame,    const char *ptr) {  if (json_parser_any_frame_has_type_url(frame) &&      frame->after_type_url_start == NULL) {    frame->after_type_url_start = ptr;  }}/* Used to signal that a capture has been suspended. */static char suspend_capture;static upb_selector_t getsel_for_handlertype(upb_json_parser *p,                                             upb_handlertype_t type) {  upb_selector_t sel;  bool ok = upb_handlers_getselector(p->top->f, type, &sel);  UPB_ASSERT(ok);  return sel;}static upb_selector_t parser_getsel(upb_json_parser *p) {  return getsel_for_handlertype(      p, upb_handlers_getprimitivehandlertype(p->top->f));}static bool check_stack(upb_json_parser *p) {  if ((p->top + 1) == p->limit) {    upb_status_seterrmsg(p->status, "Nesting too deep");    return false;  }  return true;}static void set_name_table(upb_json_parser *p, upb_jsonparser_frame *frame) {  upb_value v;  const upb_json_codecache *cache = p->method->cache;  bool ok;  const upb_json_parsermethod *method;  ok = upb_inttable_lookupptr(&cache->methods, frame->m, &v);  UPB_ASSERT(ok);  method = upb_value_getconstptr(v);  frame->name_table = &method->name_table;}/* There are GCC/Clang built-ins for overflow checking which we could start * using if there was any performance benefit to it. */static bool checked_add(size_t a, size_t b, size_t *c) {  if (SIZE_MAX - a < b) return false;  *c = a + b;  return true;}static size_t saturating_multiply(size_t a, size_t b) {  /* size_t is unsigned, so this is defined behavior even on overflow. */  size_t ret = a * b;  if (b != 0 && ret / b != a) {    ret = SIZE_MAX;  }  return ret;}/* Base64 decoding ************************************************************//* TODO(haberman): make this streaming. */static const signed char b64table[] = {  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      62/*+*/, -1,      -1,      -1,      63/*/ */,  52/*0*/, 53/*1*/, 54/*2*/, 55/*3*/, 56/*4*/, 57/*5*/, 58/*6*/, 59/*7*/,  60/*8*/, 61/*9*/, -1,      -1,      -1,      -1,      -1,      -1,  -1,       0/*A*/,  1/*B*/,  2/*C*/,  3/*D*/,  4/*E*/,  5/*F*/,  6/*G*/,  07/*H*/,  8/*I*/,  9/*J*/, 10/*K*/, 11/*L*/, 12/*M*/, 13/*N*/, 14/*O*/,  15/*P*/, 16/*Q*/, 17/*R*/, 18/*S*/, 19/*T*/, 20/*U*/, 21/*V*/, 22/*W*/,  23/*X*/, 24/*Y*/, 25/*Z*/, -1,      -1,      -1,      -1,      -1,  -1,      26/*a*/, 27/*b*/, 28/*c*/, 29/*d*/, 30/*e*/, 31/*f*/, 32/*g*/,  33/*h*/, 34/*i*/, 35/*j*/, 36/*k*/, 37/*l*/, 38/*m*/, 39/*n*/, 40/*o*/,  41/*p*/, 42/*q*/, 43/*r*/, 44/*s*/, 45/*t*/, 46/*u*/, 47/*v*/, 48/*w*/,  49/*x*/, 50/*y*/, 51/*z*/, -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,  -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1};/* Returns the table value sign-extended to 32 bits.  Knowing that the upper * bits will be 1 for unrecognized characters makes it easier to check for * this error condition later (see below). */int32_t b64lookup(unsigned char ch) { return b64table[ch]; }/* Returns true if the given character is not a valid base64 character or * padding. */bool nonbase64(unsigned char ch) { return b64lookup(ch) == -1 && ch != '='; }static bool base64_push(upb_json_parser *p, upb_selector_t sel, const char *ptr,                        size_t len) {  const char *limit = ptr + len;  for (; ptr < limit; ptr += 4) {    uint32_t val;    char output[3];    if (limit - ptr < 4) {      upb_status_seterrf(p->status,                         "Base64 input for bytes field not a multiple of 4: %s",                         upb_fielddef_name(p->top->f));      return false;    }    val = b64lookup(ptr[0]) << 18 |          b64lookup(ptr[1]) << 12 |          b64lookup(ptr[2]) << 6  |          b64lookup(ptr[3]);    /* Test the upper bit; returns true if any of the characters returned -1. */    if (val & 0x80000000) {      goto otherchar;    }    output[0] = val >> 16;    output[1] = (val >> 8) & 0xff;    output[2] = val & 0xff;    upb_sink_putstring(p->top->sink, sel, output, 3, NULL);  }  return true;otherchar:  if (nonbase64(ptr[0]) || nonbase64(ptr[1]) || nonbase64(ptr[2]) ||      nonbase64(ptr[3]) ) {    upb_status_seterrf(p->status,                       "Non-base64 characters in bytes field: %s",                       upb_fielddef_name(p->top->f));    return false;  } if (ptr[2] == '=') {    uint32_t val;    char output;    /* Last group contains only two input bytes, one output byte. */    if (ptr[0] == '=' || ptr[1] == '=' || ptr[3] != '=') {      goto badpadding;    }    val = b64lookup(ptr[0]) << 18 |          b64lookup(ptr[1]) << 12;    UPB_ASSERT(!(val & 0x80000000));    output = val >> 16;    upb_sink_putstring(p->top->sink, sel, &output, 1, NULL);    return true;  } else {    uint32_t val;    char output[2];    /* Last group contains only three input bytes, two output bytes. */    if (ptr[0] == '=' || ptr[1] == '=' || ptr[2] == '=') {      goto badpadding;    }    val = b64lookup(ptr[0]) << 18 |          b64lookup(ptr[1]) << 12 |          b64lookup(ptr[2]) << 6;    output[0] = val >> 16;    output[1] = (val >> 8) & 0xff;    upb_sink_putstring(p->top->sink, sel, output, 2, NULL);    return true;  }badpadding:  upb_status_seterrf(p->status,                     "Incorrect base64 padding for field: %s (%.*s)",                     upb_fielddef_name(p->top->f),                     4, ptr);  return false;}/* Accumulate buffer **********************************************************//* Functionality for accumulating a buffer. * * Some parts of the parser need an entire value as a contiguous string.  For * example, to look up a member name in a hash table, or to turn a string into * a number, the relevant library routines need the input string to be in * contiguous memory, even if the value spanned two or more buffers in the * input.  These routines handle that. * * In the common case we can just point to the input buffer to get this * contiguous string and avoid any actual copy.  So we optimistically begin * this way.  But there are a few cases where we must instead copy into a * separate buffer: * *   1. The string was not contiguous in the input (it spanned buffers). * *   2. The string included escape sequences that need to be interpreted to get *      the true value in a contiguous buffer. */static void assert_accumulate_empty(upb_json_parser *p) {  UPB_ASSERT(p->accumulated == NULL);  UPB_ASSERT(p->accumulated_len == 0);}static void accumulate_clear(upb_json_parser *p) {  p->accumulated = NULL;  p->accumulated_len = 0;}/* Used internally by accumulate_append(). */static bool accumulate_realloc(upb_json_parser *p, size_t need) {  void *mem;  size_t old_size = p->accumulate_buf_size;  size_t new_size = UPB_MAX(old_size, 128);  while (new_size < need) {    new_size = saturating_multiply(new_size, 2);  }  mem = upb_arena_realloc(p->arena, p->accumulate_buf, old_size, new_size);  if (!mem) {    upb_status_seterrmsg(p->status, "Out of memory allocating buffer.");    return false;  }  p->accumulate_buf = mem;  p->accumulate_buf_size = new_size;  return true;}/* Logically appends the given data to the append buffer. * If "can_alias" is true, we will try to avoid actually copying, but the buffer * must be valid until the next accumulate_append() call (if any). */static bool accumulate_append(upb_json_parser *p, const char *buf, size_t len,                              bool can_alias) {  size_t need;  if (!p->accumulated && can_alias) {    p->accumulated = buf;    p->accumulated_len = len;    return true;  }  if (!checked_add(p->accumulated_len, len, &need)) {    upb_status_seterrmsg(p->status, "Integer overflow.");    return false;  }  if (need > p->accumulate_buf_size && !accumulate_realloc(p, need)) {    return false;  }  if (p->accumulated != p->accumulate_buf) {    memcpy(p->accumulate_buf, p->accumulated, p->accumulated_len);    p->accumulated = p->accumulate_buf;  }  memcpy(p->accumulate_buf + p->accumulated_len, buf, len);  p->accumulated_len += len;  return true;}/* Returns a pointer to the data accumulated since the last accumulate_clear() * call, and writes the length to *len.  This with point either to the input * buffer or a temporary accumulate buffer. */static const char *accumulate_getptr(upb_json_parser *p, size_t *len) {  UPB_ASSERT(p->accumulated);  *len = p->accumulated_len;  return p->accumulated;}/* Mult-part text data ********************************************************//* When we have text data in the input, it can often come in multiple segments. * For example, there may be some raw string data followed by an escape * sequence.  The two segments are processed with different logic.  Also buffer * seams in the input can cause multiple segments. * * As we see segments, there are two main cases for how we want to process them: * *  1. we want to push the captured input directly to string handlers. * *  2. we need to accumulate all the parts into a contiguous buffer for further *     processing (field name lookup, string->number conversion, etc). *//* This is the set of states for p->multipart_state. */enum {  /* We are not currently processing multipart data. */  MULTIPART_INACTIVE = 0,  /* We are processing multipart data by accumulating it into a contiguous   * buffer. */  MULTIPART_ACCUMULATE = 1,  /* We are processing multipart data by pushing each part directly to the   * current string handlers. */  MULTIPART_PUSHEAGERLY = 2};/* Start a multi-part text value where we accumulate the data for processing at * the end. */static void multipart_startaccum(upb_json_parser *p) {  assert_accumulate_empty(p);  UPB_ASSERT(p->multipart_state == MULTIPART_INACTIVE);  p->multipart_state = MULTIPART_ACCUMULATE;}/* Start a multi-part text value where we immediately push text data to a string * value with the given selector. */static void multipart_start(upb_json_parser *p, upb_selector_t sel) {  assert_accumulate_empty(p);  UPB_ASSERT(p->multipart_state == MULTIPART_INACTIVE);  p->multipart_state = MULTIPART_PUSHEAGERLY;  p->string_selector = sel;}static bool multipart_text(upb_json_parser *p, const char *buf, size_t len,                           bool can_alias) {  switch (p->multipart_state) {    case MULTIPART_INACTIVE:      upb_status_seterrmsg(          p->status, "Internal error: unexpected state MULTIPART_INACTIVE");      return false;    case MULTIPART_ACCUMULATE:      if (!accumulate_append(p, buf, len, can_alias)) {        return false;      }      break;    case MULTIPART_PUSHEAGERLY: {      const upb_bufhandle *handle = can_alias ? p->handle : NULL;      upb_sink_putstring(p->top->sink, p->string_selector, buf, len, handle);      break;    }  }  return true;}/* Note: this invalidates the accumulate buffer!  Call only after reading its * contents. */static void multipart_end(upb_json_parser *p) {  UPB_ASSERT(p->multipart_state != MULTIPART_INACTIVE);  p->multipart_state = MULTIPART_INACTIVE;  accumulate_clear(p);}/* Input capture **************************************************************//* Functionality for capturing a region of the input as text.  Gracefully * handles the case where a buffer seam occurs in the middle of the captured * region. */static void capture_begin(upb_json_parser *p, const char *ptr) {  UPB_ASSERT(p->multipart_state != MULTIPART_INACTIVE);  UPB_ASSERT(p->capture == NULL);  p->capture = ptr;}static bool capture_end(upb_json_parser *p, const char *ptr) {  UPB_ASSERT(p->capture);  if (multipart_text(p, p->capture, ptr - p->capture, true)) {    p->capture = NULL;    return true;  } else {    return false;  }}/* This is called at the end of each input buffer (ie. when we have hit a * buffer seam).  If we are in the middle of capturing the input, this * processes the unprocessed capture region. */static void capture_suspend(upb_json_parser *p, const char **ptr) {  if (!p->capture) return;  if (multipart_text(p, p->capture, *ptr - p->capture, false)) {    /* We use this as a signal that we were in the middle of capturing, and     * that capturing should resume at the beginning of the next buffer.     *      * We can't use *ptr here, because we have no guarantee that this pointer     * will be valid when we resume (if the underlying memory is freed, then     * using the pointer at all, even to compare to NULL, is likely undefined     * behavior). */    p->capture = &suspend_capture;  } else {    /* Need to back up the pointer to the beginning of the capture, since     * we were not able to actually preserve it. */    *ptr = p->capture;  }}static void capture_resume(upb_json_parser *p, const char *ptr) {  if (p->capture) {    UPB_ASSERT(p->capture == &suspend_capture);    p->capture = ptr;  }}/* Callbacks from the parser **************************************************//* These are the functions called directly from the parser itself. * We define these in the same order as their declarations in the parser. */static char escape_char(char in) {  switch (in) {    case 'r': return '\r';    case 't': return '\t';    case 'n': return '\n';    case 'f': return '\f';    case 'b': return '\b';    case '/': return '/';    case '"': return '"';    case '\\': return '\\';    default:      UPB_ASSERT(0);      return 'x';  }}static bool escape(upb_json_parser *p, const char *ptr) {  char ch = escape_char(*ptr);  return multipart_text(p, &ch, 1, false);}static void start_hex(upb_json_parser *p) {  p->digit = 0;}static void hexdigit(upb_json_parser *p, const char *ptr) {  char ch = *ptr;  p->digit <<= 4;  if (ch >= '0' && ch <= '9') {    p->digit += (ch - '0');  } else if (ch >= 'a' && ch <= 'f') {    p->digit += ((ch - 'a') + 10);  } else {    UPB_ASSERT(ch >= 'A' && ch <= 'F');    p->digit += ((ch - 'A') + 10);  }}static bool end_hex(upb_json_parser *p) {  uint32_t codepoint = p->digit;  /* emit the codepoint as UTF-8. */  char utf8[3]; /* support \u0000 -- \uFFFF -- need only three bytes. */  int length = 0;  if (codepoint <= 0x7F) {    utf8[0] = codepoint;    length = 1;  } else if (codepoint <= 0x07FF) {    utf8[1] = (codepoint & 0x3F) | 0x80;    codepoint >>= 6;    utf8[0] = (codepoint & 0x1F) | 0xC0;    length = 2;  } else /* codepoint <= 0xFFFF */ {    utf8[2] = (codepoint & 0x3F) | 0x80;    codepoint >>= 6;    utf8[1] = (codepoint & 0x3F) | 0x80;    codepoint >>= 6;    utf8[0] = (codepoint & 0x0F) | 0xE0;    length = 3;  }  /* TODO(haberman): Handle high surrogates: if codepoint is a high surrogate   * we have to wait for the next escape to get the full code point). */  return multipart_text(p, utf8, length, false);}static void start_text(upb_json_parser *p, const char *ptr) {  capture_begin(p, ptr);}static bool end_text(upb_json_parser *p, const char *ptr) {  return capture_end(p, ptr);}static bool start_number(upb_json_parser *p, const char *ptr) {  if (is_top_level(p)) {    if (is_number_wrapper_object(p)) {      start_wrapper_object(p);    } else if (is_wellknown_msg(p, UPB_WELLKNOWN_VALUE)) {      start_value_object(p, VALUE_NUMBERVALUE);    } else {      return false;    }  } else if (does_number_wrapper_start(p)) {    if (!start_subobject(p)) {      return false;    }    start_wrapper_object(p);  } else if (is_wellknown_field(p, UPB_WELLKNOWN_VALUE)) {    if (!start_subobject(p)) {      return false;    }    start_value_object(p, VALUE_NUMBERVALUE);  }  multipart_startaccum(p);  capture_begin(p, ptr);  return true;}static bool parse_number(upb_json_parser *p, bool is_quoted);static bool end_number_nontop(upb_json_parser *p, const char *ptr) {  if (!capture_end(p, ptr)) {    return false;  }  if (p->top->f == NULL) {    multipart_end(p);    return true;  }  return parse_number(p, false);}static bool end_number(upb_json_parser *p, const char *ptr) {  if (!end_number_nontop(p, ptr)) {    return false;  }  if (does_number_wrapper_end(p)) {    end_wrapper_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }    return true;  }  if (is_wellknown_msg(p, UPB_WELLKNOWN_VALUE)) {    end_value_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }    return true;  }  return true;}/* |buf| is NULL-terminated. |buf| itself will never include quotes; * |is_quoted| tells us whether this text originally appeared inside quotes. */static bool parse_number_from_buffer(upb_json_parser *p, const char *buf,                                     bool is_quoted) {  size_t len = strlen(buf);  const char *bufend = buf + len;  char *end;  upb_fieldtype_t type = upb_fielddef_type(p->top->f);  double val;  double dummy;  double inf = UPB_INFINITY;  errno = 0;  if (len == 0 || buf[0] == ' ') {    return false;  }  /* For integer types, first try parsing with integer-specific routines.   * If these succeed, they will be more accurate for int64/uint64 than   * strtod().   */  switch (type) {    case UPB_TYPE_ENUM:    case UPB_TYPE_INT32: {      long val = strtol(buf, &end, 0);      if (errno == ERANGE || end != bufend) {        break;      } else if (val > INT32_MAX || val < INT32_MIN) {        return false;      } else {        upb_sink_putint32(p->top->sink, parser_getsel(p), val);        return true;      }    }    case UPB_TYPE_UINT32: {      unsigned long val = strtoul(buf, &end, 0);      if (end != bufend) {        break;      } else if (val > UINT32_MAX || errno == ERANGE) {        return false;      } else {        upb_sink_putuint32(p->top->sink, parser_getsel(p), val);        return true;      }    }    /* XXX: We can't handle [u]int64 properly on 32-bit machines because     * strto[u]ll isn't in C89. */    case UPB_TYPE_INT64: {      long val = strtol(buf, &end, 0);      if (errno == ERANGE || end != bufend) {        break;      } else {        upb_sink_putint64(p->top->sink, parser_getsel(p), val);        return true;      }    }    case UPB_TYPE_UINT64: {      unsigned long val = strtoul(p->accumulated, &end, 0);      if (end != bufend) {        break;      } else if (errno == ERANGE) {        return false;      } else {        upb_sink_putuint64(p->top->sink, parser_getsel(p), val);        return true;      }    }    default:      break;  }  if (type != UPB_TYPE_DOUBLE && type != UPB_TYPE_FLOAT && is_quoted) {    /* Quoted numbers for integer types are not allowed to be in double form. */    return false;  }  if (len == strlen("Infinity") && strcmp(buf, "Infinity") == 0) {    /* C89 does not have an INFINITY macro. */    val = inf;  } else if (len == strlen("-Infinity") && strcmp(buf, "-Infinity") == 0) {    val = -inf;  } else {    val = strtod(buf, &end);    if (errno == ERANGE || end != bufend) {      return false;    }  }  switch (type) {#define CASE(capitaltype, smalltype, ctype, min, max)                     \    case UPB_TYPE_ ## capitaltype: {                                      \      if (modf(val, &dummy) != 0 || val > max || val < min) {             \        return false;                                                     \      } else {                                                            \        upb_sink_put ## smalltype(p->top->sink, parser_getsel(p),        \                                  (ctype)val);                            \        return true;                                                      \      }                                                                   \      break;                                                              \    }    case UPB_TYPE_ENUM:    CASE(INT32, int32, int32_t, INT32_MIN, INT32_MAX);    CASE(INT64, int64, int64_t, INT64_MIN, INT64_MAX);    CASE(UINT32, uint32, uint32_t, 0, UINT32_MAX);    CASE(UINT64, uint64, uint64_t, 0, UINT64_MAX);#undef CASE    case UPB_TYPE_DOUBLE:      upb_sink_putdouble(p->top->sink, parser_getsel(p), val);      return true;    case UPB_TYPE_FLOAT:      if ((val > FLT_MAX || val < -FLT_MAX) && val != inf && val != -inf) {        return false;      } else {        upb_sink_putfloat(p->top->sink, parser_getsel(p), val);        return true;      }    default:      return false;  }}static bool parse_number(upb_json_parser *p, bool is_quoted) {  size_t len;  const char *buf;  /* strtol() and friends unfortunately do not support specifying the length of   * the input string, so we need to force a copy into a NULL-terminated buffer. */  if (!multipart_text(p, "\0", 1, false)) {    return false;  }  buf = accumulate_getptr(p, &len);  if (parse_number_from_buffer(p, buf, is_quoted)) {    multipart_end(p);    return true;  } else {    upb_status_seterrf(p->status, "error parsing number: %s", buf);    multipart_end(p);    return false;  }}static bool parser_putbool(upb_json_parser *p, bool val) {  bool ok;  if (p->top->f == NULL) {    return true;  }  if (upb_fielddef_type(p->top->f) != UPB_TYPE_BOOL) {    upb_status_seterrf(p->status,                       "Boolean value specified for non-bool field: %s",                       upb_fielddef_name(p->top->f));    return false;  }  ok = upb_sink_putbool(p->top->sink, parser_getsel(p), val);  UPB_ASSERT(ok);  return true;}static bool end_bool(upb_json_parser *p, bool val) {  if (is_top_level(p)) {    if (is_wellknown_msg(p, UPB_WELLKNOWN_BOOLVALUE)) {      start_wrapper_object(p);    } else if (is_wellknown_msg(p, UPB_WELLKNOWN_VALUE)) {      start_value_object(p, VALUE_BOOLVALUE);    } else {      return false;    }  } else if (is_wellknown_field(p, UPB_WELLKNOWN_BOOLVALUE)) {    if (!start_subobject(p)) {      return false;    }    start_wrapper_object(p);  } else if (is_wellknown_field(p, UPB_WELLKNOWN_VALUE)) {    if (!start_subobject(p)) {      return false;    }    start_value_object(p, VALUE_BOOLVALUE);  }  if (p->top->is_unknown_field) {    return true;  }  if (!parser_putbool(p, val)) {    return false;  }  if (is_wellknown_msg(p, UPB_WELLKNOWN_BOOLVALUE)) {    end_wrapper_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }    return true;  }  if (is_wellknown_msg(p, UPB_WELLKNOWN_VALUE)) {    end_value_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }    return true;  }  return true;}static bool end_null(upb_json_parser *p) {  const char *zero_ptr = "0";  if (is_top_level(p)) {    if (is_wellknown_msg(p, UPB_WELLKNOWN_VALUE)) {      start_value_object(p, VALUE_NULLVALUE);    } else {      return true;    }  } else if (is_wellknown_field(p, UPB_WELLKNOWN_VALUE)) {    if (!start_subobject(p)) {      return false;    }    start_value_object(p, VALUE_NULLVALUE);  } else {    return true;  }  /* Fill null_value field. */  multipart_startaccum(p);  capture_begin(p, zero_ptr);  capture_end(p, zero_ptr + 1);  parse_number(p, false);  end_value_object(p);  if (!is_top_level(p)) {    end_subobject(p);  }  return true;}static bool start_any_stringval(upb_json_parser *p) {  multipart_startaccum(p);  return true;}static bool start_stringval(upb_json_parser *p) {  if (is_top_level(p)) {    if (is_string_wrapper_object(p) ||        is_number_wrapper_object(p)) {      start_wrapper_object(p);    } else if (is_wellknown_msg(p, UPB_WELLKNOWN_FIELDMASK)) {      start_fieldmask_object(p);      return true;    } else if (is_wellknown_msg(p, UPB_WELLKNOWN_TIMESTAMP) ||               is_wellknown_msg(p, UPB_WELLKNOWN_DURATION)) {      start_object(p);    } else if (is_wellknown_msg(p, UPB_WELLKNOWN_VALUE)) {      start_value_object(p, VALUE_STRINGVALUE);    } else {      return false;    }  } else if (does_string_wrapper_start(p) ||             does_number_wrapper_start(p)) {    if (!start_subobject(p)) {      return false;    }    start_wrapper_object(p);  } else if (does_fieldmask_start(p)) {    if (!start_subobject(p)) {      return false;    }    start_fieldmask_object(p);    return true;  } else if (is_wellknown_field(p, UPB_WELLKNOWN_TIMESTAMP) ||             is_wellknown_field(p, UPB_WELLKNOWN_DURATION)) {    if (!start_subobject(p)) {      return false;    }    start_object(p);  } else if (is_wellknown_field(p, UPB_WELLKNOWN_VALUE)) {    if (!start_subobject(p)) {      return false;    }    start_value_object(p, VALUE_STRINGVALUE);  }  if (p->top->f == NULL) {    multipart_startaccum(p);    return true;  }  if (p->top->is_any) {    return start_any_stringval(p);  }  if (upb_fielddef_isstring(p->top->f)) {    upb_jsonparser_frame *inner;    upb_selector_t sel;    if (!check_stack(p)) return false;    /* Start a new parser frame: parser frames correspond one-to-one with     * handler frames, and string events occur in a sub-frame. */    inner = start_jsonparser_frame(p);    sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSTR);    upb_sink_startstr(p->top->sink, sel, 0, &inner->sink);    inner->m = p->top->m;    inner->f = p->top->f;    p->top = inner;    if (upb_fielddef_type(p->top->f) == UPB_TYPE_STRING) {      /* For STRING fields we push data directly to the handlers as it is       * parsed.  We don't do this yet for BYTES fields, because our base64       * decoder is not streaming.       *       * TODO(haberman): make base64 decoding streaming also. */      multipart_start(p, getsel_for_handlertype(p, UPB_HANDLER_STRING));      return true;    } else {      multipart_startaccum(p);      return true;    }  } else if (upb_fielddef_type(p->top->f) != UPB_TYPE_BOOL &&             upb_fielddef_type(p->top->f) != UPB_TYPE_MESSAGE) {    /* No need to push a frame -- numeric values in quotes remain in the     * current parser frame.  These values must accmulate so we can convert     * them all at once at the end. */    multipart_startaccum(p);    return true;  } else {    upb_status_seterrf(p->status,                       "String specified for bool or submessage field: %s",                       upb_fielddef_name(p->top->f));    return false;  }}static bool end_any_stringval(upb_json_parser *p) {  size_t len;  const char *buf = accumulate_getptr(p, &len);  /* Set type_url */  upb_selector_t sel;  upb_jsonparser_frame *inner;  if (!check_stack(p)) return false;  inner = p->top + 1;  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSTR);  upb_sink_startstr(p->top->sink, sel, 0, &inner->sink);  sel = getsel_for_handlertype(p, UPB_HANDLER_STRING);  upb_sink_putstring(inner->sink, sel, buf, len, NULL);  sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSTR);  upb_sink_endstr(inner->sink, sel);  multipart_end(p);  /* Resolve type url */  if (strncmp(buf, "type.googleapis.com/", 20) == 0 && len > 20) {    const upb_msgdef *payload_type = NULL;    buf += 20;    len -= 20;    payload_type = upb_symtab_lookupmsg2(p->symtab, buf, len);    if (payload_type == NULL) {      upb_status_seterrf(          p->status, "Cannot find packed type: %.*s\n", (int)len, buf);      return false;    }    json_parser_any_frame_set_payload_type(p, p->top->any_frame, payload_type);    return true;  } else {    upb_status_seterrf(        p->status, "Invalid type url: %.*s\n", (int)len, buf);    return false;  }}static bool end_stringval_nontop(upb_json_parser *p) {  bool ok = true;  if (is_wellknown_msg(p, UPB_WELLKNOWN_TIMESTAMP) ||      is_wellknown_msg(p, UPB_WELLKNOWN_DURATION)) {    multipart_end(p);    return true;  }  if (p->top->f == NULL) {    multipart_end(p);    return true;  }  if (p->top->is_any) {    return end_any_stringval(p);  }  switch (upb_fielddef_type(p->top->f)) {    case UPB_TYPE_BYTES:      if (!base64_push(p, getsel_for_handlertype(p, UPB_HANDLER_STRING),                       p->accumulated, p->accumulated_len)) {        return false;      }      /* Fall through. */    case UPB_TYPE_STRING: {      upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSTR);      upb_sink_endstr(p->top->sink, sel);      p->top--;      break;    }    case UPB_TYPE_ENUM: {      /* Resolve enum symbolic name to integer value. */      const upb_enumdef *enumdef = upb_fielddef_enumsubdef(p->top->f);      size_t len;      const char *buf = accumulate_getptr(p, &len);      int32_t int_val = 0;      ok = upb_enumdef_ntoi(enumdef, buf, len, &int_val);      if (ok) {        upb_selector_t sel = parser_getsel(p);        upb_sink_putint32(p->top->sink, sel, int_val);      } else {        upb_status_seterrf(p->status, "Enum value unknown: '%.*s'", len, buf);      }      break;    }    case UPB_TYPE_INT32:    case UPB_TYPE_INT64:    case UPB_TYPE_UINT32:    case UPB_TYPE_UINT64:    case UPB_TYPE_DOUBLE:    case UPB_TYPE_FLOAT:      ok = parse_number(p, true);      break;    default:      UPB_ASSERT(false);      upb_status_seterrmsg(p->status, "Internal error in JSON decoder");      ok = false;      break;  }  multipart_end(p);  return ok;}static bool end_stringval(upb_json_parser *p) {  /* FieldMask's stringvals have been ended when handling them. Only need to   * close FieldMask here.*/  if (does_fieldmask_end(p)) {    end_fieldmask_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }    return true;  }  if (!end_stringval_nontop(p)) {    return false;  }  if (does_string_wrapper_end(p) ||      does_number_wrapper_end(p)) {    end_wrapper_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }    return true;  }  if (is_wellknown_msg(p, UPB_WELLKNOWN_VALUE)) {    end_value_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }    return true;  }  if (is_wellknown_msg(p, UPB_WELLKNOWN_TIMESTAMP) ||      is_wellknown_msg(p, UPB_WELLKNOWN_DURATION) ||      is_wellknown_msg(p, UPB_WELLKNOWN_FIELDMASK)) {    end_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }    return true;  }  return true;}static void start_duration_base(upb_json_parser *p, const char *ptr) {  capture_begin(p, ptr);}static bool end_duration_base(upb_json_parser *p, const char *ptr) {  size_t len;  const char *buf;  char seconds_buf[14];  char nanos_buf[12];  char *end;  int64_t seconds = 0;  int32_t nanos = 0;  double val = 0.0;  const char *seconds_membername = "seconds";  const char *nanos_membername = "nanos";  size_t fraction_start;  if (!capture_end(p, ptr)) {    return false;  }  buf = accumulate_getptr(p, &len);  memset(seconds_buf, 0, 14);  memset(nanos_buf, 0, 12);  /* Find out base end. The maximus duration is 315576000000, which cannot be   * represented by double without losing precision. Thus, we need to handle   * fraction and base separately. */  for (fraction_start = 0; fraction_start < len && buf[fraction_start] != '.';       fraction_start++);  /* Parse base */  memcpy(seconds_buf, buf, fraction_start);  seconds = strtol(seconds_buf, &end, 10);  if (errno == ERANGE || end != seconds_buf + fraction_start) {    upb_status_seterrf(p->status, "error parsing duration: %s",                       seconds_buf);    return false;  }  if (seconds > 315576000000) {    upb_status_seterrf(p->status, "error parsing duration: "                                   "maximum acceptable value is "                                   "315576000000");    return false;  }  if (seconds < -315576000000) {    upb_status_seterrf(p->status, "error parsing duration: "                                   "minimum acceptable value is "                                   "-315576000000");    return false;  }  /* Parse fraction */  nanos_buf[0] = '0';  memcpy(nanos_buf + 1, buf + fraction_start, len - fraction_start);  val = strtod(nanos_buf, &end);  if (errno == ERANGE || end != nanos_buf + len - fraction_start + 1) {    upb_status_seterrf(p->status, "error parsing duration: %s",                       nanos_buf);    return false;  }  nanos = val * 1000000000;  if (seconds < 0) nanos = -nanos;  /* Clean up buffer */  multipart_end(p);  /* Set seconds */  start_member(p);  capture_begin(p, seconds_membername);  capture_end(p, seconds_membername + 7);  end_membername(p);  upb_sink_putint64(p->top->sink, parser_getsel(p), seconds);  end_member(p);  /* Set nanos */  start_member(p);  capture_begin(p, nanos_membername);  capture_end(p, nanos_membername + 5);  end_membername(p);  upb_sink_putint32(p->top->sink, parser_getsel(p), nanos);  end_member(p);  /* Continue previous arena */  multipart_startaccum(p);  return true;}static int parse_timestamp_number(upb_json_parser *p) {  size_t len;  const char *buf;  int val;  /* atoi() and friends unfortunately do not support specifying the length of   * the input string, so we need to force a copy into a NULL-terminated buffer. */  multipart_text(p, "\0", 1, false);  buf = accumulate_getptr(p, &len);  val = atoi(buf);  multipart_end(p);  multipart_startaccum(p);  return val;}static void start_year(upb_json_parser *p, const char *ptr) {  capture_begin(p, ptr);}static bool end_year(upb_json_parser *p, const char *ptr) {  if (!capture_end(p, ptr)) {    return false;  }  p->tm.tm_year = parse_timestamp_number(p) - 1900;  return true;}static void start_month(upb_json_parser *p, const char *ptr) {  capture_begin(p, ptr);}static bool end_month(upb_json_parser *p, const char *ptr) {  if (!capture_end(p, ptr)) {    return false;  }  p->tm.tm_mon = parse_timestamp_number(p) - 1;  return true;}static void start_day(upb_json_parser *p, const char *ptr) {  capture_begin(p, ptr);}static bool end_day(upb_json_parser *p, const char *ptr) {  if (!capture_end(p, ptr)) {    return false;  }  p->tm.tm_mday = parse_timestamp_number(p);  return true;}static void start_hour(upb_json_parser *p, const char *ptr) {  capture_begin(p, ptr);}static bool end_hour(upb_json_parser *p, const char *ptr) {  if (!capture_end(p, ptr)) {    return false;  }  p->tm.tm_hour = parse_timestamp_number(p);  return true;}static void start_minute(upb_json_parser *p, const char *ptr) {  capture_begin(p, ptr);}static bool end_minute(upb_json_parser *p, const char *ptr) {  if (!capture_end(p, ptr)) {    return false;  }  p->tm.tm_min = parse_timestamp_number(p);  return true;}static void start_second(upb_json_parser *p, const char *ptr) {  capture_begin(p, ptr);}static bool end_second(upb_json_parser *p, const char *ptr) {  if (!capture_end(p, ptr)) {    return false;  }  p->tm.tm_sec = parse_timestamp_number(p);  return true;}static void start_timestamp_base(upb_json_parser *p) {  memset(&p->tm, 0, sizeof(struct tm));}static void start_timestamp_fraction(upb_json_parser *p, const char *ptr) {  capture_begin(p, ptr);}static bool end_timestamp_fraction(upb_json_parser *p, const char *ptr) {  size_t len;  const char *buf;  char nanos_buf[12];  char *end;  double val = 0.0;  int32_t nanos;  const char *nanos_membername = "nanos";  memset(nanos_buf, 0, 12);  if (!capture_end(p, ptr)) {    return false;  }  buf = accumulate_getptr(p, &len);  if (len > 10) {    upb_status_seterrf(p->status,        "error parsing timestamp: at most 9-digit fraction.");    return false;  }  /* Parse nanos */  nanos_buf[0] = '0';  memcpy(nanos_buf + 1, buf, len);  val = strtod(nanos_buf, &end);  if (errno == ERANGE || end != nanos_buf + len + 1) {    upb_status_seterrf(p->status, "error parsing timestamp nanos: %s",                       nanos_buf);    return false;  }  nanos = val * 1000000000;  /* Clean up previous environment */  multipart_end(p);  /* Set nanos */  start_member(p);  capture_begin(p, nanos_membername);  capture_end(p, nanos_membername + 5);  end_membername(p);  upb_sink_putint32(p->top->sink, parser_getsel(p), nanos);  end_member(p);  /* Continue previous environment */  multipart_startaccum(p);  return true;}static void start_timestamp_zone(upb_json_parser *p, const char *ptr) {  capture_begin(p, ptr);}static int div_round_up2(int n, int d) {  return (n + d - 1) / d;}/* epoch_days(1970, 1, 1) == 1970-01-01 == 0. */static int epoch_days(int year, int month, int day) {  static const uint16_t month_yday[12] = {0,   31,  59,  90,  120, 151,                                          181, 212, 243, 273, 304, 334};  int febs_since_0 = month > 2 ? year + 1 : year;  int leap_days_since_0 = div_round_up2(febs_since_0, 4) -                          div_round_up2(febs_since_0, 100) +                          div_round_up2(febs_since_0, 400);  int days_since_0 =      365 * year + month_yday[month - 1] + (day - 1) + leap_days_since_0;  /* Convert from 0-epoch (0001-01-01 BC) to Unix Epoch (1970-01-01 AD).   * Since the "BC" system does not have a year zero, 1 BC == year zero. */  return days_since_0 - 719528;}static int64_t upb_timegm(const struct tm *tp) {  int64_t ret = epoch_days(tp->tm_year + 1900, tp->tm_mon + 1, tp->tm_mday);  ret = (ret * 24) + tp->tm_hour;  ret = (ret * 60) + tp->tm_min;  ret = (ret * 60) + tp->tm_sec;  return ret;}static bool end_timestamp_zone(upb_json_parser *p, const char *ptr) {  size_t len;  const char *buf;  int hours;  int64_t seconds;  const char *seconds_membername = "seconds";  if (!capture_end(p, ptr)) {    return false;  }  buf = accumulate_getptr(p, &len);  if (buf[0] != 'Z') {    if (sscanf(buf + 1, "%2d:00", &hours) != 1) {      upb_status_seterrf(p->status, "error parsing timestamp offset");      return false;    }    if (buf[0] == '+') {      hours = -hours;    }    p->tm.tm_hour += hours;  }  /* Normalize tm */  seconds = upb_timegm(&p->tm);  /* Check timestamp boundary */  if (seconds < -62135596800) {    upb_status_seterrf(p->status, "error parsing timestamp: "                                   "minimum acceptable value is "                                   "0001-01-01T00:00:00Z");    return false;  }  /* Clean up previous environment */  multipart_end(p);  /* Set seconds */  start_member(p);  capture_begin(p, seconds_membername);  capture_end(p, seconds_membername + 7);  end_membername(p);  upb_sink_putint64(p->top->sink, parser_getsel(p), seconds);  end_member(p);  /* Continue previous environment */  multipart_startaccum(p);  return true;}static void start_fieldmask_path_text(upb_json_parser *p, const char *ptr) {  capture_begin(p, ptr);}static bool end_fieldmask_path_text(upb_json_parser *p, const char *ptr) {  return capture_end(p, ptr);}static bool start_fieldmask_path(upb_json_parser *p) {  upb_jsonparser_frame *inner;  upb_selector_t sel;  if (!check_stack(p)) return false;  /* Start a new parser frame: parser frames correspond one-to-one with   * handler frames, and string events occur in a sub-frame. */  inner = start_jsonparser_frame(p);  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSTR);  upb_sink_startstr(p->top->sink, sel, 0, &inner->sink);  inner->m = p->top->m;  inner->f = p->top->f;  p->top = inner;  multipart_startaccum(p);  return true;}static bool lower_camel_push(    upb_json_parser *p, upb_selector_t sel, const char *ptr, size_t len) {  const char *limit = ptr + len;  bool first = true;  for (;ptr < limit; ptr++) {    if (*ptr >= 'A' && *ptr <= 'Z' && !first) {      char lower = tolower(*ptr);      upb_sink_putstring(p->top->sink, sel, "_", 1, NULL);      upb_sink_putstring(p->top->sink, sel, &lower, 1, NULL);    } else {      upb_sink_putstring(p->top->sink, sel, ptr, 1, NULL);    }    first = false;  }  return true;}static bool end_fieldmask_path(upb_json_parser *p) {  upb_selector_t sel;  if (!lower_camel_push(           p, getsel_for_handlertype(p, UPB_HANDLER_STRING),           p->accumulated, p->accumulated_len)) {    return false;  }  sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSTR);  upb_sink_endstr(p->top->sink, sel);  p->top--;  multipart_end(p);  return true;}static void start_member(upb_json_parser *p) {  UPB_ASSERT(!p->top->f);  multipart_startaccum(p);}/* Helper: invoked during parse_mapentry() to emit the mapentry message's key * field based on the current contents of the accumulate buffer. */static bool parse_mapentry_key(upb_json_parser *p) {  size_t len;  const char *buf = accumulate_getptr(p, &len);  /* Emit the key field. We do a bit of ad-hoc parsing here because the   * parser state machine has already decided that this is a string field   * name, and we are reinterpreting it as some arbitrary key type. In   * particular, integer and bool keys are quoted, so we need to parse the   * quoted string contents here. */  p->top->f = upb_msgdef_itof(p->top->m, UPB_MAPENTRY_KEY);  if (p->top->f == NULL) {    upb_status_seterrmsg(p->status, "mapentry message has no key");    return false;  }  switch (upb_fielddef_type(p->top->f)) {    case UPB_TYPE_INT32:    case UPB_TYPE_INT64:    case UPB_TYPE_UINT32:    case UPB_TYPE_UINT64:      /* Invoke end_number. The accum buffer has the number's text already. */      if (!parse_number(p, true)) {        return false;      }      break;    case UPB_TYPE_BOOL:      if (len == 4 && !strncmp(buf, "true", 4)) {        if (!parser_putbool(p, true)) {          return false;        }      } else if (len == 5 && !strncmp(buf, "false", 5)) {        if (!parser_putbool(p, false)) {          return false;        }      } else {        upb_status_seterrmsg(p->status,                             "Map bool key not 'true' or 'false'");        return false;      }      multipart_end(p);      break;    case UPB_TYPE_STRING:    case UPB_TYPE_BYTES: {      upb_sink subsink;      upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSTR);      upb_sink_startstr(p->top->sink, sel, len, &subsink);      sel = getsel_for_handlertype(p, UPB_HANDLER_STRING);      upb_sink_putstring(subsink, sel, buf, len, NULL);      sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSTR);      upb_sink_endstr(subsink, sel);      multipart_end(p);      break;    }    default:      upb_status_seterrmsg(p->status, "Invalid field type for map key");      return false;  }  return true;}/* Helper: emit one map entry (as a submessage in the map field sequence). This * is invoked from end_membername(), at the end of the map entry's key string, * with the map key in the accumulate buffer. It parses the key from that * buffer, emits the handler calls to start the mapentry submessage (setting up * its subframe in the process), and sets up state in the subframe so that the * value parser (invoked next) will emit the mapentry's value field and then * end the mapentry message. */static bool handle_mapentry(upb_json_parser *p) {  const upb_fielddef *mapfield;  const upb_msgdef *mapentrymsg;  upb_jsonparser_frame *inner;  upb_selector_t sel;  /* Map entry: p->top->sink is the seq frame, so we need to start a frame   * for the mapentry itself, and then set |f| in that frame so that the map   * value field is parsed, and also set a flag to end the frame after the   * map-entry value is parsed. */  if (!check_stack(p)) return false;  mapfield = p->top->mapfield;  mapentrymsg = upb_fielddef_msgsubdef(mapfield);  inner = start_jsonparser_frame(p);  p->top->f = mapfield;  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);  upb_sink_startsubmsg(p->top->sink, sel, &inner->sink);  inner->m = mapentrymsg;  inner->mapfield = mapfield;  /* 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   * if they see is_mapentry (when invoked by the parser state machine, they   * would have just seen the map-entry value, not key). */  inner->is_mapentry = false;  p->top = inner;  /* send STARTMSG in submsg frame. */  upb_sink_startmsg(p->top->sink);  parse_mapentry_key(p);  /* Set up the value field to receive the map-entry value. */  p->top->f = upb_msgdef_itof(p->top->m, UPB_MAPENTRY_VALUE);  p->top->is_mapentry = true;  /* set up to pop frame after value is parsed. */  p->top->mapfield = mapfield;  if (p->top->f == NULL) {    upb_status_seterrmsg(p->status, "mapentry message has no value");    return false;  }  return true;}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;  }  if (p->top->is_any) {    return end_any_membername(p);  } else if (p->top->is_map) {    return handle_mapentry(p);  } else {    size_t len;    const char *buf = accumulate_getptr(p, &len);    upb_value v;    if (upb_strtable_lookup2(p->top->name_table, buf, len, &v)) {      p->top->f = upb_value_getconstptr(v);      multipart_end(p);      return true;    } else if (p->ignore_json_unknown) {      p->top->is_unknown_field = true;      multipart_end(p);      return true;    } else {      upb_status_seterrf(p->status, "No such field: %.*s\n", (int)len, buf);      return false;    }  }}static bool end_any_membername(upb_json_parser *p) {  size_t len;  const char *buf = accumulate_getptr(p, &len);  upb_value v;  if (len == 5 && strncmp(buf, "@type", len) == 0) {    upb_strtable_lookup2(p->top->name_table, "type_url", 8, &v);    p->top->f = upb_value_getconstptr(v);    multipart_end(p);    return true;  } else {    p->top->is_unknown_field = true;    multipart_end(p);    return true;  }}static void end_member(upb_json_parser *p) {  /* If we just parsed a map-entry value, end that frame too. */  if (p->top->is_mapentry) {    upb_selector_t sel;    bool ok;    const upb_fielddef *mapfield;    UPB_ASSERT(p->top > p->stack);    /* send ENDMSG on submsg. */    upb_sink_endmsg(p->top->sink, p->status);    mapfield = p->top->mapfield;    /* send ENDSUBMSG in repeated-field-of-mapentries frame. */    p->top--;    ok = upb_handlers_getselector(mapfield, UPB_HANDLER_ENDSUBMSG, &sel);    UPB_ASSERT(ok);    upb_sink_endsubmsg(p->top->sink, (p->top + 1)->sink, sel);  }  p->top->f = NULL;  p->top->is_unknown_field = false;}static void start_any_member(upb_json_parser *p, const char *ptr) {  start_member(p);  json_parser_any_frame_set_after_type_url_start_once(p->top->any_frame, ptr);}static void end_any_member(upb_json_parser *p, const char *ptr) {  json_parser_any_frame_set_before_type_url_end(p->top->any_frame, ptr);  end_member(p);}static bool start_subobject(upb_json_parser *p) {  if (p->top->is_unknown_field) {    if (!check_stack(p)) return false;    p->top = start_jsonparser_frame(p);    return true;  }  if (upb_fielddef_ismap(p->top->f)) {    upb_jsonparser_frame *inner;    upb_selector_t sel;    /* Beginning of a map. Start a new parser frame in a repeated-field     * context. */    if (!check_stack(p)) return false;    inner = start_jsonparser_frame(p);    sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);    upb_sink_startseq(p->top->sink, sel, &inner->sink);    inner->m = upb_fielddef_msgsubdef(p->top->f);    inner->mapfield = p->top->f;    inner->is_map = true;    p->top = inner;    return true;  } else if (upb_fielddef_issubmsg(p->top->f)) {    upb_jsonparser_frame *inner;    upb_selector_t sel;    /* Beginning of a subobject. Start a new parser frame in the submsg     * context. */    if (!check_stack(p)) return false;    inner = start_jsonparser_frame(p);    sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);    upb_sink_startsubmsg(p->top->sink, sel, &inner->sink);    inner->m = upb_fielddef_msgsubdef(p->top->f);    set_name_table(p, inner);    p->top = inner;    if (is_wellknown_msg(p, UPB_WELLKNOWN_ANY)) {      p->top->is_any = true;      p->top->any_frame = json_parser_any_frame_new(p);    } else {      p->top->is_any = false;      p->top->any_frame = NULL;    }    return true;  } else {    upb_status_seterrf(p->status,                       "Object specified for non-message/group field: %s",                       upb_fielddef_name(p->top->f));    return false;  }}static bool start_subobject_full(upb_json_parser *p) {  if (is_top_level(p)) {    if (is_wellknown_msg(p, UPB_WELLKNOWN_VALUE)) {      start_value_object(p, VALUE_STRUCTVALUE);      if (!start_subobject(p)) return false;      start_structvalue_object(p);    } else if (is_wellknown_msg(p, UPB_WELLKNOWN_STRUCT)) {      start_structvalue_object(p);    } else {      return true;    }  } else if (is_wellknown_field(p, UPB_WELLKNOWN_STRUCT)) {    if (!start_subobject(p)) return false;    start_structvalue_object(p);  } else if (is_wellknown_field(p, UPB_WELLKNOWN_VALUE)) {    if (!start_subobject(p)) return false;    start_value_object(p, VALUE_STRUCTVALUE);    if (!start_subobject(p)) return false;    start_structvalue_object(p);  }  return start_subobject(p);}static void end_subobject(upb_json_parser *p) {  if (is_top_level(p)) {    return;  }  if (p->top->is_map) {    upb_selector_t sel;    p->top--;    sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSEQ);    upb_sink_endseq(p->top->sink, sel);  } else {    upb_selector_t sel;    bool is_unknown = p->top->m == NULL;    p->top--;    if (!is_unknown) {      sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSUBMSG);      upb_sink_endsubmsg(p->top->sink, (p->top + 1)->sink, sel);    }  }}static void end_subobject_full(upb_json_parser *p) {  end_subobject(p);  if (is_wellknown_msg(p, UPB_WELLKNOWN_STRUCT)) {    end_structvalue_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }  }  if (is_wellknown_msg(p, UPB_WELLKNOWN_VALUE)) {    end_value_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }  }}static bool start_array(upb_json_parser *p) {  upb_jsonparser_frame *inner;  upb_selector_t sel;  if (is_top_level(p)) {    if (is_wellknown_msg(p, UPB_WELLKNOWN_VALUE)) {      start_value_object(p, VALUE_LISTVALUE);      if (!start_subobject(p)) return false;      start_listvalue_object(p);    } else if (is_wellknown_msg(p, UPB_WELLKNOWN_LISTVALUE)) {      start_listvalue_object(p);    } else {      return false;    }  } 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) &&             (!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;    start_listvalue_object(p);  }  if (p->top->is_unknown_field) {    inner = start_jsonparser_frame(p);    inner->is_unknown_field = true;    p->top = inner;    return true;  }  if (!upb_fielddef_isseq(p->top->f)) {    upb_status_seterrf(p->status,                       "Array specified for non-repeated field: %s",                       upb_fielddef_name(p->top->f));    return false;  }  if (!check_stack(p)) return false;  inner = start_jsonparser_frame(p);  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);  upb_sink_startseq(p->top->sink, sel, &inner->sink);  inner->m = p->top->m;  inner->f = p->top->f;  inner->is_repeated = true;  p->top = inner;  return true;}static void end_array(upb_json_parser *p) {  upb_selector_t sel;  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);  if (is_wellknown_msg(p, UPB_WELLKNOWN_LISTVALUE)) {    end_listvalue_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }  }  if (is_wellknown_msg(p, UPB_WELLKNOWN_VALUE)) {    end_value_object(p);    if (!is_top_level(p)) {      end_subobject(p);    }  }}static void start_object(upb_json_parser *p) {  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 && p->top->m != NULL) {    upb_sink_endmsg(p->top->sink, p->status);  }}static void start_any_object(upb_json_parser *p, const char *ptr) {  start_object(p);  p->top->any_frame->before_type_url_start = ptr;  p->top->any_frame->before_type_url_end = ptr;}static bool end_any_object(upb_json_parser *p, const char *ptr) {  const char *value_membername = "value";  bool is_well_known_packed = false;  const char *packed_end = ptr + 1;  upb_selector_t sel;  upb_jsonparser_frame *inner;  if (json_parser_any_frame_has_value(p->top->any_frame) &&      !json_parser_any_frame_has_type_url(p->top->any_frame)) {    upb_status_seterrmsg(p->status, "No valid type url");    return false;  }  /* Well known types data is represented as value field. */  if (upb_msgdef_wellknowntype(p->top->any_frame->parser->top->m) !=          UPB_WELLKNOWN_UNSPECIFIED) {    is_well_known_packed = true;    if (json_parser_any_frame_has_value_before_type_url(p->top->any_frame)) {      p->top->any_frame->before_type_url_start =          memchr(p->top->any_frame->before_type_url_start, ':',                 p->top->any_frame->before_type_url_end -                 p->top->any_frame->before_type_url_start);      if (p->top->any_frame->before_type_url_start == NULL) {        upb_status_seterrmsg(p->status, "invalid data for well known type.");        return false;      }      p->top->any_frame->before_type_url_start++;    }    if (json_parser_any_frame_has_value_after_type_url(p->top->any_frame)) {      p->top->any_frame->after_type_url_start =          memchr(p->top->any_frame->after_type_url_start, ':',                 (ptr + 1) -                 p->top->any_frame->after_type_url_start);      if (p->top->any_frame->after_type_url_start == NULL) {        upb_status_seterrmsg(p->status, "Invalid data for well known type.");        return false;      }      p->top->any_frame->after_type_url_start++;      packed_end = ptr;    }  }  if (json_parser_any_frame_has_value_before_type_url(p->top->any_frame)) {    if (!parse(p->top->any_frame->parser, NULL,               p->top->any_frame->before_type_url_start,               p->top->any_frame->before_type_url_end -               p->top->any_frame->before_type_url_start, NULL)) {      return false;    }  } else {    if (!is_well_known_packed) {      if (!parse(p->top->any_frame->parser, NULL, "{", 1, NULL)) {        return false;      }    }  }  if (json_parser_any_frame_has_value_before_type_url(p->top->any_frame) &&      json_parser_any_frame_has_value_after_type_url(p->top->any_frame)) {    if (!parse(p->top->any_frame->parser, NULL, ",", 1, NULL)) {      return false;    }  }  if (json_parser_any_frame_has_value_after_type_url(p->top->any_frame)) {    if (!parse(p->top->any_frame->parser, NULL,               p->top->any_frame->after_type_url_start,               packed_end - p->top->any_frame->after_type_url_start, NULL)) {      return false;    }  } else {    if (!is_well_known_packed) {      if (!parse(p->top->any_frame->parser, NULL, "}", 1, NULL)) {        return false;      }    }  }  if (!end(p->top->any_frame->parser, NULL)) {    return false;  }  p->top->is_any = false;  /* Set value */  start_member(p);  capture_begin(p, value_membername);  capture_end(p, value_membername + 5);  end_membername(p);  if (!check_stack(p)) return false;  inner = p->top + 1;  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSTR);  upb_sink_startstr(p->top->sink, sel, 0, &inner->sink);  sel = getsel_for_handlertype(p, UPB_HANDLER_STRING);  upb_sink_putstring(inner->sink, sel, p->top->any_frame->stringsink.ptr,                     p->top->any_frame->stringsink.len, NULL);  sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSTR);  upb_sink_endstr(inner->sink, sel);  end_member(p);  end_object(p);  /* Deallocate any parse frame. */  json_parser_any_frame_free(p->top->any_frame);  return true;}static bool is_string_wrapper(const upb_msgdef *m) {  upb_wellknowntype_t type = upb_msgdef_wellknowntype(m);  return type == UPB_WELLKNOWN_STRINGVALUE ||         type == UPB_WELLKNOWN_BYTESVALUE;}static bool is_fieldmask(const upb_msgdef *m) {  upb_wellknowntype_t type = upb_msgdef_wellknowntype(m);  return type == UPB_WELLKNOWN_FIELDMASK;}static void start_fieldmask_object(upb_json_parser *p) {  const char *membername = "paths";  start_object(p);  /* Set up context for parsing value */  start_member(p);  capture_begin(p, membername);  capture_end(p, membername + 5);  end_membername(p);  start_array(p);}static void end_fieldmask_object(upb_json_parser *p) {  end_array(p);  end_member(p);  end_object(p);}static void start_wrapper_object(upb_json_parser *p) {  const char *membername = "value";  start_object(p);  /* Set up context for parsing value */  start_member(p);  capture_begin(p, membername);  capture_end(p, membername + 5);  end_membername(p);}static void end_wrapper_object(upb_json_parser *p) {  end_member(p);  end_object(p);}static void start_value_object(upb_json_parser *p, int value_type) {  const char *nullmember = "null_value";  const char *numbermember = "number_value";  const char *stringmember = "string_value";  const char *boolmember = "bool_value";  const char *structmember = "struct_value";  const char *listmember = "list_value";  const char *membername = "";  switch (value_type) {    case VALUE_NULLVALUE:      membername = nullmember;      break;    case VALUE_NUMBERVALUE:      membername = numbermember;      break;    case VALUE_STRINGVALUE:      membername = stringmember;      break;    case VALUE_BOOLVALUE:      membername = boolmember;      break;    case VALUE_STRUCTVALUE:      membername = structmember;      break;    case VALUE_LISTVALUE:      membername = listmember;      break;  }  start_object(p);  /* Set up context for parsing value */  start_member(p);  capture_begin(p, membername);  capture_end(p, membername + strlen(membername));  end_membername(p);}static void end_value_object(upb_json_parser *p) {  end_member(p);  end_object(p);}static void start_listvalue_object(upb_json_parser *p) {  const char *membername = "values";  start_object(p);  /* Set up context for parsing value */  start_member(p);  capture_begin(p, membername);  capture_end(p, membername + strlen(membername));  end_membername(p);}static void end_listvalue_object(upb_json_parser *p) {  end_member(p);  end_object(p);}static void start_structvalue_object(upb_json_parser *p) {  const char *membername = "fields";  start_object(p);  /* Set up context for parsing value */  start_member(p);  capture_begin(p, membername);  capture_end(p, membername + strlen(membername));  end_membername(p);}static void end_structvalue_object(upb_json_parser *p) {  end_member(p);  end_object(p);}static bool is_top_level(upb_json_parser *p) {  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) {  return p->top->m != NULL && upb_msgdef_wellknowntype(p->top->m) == type;}static bool is_wellknown_field(upb_json_parser *p, upb_wellknowntype_t type) {  return p->top->f != NULL &&         upb_fielddef_issubmsg(p->top->f) &&         (upb_msgdef_wellknowntype(upb_fielddef_msgsubdef(p->top->f))              == type);}static bool does_number_wrapper_start(upb_json_parser *p) {  return p->top->f != NULL &&         upb_fielddef_issubmsg(p->top->f) &&         upb_msgdef_isnumberwrapper(upb_fielddef_msgsubdef(p->top->f));}static bool does_number_wrapper_end(upb_json_parser *p) {  return p->top->m != NULL && upb_msgdef_isnumberwrapper(p->top->m);}static bool is_number_wrapper_object(upb_json_parser *p) {  return p->top->m != NULL && upb_msgdef_isnumberwrapper(p->top->m);}static bool does_string_wrapper_start(upb_json_parser *p) {  return p->top->f != NULL &&         upb_fielddef_issubmsg(p->top->f) &&         is_string_wrapper(upb_fielddef_msgsubdef(p->top->f));}static bool does_string_wrapper_end(upb_json_parser *p) {  return p->top->m != NULL && is_string_wrapper(p->top->m);}static bool is_string_wrapper_object(upb_json_parser *p) {  return p->top->m != NULL && is_string_wrapper(p->top->m);}static bool does_fieldmask_start(upb_json_parser *p) {  return p->top->f != NULL &&         upb_fielddef_issubmsg(p->top->f) &&         is_fieldmask(upb_fielddef_msgsubdef(p->top->f));}static bool does_fieldmask_end(upb_json_parser *p) {  return p->top->m != NULL && is_fieldmask(p->top->m);}#define CHECK_RETURN_TOP(x) if (!(x)) goto error/* The actual parser **********************************************************//* What follows is the Ragel parser itself.  The language is specified in Ragel * and the actions call our C functions above. * * Ragel has an extensive set of functionality, and we use only a small part of * it.  There are many action types but we only use a few: * *   ">" -- transition into a machine *   "%" -- transition out of a machine *   "@" -- transition into a final state of a machine. * * "@" transitions are tricky because a machine can transition into a final * state repeatedly.  But in some cases we know this can't happen, for example * a string which is delimited by a final '"' can only transition into its * final state once, when the closing '"' is seen. */#line 2780 "upb/json/parser.rl"#line 2583 "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, 	9, 1, 11, 1, 12, 1, 13, 1, 	14, 1, 15, 1, 16, 1, 17, 1, 	18, 1, 19, 1, 20, 1, 22, 1, 	23, 1, 24, 1, 35, 1, 37, 1, 	39, 1, 40, 1, 42, 1, 43, 1, 	44, 1, 46, 1, 48, 1, 49, 1, 	50, 1, 51, 1, 53, 1, 54, 2, 	4, 9, 2, 5, 6, 2, 7, 3, 	2, 7, 9, 2, 21, 26, 2, 25, 	10, 2, 27, 28, 2, 29, 30, 2, 	32, 34, 2, 33, 31, 2, 38, 36, 	2, 40, 42, 2, 45, 2, 2, 46, 	54, 2, 47, 36, 2, 49, 54, 2, 	50, 54, 2, 51, 54, 2, 52, 41, 	2, 53, 54, 3, 32, 34, 35, 4, 	21, 26, 27, 28};static const short _json_key_offsets[] = {	0, 0, 12, 13, 18, 23, 28, 29, 	30, 31, 32, 33, 34, 35, 36, 37, 	38, 43, 44, 48, 53, 58, 63, 67, 	71, 74, 77, 79, 83, 87, 89, 91, 	96, 98, 100, 109, 115, 121, 127, 133, 	135, 139, 142, 144, 146, 149, 150, 154, 	156, 158, 160, 162, 163, 165, 167, 168, 	170, 172, 173, 175, 177, 178, 180, 182, 	183, 185, 187, 191, 193, 195, 196, 197, 	198, 199, 201, 206, 208, 210, 212, 221, 	222, 222, 222, 227, 232, 237, 238, 239, 	240, 241, 241, 242, 243, 244, 244, 245, 	246, 247, 247, 252, 253, 257, 262, 267, 	272, 276, 276, 279, 282, 285, 288, 291, 	294, 294, 294, 294, 294, 294};static const char _json_trans_keys[] = {	32, 34, 45, 91, 102, 110, 116, 123, 	9, 13, 48, 57, 34, 32, 93, 125, 	9, 13, 32, 44, 93, 9, 13, 32, 	93, 125, 9, 13, 97, 108, 115, 101, 	117, 108, 108, 114, 117, 101, 32, 34, 	125, 9, 13, 34, 32, 58, 9, 13, 	32, 93, 125, 9, 13, 32, 44, 125, 	9, 13, 32, 44, 125, 9, 13, 32, 	34, 9, 13, 45, 48, 49, 57, 48, 	49, 57, 46, 69, 101, 48, 57, 69, 	101, 48, 57, 43, 45, 48, 57, 48, 	57, 48, 57, 46, 69, 101, 48, 57, 	34, 92, 34, 92, 34, 47, 92, 98, 	102, 110, 114, 116, 117, 48, 57, 65, 	70, 97, 102, 48, 57, 65, 70, 97, 	102, 48, 57, 65, 70, 97, 102, 48, 	57, 65, 70, 97, 102, 34, 92, 45, 	48, 49, 57, 48, 49, 57, 46, 115, 	48, 57, 115, 48, 57, 34, 46, 115, 	48, 57, 48, 57, 48, 57, 48, 57, 	48, 57, 45, 48, 57, 48, 57, 45, 	48, 57, 48, 57, 84, 48, 57, 48, 	57, 58, 48, 57, 48, 57, 58, 48, 	57, 48, 57, 43, 45, 46, 90, 48, 	57, 48, 57, 58, 48, 48, 34, 48, 	57, 43, 45, 90, 48, 57, 34, 44, 	34, 44, 34, 44, 34, 45, 91, 102, 	110, 116, 123, 48, 57, 34, 32, 93, 	125, 9, 13, 32, 44, 93, 9, 13, 	32, 93, 125, 9, 13, 97, 108, 115, 	101, 117, 108, 108, 114, 117, 101, 32, 	34, 125, 9, 13, 34, 32, 58, 9, 	13, 32, 93, 125, 9, 13, 32, 44, 	125, 9, 13, 32, 44, 125, 9, 13, 	32, 34, 9, 13, 32, 9, 13, 32, 	9, 13, 32, 9, 13, 32, 9, 13, 	32, 9, 13, 32, 9, 13, 0};static const char _json_single_lengths[] = {	0, 8, 1, 3, 3, 3, 1, 1, 	1, 1, 1, 1, 1, 1, 1, 1, 	3, 1, 2, 3, 3, 3, 2, 2, 	1, 3, 0, 2, 2, 0, 0, 3, 	2, 2, 9, 0, 0, 0, 0, 2, 	2, 1, 2, 0, 1, 1, 2, 0, 	0, 0, 0, 1, 0, 0, 1, 0, 	0, 1, 0, 0, 1, 0, 0, 1, 	0, 0, 4, 0, 0, 1, 1, 1, 	1, 0, 3, 2, 2, 2, 7, 1, 	0, 0, 3, 3, 3, 1, 1, 1, 	1, 0, 1, 1, 1, 0, 1, 1, 	1, 0, 3, 1, 2, 3, 3, 3, 	2, 0, 1, 1, 1, 1, 1, 1, 	0, 0, 0, 0, 0, 0};static const char _json_range_lengths[] = {	0, 2, 0, 1, 1, 1, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	1, 0, 1, 1, 1, 1, 1, 1, 	1, 0, 1, 1, 1, 1, 1, 1, 	0, 0, 0, 3, 3, 3, 3, 0, 	1, 1, 0, 1, 1, 0, 1, 1, 	1, 1, 1, 0, 1, 1, 0, 1, 	1, 0, 1, 1, 0, 1, 1, 0, 	1, 1, 0, 1, 1, 0, 0, 0, 	0, 1, 1, 0, 0, 0, 1, 0, 	0, 0, 1, 1, 1, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 1, 0, 1, 1, 1, 1, 	1, 0, 1, 1, 1, 1, 1, 1, 	0, 0, 0, 0, 0, 0};static const short _json_index_offsets[] = {	0, 0, 11, 13, 18, 23, 28, 30, 	32, 34, 36, 38, 40, 42, 44, 46, 	48, 53, 55, 59, 64, 69, 74, 78, 	82, 85, 89, 91, 95, 99, 101, 103, 	108, 111, 114, 124, 128, 132, 136, 140, 	143, 147, 150, 153, 155, 158, 160, 164, 	166, 168, 170, 172, 174, 176, 178, 180, 	182, 184, 186, 188, 190, 192, 194, 196, 	198, 200, 202, 207, 209, 211, 213, 215, 	217, 219, 221, 226, 229, 232, 235, 244, 	246, 247, 248, 253, 258, 263, 265, 267, 	269, 271, 272, 274, 276, 278, 279, 281, 	283, 285, 286, 291, 293, 297, 302, 307, 	312, 316, 317, 320, 323, 326, 329, 332, 	335, 336, 337, 338, 339, 340};static const unsigned char _json_indicies[] = {	0, 2, 3, 4, 5, 6, 7, 8, 	0, 3, 1, 9, 1, 11, 12, 1, 	11, 10, 13, 14, 12, 13, 1, 14, 	1, 1, 14, 10, 15, 1, 16, 1, 	17, 1, 18, 1, 19, 1, 20, 1, 	21, 1, 22, 1, 23, 1, 24, 1, 	25, 26, 27, 25, 1, 28, 1, 29, 	30, 29, 1, 30, 1, 1, 30, 31, 	32, 33, 34, 32, 1, 35, 36, 27, 	35, 1, 36, 26, 36, 1, 37, 38, 	39, 1, 38, 39, 1, 41, 42, 42, 	40, 43, 1, 42, 42, 43, 40, 44, 	44, 45, 1, 45, 1, 45, 40, 41, 	42, 42, 39, 40, 47, 48, 46, 50, 	51, 49, 52, 52, 52, 52, 52, 52, 	52, 52, 53, 1, 54, 54, 54, 1, 	55, 55, 55, 1, 56, 56, 56, 1, 	57, 57, 57, 1, 59, 60, 58, 61, 	62, 63, 1, 64, 65, 1, 66, 67, 	1, 68, 1, 67, 68, 1, 69, 1, 	66, 67, 65, 1, 70, 1, 71, 1, 	72, 1, 73, 1, 74, 1, 75, 1, 	76, 1, 77, 1, 78, 1, 79, 1, 	80, 1, 81, 1, 82, 1, 83, 1, 	84, 1, 85, 1, 86, 1, 87, 1, 	88, 1, 89, 89, 90, 91, 1, 92, 	1, 93, 1, 94, 1, 95, 1, 96, 	1, 97, 1, 98, 1, 99, 99, 100, 	98, 1, 102, 1, 101, 104, 105, 103, 	1, 1, 101, 106, 107, 108, 109, 110, 	111, 112, 107, 1, 113, 1, 114, 115, 	117, 118, 1, 117, 116, 119, 120, 118, 	119, 1, 120, 1, 1, 120, 116, 121, 	1, 122, 1, 123, 1, 124, 1, 125, 	126, 1, 127, 1, 128, 1, 129, 130, 	1, 131, 1, 132, 1, 133, 134, 135, 	136, 134, 1, 137, 1, 138, 139, 138, 	1, 139, 1, 1, 139, 140, 141, 142, 	143, 141, 1, 144, 145, 136, 144, 1, 	145, 135, 145, 1, 146, 147, 147, 1, 	148, 148, 1, 149, 149, 1, 150, 150, 	1, 151, 151, 1, 152, 152, 1, 1, 	1, 1, 1, 1, 1, 0};static const char _json_trans_targs[] = {	1, 0, 2, 107, 3, 6, 10, 13, 	16, 106, 4, 3, 106, 4, 5, 7, 	8, 9, 108, 11, 12, 109, 14, 15, 	110, 16, 17, 111, 18, 18, 19, 20, 	21, 22, 111, 21, 22, 24, 25, 31, 	112, 26, 28, 27, 29, 30, 33, 113, 	34, 33, 113, 34, 32, 35, 36, 37, 	38, 39, 33, 113, 34, 41, 42, 46, 	42, 46, 43, 45, 44, 114, 48, 49, 	50, 51, 52, 53, 54, 55, 56, 57, 	58, 59, 60, 61, 62, 63, 64, 65, 	66, 67, 73, 72, 68, 69, 70, 71, 	72, 115, 74, 67, 72, 76, 116, 76, 	116, 77, 79, 81, 82, 85, 90, 94, 	98, 80, 117, 117, 83, 82, 80, 83, 	84, 86, 87, 88, 89, 117, 91, 92, 	93, 117, 95, 96, 97, 117, 98, 99, 	105, 100, 100, 101, 102, 103, 104, 105, 	103, 104, 117, 106, 106, 106, 106, 106, 	106};static const unsigned char _json_trans_actions[] = {	0, 0, 113, 107, 53, 0, 0, 0, 	125, 59, 45, 0, 55, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 101, 51, 47, 0, 0, 45, 	49, 49, 104, 0, 0, 0, 0, 0, 	3, 0, 0, 0, 0, 0, 5, 15, 	0, 0, 71, 7, 13, 0, 74, 9, 	9, 9, 77, 80, 11, 37, 37, 37, 	0, 0, 0, 39, 0, 41, 86, 0, 	0, 0, 17, 19, 0, 21, 23, 0, 	25, 27, 0, 29, 31, 0, 33, 35, 	0, 135, 83, 135, 0, 0, 0, 0, 	0, 92, 0, 89, 89, 98, 43, 0, 	131, 95, 113, 107, 53, 0, 0, 0, 	125, 59, 69, 110, 45, 0, 55, 0, 	0, 0, 0, 0, 0, 119, 0, 0, 	0, 122, 0, 0, 0, 116, 0, 101, 	51, 47, 0, 0, 45, 49, 49, 104, 	0, 0, 128, 0, 57, 63, 65, 61, 	67};static const unsigned char _json_eof_actions[] = {	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 1, 0, 1, 0, 0, 1, 1, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 57, 63, 65, 61, 67, 	0, 0, 0, 0, 0, 0};static const int json_start = 1;static const int json_en_number_machine = 23;static const int json_en_string_machine = 32;static const int json_en_duration_machine = 40;static const int json_en_timestamp_machine = 47;static const int json_en_fieldmask_machine = 75;static const int json_en_value_machine = 78;static const int json_en_main = 1;#line 2783 "upb/json/parser.rl"size_t parse(void *closure, const void *hd, const char *buf, size_t size,             const upb_bufhandle *handle) {  upb_json_parser *parser = closure;  /* Variables used by Ragel's generated code. */  int cs = parser->current_state;  int *stack = parser->parser_stack;  int top = parser->parser_top;  const char *p = buf;  const char *pe = buf + size;  const char *eof = &eof_ch;  parser->handle = handle;  UPB_UNUSED(hd);  UPB_UNUSED(handle);  capture_resume(parser, buf);  #line 2861 "upb/json/parser.c"	{	int _klen;	unsigned int _trans;	const char *_acts;	unsigned int _nacts;	const char *_keys;	if ( p == pe )		goto _test_eof;	if ( cs == 0 )		goto _out;_resume:	_keys = _json_trans_keys + _json_key_offsets[cs];	_trans = _json_index_offsets[cs];	_klen = _json_single_lengths[cs];	if ( _klen > 0 ) {		const char *_lower = _keys;		const char *_mid;		const char *_upper = _keys + _klen - 1;		while (1) {			if ( _upper < _lower )				break;			_mid = _lower + ((_upper-_lower) >> 1);			if ( (*p) < *_mid )				_upper = _mid - 1;			else if ( (*p) > *_mid )				_lower = _mid + 1;			else {				_trans += (unsigned int)(_mid - _keys);				goto _match;			}		}		_keys += _klen;		_trans += _klen;	}	_klen = _json_range_lengths[cs];	if ( _klen > 0 ) {		const char *_lower = _keys;		const char *_mid;		const char *_upper = _keys + (_klen<<1) - 2;		while (1) {			if ( _upper < _lower )				break;			_mid = _lower + (((_upper-_lower) >> 1) & ~1);			if ( (*p) < _mid[0] )				_upper = _mid - 2;			else if ( (*p) > _mid[1] )				_lower = _mid + 2;			else {				_trans += (unsigned int)((_mid - _keys)>>1);				goto _match;			}		}		_trans += _klen;	}_match:	_trans = _json_indicies[_trans];	cs = _json_trans_targs[_trans];	if ( _json_trans_actions[_trans] == 0 )		goto _again;	_acts = _json_actions + _json_trans_actions[_trans];	_nacts = (unsigned int) *_acts++;	while ( _nacts-- > 0 )	{		switch ( *_acts++ )		{	case 1:#line 2588 "upb/json/parser.rl"	{ p--; {cs = stack[--top]; goto _again;} }	break;	case 2:#line 2590 "upb/json/parser.rl"	{ p--; {stack[top++] = cs; cs = 23;goto _again;} }	break;	case 3:#line 2594 "upb/json/parser.rl"	{ start_text(parser, p); }	break;	case 4:#line 2595 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_text(parser, p)); }	break;	case 5:#line 2601 "upb/json/parser.rl"	{ start_hex(parser); }	break;	case 6:#line 2602 "upb/json/parser.rl"	{ hexdigit(parser, p); }	break;	case 7:#line 2603 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_hex(parser)); }	break;	case 8:#line 2609 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(escape(parser, p)); }	break;	case 9:#line 2615 "upb/json/parser.rl"	{ p--; {cs = stack[--top]; goto _again;} }	break;	case 10:#line 2620 "upb/json/parser.rl"	{ start_year(parser, p); }	break;	case 11:#line 2621 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_year(parser, p)); }	break;	case 12:#line 2625 "upb/json/parser.rl"	{ start_month(parser, p); }	break;	case 13:#line 2626 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_month(parser, p)); }	break;	case 14:#line 2630 "upb/json/parser.rl"	{ start_day(parser, p); }	break;	case 15:#line 2631 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_day(parser, p)); }	break;	case 16:#line 2635 "upb/json/parser.rl"	{ start_hour(parser, p); }	break;	case 17:#line 2636 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_hour(parser, p)); }	break;	case 18:#line 2640 "upb/json/parser.rl"	{ start_minute(parser, p); }	break;	case 19:#line 2641 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_minute(parser, p)); }	break;	case 20:#line 2645 "upb/json/parser.rl"	{ start_second(parser, p); }	break;	case 21:#line 2646 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_second(parser, p)); }	break;	case 22:#line 2651 "upb/json/parser.rl"	{ start_duration_base(parser, p); }	break;	case 23:#line 2652 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_duration_base(parser, p)); }	break;	case 24:#line 2654 "upb/json/parser.rl"	{ p--; {cs = stack[--top]; goto _again;} }	break;	case 25:#line 2659 "upb/json/parser.rl"	{ start_timestamp_base(parser); }	break;	case 26:#line 2661 "upb/json/parser.rl"	{ start_timestamp_fraction(parser, p); }	break;	case 27:#line 2662 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_timestamp_fraction(parser, p)); }	break;	case 28:#line 2664 "upb/json/parser.rl"	{ start_timestamp_zone(parser, p); }	break;	case 29:#line 2665 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_timestamp_zone(parser, p)); }	break;	case 30:#line 2667 "upb/json/parser.rl"	{ p--; {cs = stack[--top]; goto _again;} }	break;	case 31:#line 2672 "upb/json/parser.rl"	{ start_fieldmask_path_text(parser, p); }	break;	case 32:#line 2673 "upb/json/parser.rl"	{ end_fieldmask_path_text(parser, p); }	break;	case 33:#line 2678 "upb/json/parser.rl"	{ start_fieldmask_path(parser); }	break;	case 34:#line 2679 "upb/json/parser.rl"	{ end_fieldmask_path(parser); }	break;	case 35:#line 2685 "upb/json/parser.rl"	{ p--; {cs = stack[--top]; goto _again;} }	break;	case 36:#line 2690 "upb/json/parser.rl"	{        if (is_wellknown_msg(parser, UPB_WELLKNOWN_TIMESTAMP)) {          {stack[top++] = cs; cs = 47;goto _again;}        } else if (is_wellknown_msg(parser, UPB_WELLKNOWN_DURATION)) {          {stack[top++] = cs; cs = 40;goto _again;}        } else if (is_wellknown_msg(parser, UPB_WELLKNOWN_FIELDMASK)) {          {stack[top++] = cs; cs = 75;goto _again;}        } else {          {stack[top++] = cs; cs = 32;goto _again;}        }      }	break;	case 37:#line 2703 "upb/json/parser.rl"	{ p--; {stack[top++] = cs; cs = 78;goto _again;} }	break;	case 38:#line 2708 "upb/json/parser.rl"	{        if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {          start_any_member(parser, p);        } else {          start_member(parser);        }      }	break;	case 39:#line 2715 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_membername(parser)); }	break;	case 40:#line 2718 "upb/json/parser.rl"	{        if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {          end_any_member(parser, p);        } else {          end_member(parser);        }      }	break;	case 41:#line 2729 "upb/json/parser.rl"	{        if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {          start_any_object(parser, p);        } else {          start_object(parser);        }      }	break;	case 42:#line 2738 "upb/json/parser.rl"	{        if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {          CHECK_RETURN_TOP(end_any_object(parser, p));        } else {          end_object(parser);        }      }	break;	case 43:#line 2750 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(start_array(parser)); }	break;	case 44:#line 2754 "upb/json/parser.rl"	{ end_array(parser); }	break;	case 45:#line 2759 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(start_number(parser, p)); }	break;	case 46:#line 2760 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_number(parser, p)); }	break;	case 47:#line 2762 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(start_stringval(parser)); }	break;	case 48:#line 2763 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_stringval(parser)); }	break;	case 49:#line 2765 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_bool(parser, true)); }	break;	case 50:#line 2767 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_bool(parser, false)); }	break;	case 51:#line 2769 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_null(parser)); }	break;	case 52:#line 2771 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(start_subobject_full(parser)); }	break;	case 53:#line 2772 "upb/json/parser.rl"	{ end_subobject_full(parser); }	break;	case 54:#line 2777 "upb/json/parser.rl"	{ p--; {cs = stack[--top]; goto _again;} }	break;#line 3185 "upb/json/parser.c"		}	}_again:	if ( cs == 0 )		goto _out;	if ( ++p != pe )		goto _resume;	_test_eof: {}	if ( p == eof )	{	const char *__acts = _json_actions + _json_eof_actions[cs];	unsigned int __nacts = (unsigned int) *__acts++;	while ( __nacts-- > 0 ) {		switch ( *__acts++ ) {	case 0:#line 2586 "upb/json/parser.rl"	{ p--; {cs = stack[--top]; 	if ( p == pe )		goto _test_eof;goto _again;} }	break;	case 46:#line 2760 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_number(parser, p)); }	break;	case 49:#line 2765 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_bool(parser, true)); }	break;	case 50:#line 2767 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_bool(parser, false)); }	break;	case 51:#line 2769 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_null(parser)); }	break;	case 53:#line 2772 "upb/json/parser.rl"	{ end_subobject_full(parser); }	break;#line 3227 "upb/json/parser.c"		}	}	}	_out: {}	}#line 2805 "upb/json/parser.rl"  if (p != pe) {    upb_status_seterrf(parser->status, "Parse error at '%.*s'\n", pe - p, p);  } else {    capture_suspend(parser, &p);  }error:  /* Save parsing state back to parser. */  parser->current_state = cs;  parser->parser_top = top;  return p - buf;}static bool end(void *closure, const void *hd) {  upb_json_parser *parser = closure;  /* Prevent compile warning on unused static constants. */  UPB_UNUSED(json_start);  UPB_UNUSED(json_en_duration_machine);  UPB_UNUSED(json_en_fieldmask_machine);  UPB_UNUSED(json_en_number_machine);  UPB_UNUSED(json_en_string_machine);  UPB_UNUSED(json_en_timestamp_machine);  UPB_UNUSED(json_en_value_machine);  UPB_UNUSED(json_en_main);  parse(parser, hd, &eof_ch, 0, NULL);  return parser->current_state >= 106;}static void json_parser_reset(upb_json_parser *p) {  int cs;  int top;  p->top = p->stack;  init_frame(p->top);  /* Emit Ragel initialization of the parser. */  #line 3278 "upb/json/parser.c"	{	cs = json_start;	top = 0;	}#line 2847 "upb/json/parser.rl"  p->current_state = cs;  p->parser_top = top;  accumulate_clear(p);  p->multipart_state = MULTIPART_INACTIVE;  p->capture = NULL;  p->accumulated = NULL;}static upb_json_parsermethod *parsermethod_new(upb_json_codecache *c,                                               const upb_msgdef *md) {  upb_msg_field_iter i;  upb_alloc *alloc = upb_arena_alloc(c->arena);  upb_json_parsermethod *m = upb_malloc(alloc, sizeof(*m));  m->cache = c;  upb_byteshandler_init(&m->input_handler_);  upb_byteshandler_setstring(&m->input_handler_, parse, m);  upb_byteshandler_setendstr(&m->input_handler_, end, m);  upb_strtable_init2(&m->name_table, UPB_CTYPE_CONSTPTR, alloc);  /* Build name_table */  for(upb_msg_field_begin(&i, md);      !upb_msg_field_done(&i);      upb_msg_field_next(&i)) {    const upb_fielddef *f = upb_msg_iter_field(&i);    upb_value v = upb_value_constptr(f);    char *buf;    /* Add an entry for the JSON name. */    size_t len = upb_fielddef_getjsonname(f, NULL, 0);    buf = upb_malloc(alloc, len);    upb_fielddef_getjsonname(f, buf, len);    upb_strtable_insert3(&m->name_table, buf, strlen(buf), v, alloc);    if (strcmp(buf, upb_fielddef_name(f)) != 0) {      /* Since the JSON name is different from the regular field name, add an       * entry for the raw name (compliant proto3 JSON parsers must accept       * both). */      const char *name = upb_fielddef_name(f);      upb_strtable_insert3(&m->name_table, name, strlen(name), v, alloc);    }  }  return m;}/* Public API *****************************************************************/upb_json_parser *upb_json_parser_create(upb_arena *arena,                                        const upb_json_parsermethod *method,                                        const upb_symtab* symtab,                                        upb_sink output,                                        upb_status *status,                                        bool ignore_json_unknown) {#ifndef NDEBUG  const size_t size_before = upb_arena_bytesallocated(arena);#endif  upb_json_parser *p = upb_arena_malloc(arena, sizeof(upb_json_parser));  if (!p) return false;  p->arena = arena;  p->method = method;  p->status = status;  p->limit = p->stack + UPB_JSON_MAX_DEPTH;  p->accumulate_buf = NULL;  p->accumulate_buf_size = 0;  upb_bytessink_reset(&p->input_, &method->input_handler_, p);  json_parser_reset(p);  p->top->sink = output;  p->top->m = upb_handlers_msgdef(output.handlers);  if (is_wellknown_msg(p, UPB_WELLKNOWN_ANY)) {    p->top->is_any = true;    p->top->any_frame = json_parser_any_frame_new(p);  } else {    p->top->is_any = false;    p->top->any_frame = NULL;  }  set_name_table(p, p->top);  p->symtab = symtab;  p->ignore_json_unknown = ignore_json_unknown;  /* If this fails, uncomment and increase the value in parser.h. */  /* fprintf(stderr, "%zd\n", upb_arena_bytesallocated(arena) - size_before); */  UPB_ASSERT_DEBUGVAR(upb_arena_bytesallocated(arena) - size_before <=                      UPB_JSON_PARSER_SIZE);  return p;}upb_bytessink upb_json_parser_input(upb_json_parser *p) {  return p->input_;}const upb_byteshandler *upb_json_parsermethod_inputhandler(    const upb_json_parsermethod *m) {  return &m->input_handler_;}upb_json_codecache *upb_json_codecache_new(void) {  upb_alloc *alloc;  upb_json_codecache *c;  c = upb_gmalloc(sizeof(*c));  c->arena = upb_arena_new();  alloc = upb_arena_alloc(c->arena);  upb_inttable_init2(&c->methods, UPB_CTYPE_CONSTPTR, alloc);  return c;}void upb_json_codecache_free(upb_json_codecache *c) {  upb_arena_free(c->arena);  upb_gfree(c);}const upb_json_parsermethod *upb_json_codecache_get(upb_json_codecache *c,                                                    const upb_msgdef *md) {  upb_json_parsermethod *m;  upb_value v;  upb_msg_field_iter i;  upb_alloc *alloc = upb_arena_alloc(c->arena);  if (upb_inttable_lookupptr(&c->methods, md, &v)) {    return upb_value_getconstptr(v);  }  m = parsermethod_new(c, md);  v = upb_value_constptr(m);  if (!m) return NULL;  if (!upb_inttable_insertptr2(&c->methods, md, v, alloc)) return NULL;  /* Populate parser methods for all submessages, so the name tables will   * be available during parsing. */  for(upb_msg_field_begin(&i, md);      !upb_msg_field_done(&i);      upb_msg_field_next(&i)) {    upb_fielddef *f = upb_msg_iter_field(&i);    if (upb_fielddef_issubmsg(f)) {      const upb_msgdef *subdef = upb_fielddef_msgsubdef(f);      const upb_json_parsermethod *sub_method =          upb_json_codecache_get(c, subdef);      if (!sub_method) return NULL;    }  }  return m;}
 |