| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097 | // Amalgamated source file#include "upb.h"/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2008-2012 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> */#include <stdlib.h>#include <string.h>typedef struct {  size_t len;  char str[1];  // Null-terminated string data follows.} str_t;static str_t *newstr(const char *data, size_t len) {  str_t *ret = malloc(sizeof(*ret) + len);  if (!ret) return NULL;  ret->len = len;  memcpy(ret->str, data, len);  ret->str[len] = '\0';  return ret;}static void freestr(str_t *s) { free(s); }// isalpha() etc. from <ctype.h> are locale-dependent, which we don't want.static bool upb_isbetween(char c, char low, char high) {  return c >= low && c <= high;}static bool upb_isletter(char c) {  return upb_isbetween(c, 'A', 'Z') || upb_isbetween(c, 'a', 'z') || c == '_';}static bool upb_isalphanum(char c) {  return upb_isletter(c) || upb_isbetween(c, '0', '9');}static bool upb_isident(const char *str, size_t len, bool full, upb_status *s) {  bool start = true;  for (size_t i = 0; i < len; i++) {    char c = str[i];    if (c == '.') {      if (start || !full) {        upb_status_seterrf(s, "invalid name: unexpected '.' (%s)", str);        return false;      }      start = true;    } else if (start) {      if (!upb_isletter(c)) {        upb_status_seterrf(            s, "invalid name: path components must start with a letter (%s)",            str);        return false;      }      start = false;    } else {      if (!upb_isalphanum(c)) {        upb_status_seterrf(s, "invalid name: non-alphanumeric character (%s)",                           str);        return false;      }    }  }  return !start;}/* upb_def ********************************************************************/upb_deftype_t upb_def_type(const upb_def *d) { return d->type; }const char *upb_def_fullname(const upb_def *d) { return d->fullname; }bool upb_def_setfullname(upb_def *def, const char *fullname, upb_status *s) {  assert(!upb_def_isfrozen(def));  if (!upb_isident(fullname, strlen(fullname), true, s)) return false;  free((void*)def->fullname);  def->fullname = upb_strdup(fullname);  return true;}upb_def *upb_def_dup(const upb_def *def, const void *o) {  switch (def->type) {    case UPB_DEF_MSG:      return UPB_UPCAST(upb_msgdef_dup(upb_downcast_msgdef(def), o));    case UPB_DEF_FIELD:      return UPB_UPCAST(upb_fielddef_dup(upb_downcast_fielddef(def), o));    case UPB_DEF_ENUM:      return UPB_UPCAST(upb_enumdef_dup(upb_downcast_enumdef(def), o));    default: assert(false); return NULL;  }}bool upb_def_isfrozen(const upb_def *def) {  return upb_refcounted_isfrozen(UPB_UPCAST(def));}void upb_def_ref(const upb_def *def, const void *owner) {  upb_refcounted_ref(UPB_UPCAST(def), owner);}void upb_def_unref(const upb_def *def, const void *owner) {  upb_refcounted_unref(UPB_UPCAST(def), owner);}void upb_def_donateref(const upb_def *def, const void *from, const void *to) {  upb_refcounted_donateref(UPB_UPCAST(def), from, to);}void upb_def_checkref(const upb_def *def, const void *owner) {  upb_refcounted_checkref(UPB_UPCAST(def), owner);}static bool upb_def_init(upb_def *def, upb_deftype_t type,                         const struct upb_refcounted_vtbl *vtbl,                         const void *owner) {  if (!upb_refcounted_init(UPB_UPCAST(def), vtbl, owner)) return false;  def->type = type;  def->fullname = NULL;  def->came_from_user = false;  return true;}static void upb_def_uninit(upb_def *def) {  free((void*)def->fullname);}static const char *msgdef_name(const upb_msgdef *m) {  const char *name = upb_def_fullname(UPB_UPCAST(m));  return name ? name : "(anonymous)";}static bool upb_validate_field(upb_fielddef *f, upb_status *s) {  if (upb_fielddef_name(f) == NULL || upb_fielddef_number(f) == 0) {    upb_status_seterrmsg(s, "fielddef must have name and number set");    return false;  }  if (!f->type_is_set_) {    upb_status_seterrmsg(s, "fielddef type was not initialized");    return false;  }  if (upb_fielddef_lazy(f) &&      upb_fielddef_descriptortype(f) != UPB_DESCRIPTOR_TYPE_MESSAGE) {    upb_status_seterrmsg(s,                         "only length-delimited submessage fields may be lazy");    return false;  }  if (upb_fielddef_hassubdef(f)) {    if (f->subdef_is_symbolic) {      upb_status_seterrf(s, "field '%s.%s' has not been resolved",                         msgdef_name(f->msg.def), upb_fielddef_name(f));      return false;    }    const upb_def *subdef = upb_fielddef_subdef(f);    if (subdef == NULL) {      upb_status_seterrf(s, "field %s.%s is missing required subdef",                         msgdef_name(f->msg.def), upb_fielddef_name(f));      return false;    }    if (!upb_def_isfrozen(subdef) && !subdef->came_from_user) {      upb_status_seterrf(s,                         "subdef of field %s.%s is not frozen or being frozen",                         msgdef_name(f->msg.def), upb_fielddef_name(f));      return false;    }  }  if (upb_fielddef_type(f) == UPB_TYPE_ENUM) {    bool has_default_name = upb_fielddef_enumhasdefaultstr(f);    bool has_default_number = upb_fielddef_enumhasdefaultint32(f);    // Previously verified by upb_validate_enumdef().    assert(upb_enumdef_numvals(upb_fielddef_enumsubdef(f)) > 0);    // We've already validated that we have an associated enumdef and that it    // has at least one member, so at least one of these should be true.    // Because if the user didn't set anything, we'll pick up the enum's    // default, but if the user *did* set something we should at least pick up    // the one they set (int32 or string).    assert(has_default_name || has_default_number);    if (!has_default_name) {      upb_status_seterrf(s,                         "enum default for field %s.%s (%d) is not in the enum",                         msgdef_name(f->msg.def), upb_fielddef_name(f),                         upb_fielddef_defaultint32(f));      return false;    }    if (!has_default_number) {      upb_status_seterrf(s,                         "enum default for field %s.%s (%s) is not in the enum",                         msgdef_name(f->msg.def), upb_fielddef_name(f),                         upb_fielddef_defaultstr(f, NULL));      return false;    }    // Lift the effective numeric default into the field's default slot, in case    // we were only getting it "by reference" from the enumdef.    upb_fielddef_setdefaultint32(f, upb_fielddef_defaultint32(f));  }  return true;}static bool upb_validate_enumdef(const upb_enumdef *e, upb_status *s) {  if (upb_enumdef_numvals(e) == 0) {    upb_status_seterrf(s, "enum %s has no members (must have at least one)",                       upb_enumdef_fullname(e));    return false;  }  return true;}// All submessage fields are lower than all other fields.// Secondly, fields are increasing in order.uint32_t field_rank(const upb_fielddef *f) {  uint32_t ret = upb_fielddef_number(f);  const uint32_t high_bit = 1 << 30;  assert(ret < high_bit);  if (!upb_fielddef_issubmsg(f))    ret |= high_bit;  return ret;}int cmp_fields(const void *p1, const void *p2) {  const upb_fielddef *f1 = *(upb_fielddef*const*)p1;  const upb_fielddef *f2 = *(upb_fielddef*const*)p2;  return field_rank(f1) - field_rank(f2);}static bool assign_msg_indices(upb_msgdef *m, upb_status *s) {  // Sort fields.  upb internally relies on UPB_TYPE_MESSAGE fields having the  // lowest indexes, but we do not publicly guarantee this.  int n = upb_msgdef_numfields(m);  upb_fielddef **fields = malloc(n * sizeof(*fields));  if (!fields) return false;  upb_msg_iter j;  int i;  m->submsg_field_count = 0;  for(i = 0, upb_msg_begin(&j, m); !upb_msg_done(&j); upb_msg_next(&j), i++) {    upb_fielddef *f = upb_msg_iter_field(&j);    assert(f->msg.def == m);    if (!upb_validate_field(f, s)) {      free(fields);      return false;    }    if (upb_fielddef_issubmsg(f)) {      m->submsg_field_count++;    }    fields[i] = f;  }  qsort(fields, n, sizeof(*fields), cmp_fields);  uint32_t selector = UPB_STATIC_SELECTOR_COUNT + m->submsg_field_count;  for (i = 0; i < n; i++) {    upb_fielddef *f = fields[i];    f->index_ = i;    f->selector_base = selector + upb_handlers_selectorbaseoffset(f);    selector += upb_handlers_selectorcount(f);  }  m->selector_count = selector;#ifndef NDEBUG  // Verify that all selectors for the message are distinct.  //#define TRY(type) \  if (upb_handlers_getselector(f, type, &sel)) upb_inttable_insert(&t, sel, v);  upb_inttable t;  upb_inttable_init(&t, UPB_CTYPE_BOOL);  upb_value v = upb_value_bool(true);  upb_selector_t sel;  upb_inttable_insert(&t, UPB_STARTMSG_SELECTOR, v);  upb_inttable_insert(&t, UPB_ENDMSG_SELECTOR, v);  for(upb_msg_begin(&j, m); !upb_msg_done(&j); upb_msg_next(&j)) {    upb_fielddef *f = upb_msg_iter_field(&j);    // These calls will assert-fail in upb_table if the value already exists.    TRY(UPB_HANDLER_INT32);    TRY(UPB_HANDLER_INT64)    TRY(UPB_HANDLER_UINT32)    TRY(UPB_HANDLER_UINT64)    TRY(UPB_HANDLER_FLOAT)    TRY(UPB_HANDLER_DOUBLE)    TRY(UPB_HANDLER_BOOL)    TRY(UPB_HANDLER_STARTSTR)    TRY(UPB_HANDLER_STRING)    TRY(UPB_HANDLER_ENDSTR)    TRY(UPB_HANDLER_STARTSUBMSG)    TRY(UPB_HANDLER_ENDSUBMSG)    TRY(UPB_HANDLER_STARTSEQ)    TRY(UPB_HANDLER_ENDSEQ)  }  upb_inttable_uninit(&t);#undef TRY#endif  free(fields);  return true;}bool upb_def_freeze(upb_def *const* defs, int n, upb_status *s) {  upb_status_clear(s);  // First perform validation, in two passes so we can check that we have a  // transitive closure without needing to search.  for (int i = 0; i < n; i++) {    upb_def *def = defs[i];    if (upb_def_isfrozen(def)) {      // Could relax this requirement if it's annoying.      upb_status_seterrmsg(s, "def is already frozen");      goto err;    } else if (def->type == UPB_DEF_FIELD) {      upb_status_seterrmsg(s, "standalone fielddefs can not be frozen");      goto err;    } else if (def->type == UPB_DEF_ENUM) {      if (!upb_validate_enumdef(upb_dyncast_enumdef(def), s)) {        goto err;      }    } else {      // Set now to detect transitive closure in the second pass.      def->came_from_user = true;    }  }  // Second pass of validation.  Also assign selector bases and indexes, and  // compact tables.  for (int i = 0; i < n; i++) {    upb_msgdef *m = upb_dyncast_msgdef_mutable(defs[i]);    upb_enumdef *e = upb_dyncast_enumdef_mutable(defs[i]);    if (m) {      upb_inttable_compact(&m->itof);      if (!assign_msg_indices(m, s)) {        goto err;      }    } else if (e) {      upb_inttable_compact(&e->iton);    }  }  // Def graph contains FieldDefs between each MessageDef, so double the limit.  int maxdepth = UPB_MAX_MESSAGE_DEPTH * 2;  // Validation all passed; freeze the defs.  bool ret =      upb_refcounted_freeze((upb_refcounted * const *)defs, n, s, maxdepth);  assert(!(s && ret != upb_ok(s)));  return ret;err:  for (int i = 0; i < n; i++) {    defs[i]->came_from_user = false;  }  assert(!(s && upb_ok(s)));  return false;}/* upb_enumdef ****************************************************************/static void upb_enumdef_free(upb_refcounted *r) {  upb_enumdef *e = (upb_enumdef*)r;  upb_inttable_iter i;  upb_inttable_begin(&i, &e->iton);  for( ; !upb_inttable_done(&i); upb_inttable_next(&i)) {    // To clean up the upb_strdup() from upb_enumdef_addval().    free(upb_value_getcstr(upb_inttable_iter_value(&i)));  }  upb_strtable_uninit(&e->ntoi);  upb_inttable_uninit(&e->iton);  upb_def_uninit(UPB_UPCAST(e));  free(e);}upb_enumdef *upb_enumdef_new(const void *owner) {  static const struct upb_refcounted_vtbl vtbl = {NULL, &upb_enumdef_free};  upb_enumdef *e = malloc(sizeof(*e));  if (!e) return NULL;  if (!upb_def_init(UPB_UPCAST(e), UPB_DEF_ENUM, &vtbl, owner)) goto err2;  if (!upb_strtable_init(&e->ntoi, UPB_CTYPE_INT32)) goto err2;  if (!upb_inttable_init(&e->iton, UPB_CTYPE_CSTR)) goto err1;  return e;err1:  upb_strtable_uninit(&e->ntoi);err2:  free(e);  return NULL;}upb_enumdef *upb_enumdef_dup(const upb_enumdef *e, const void *owner) {  upb_enumdef *new_e = upb_enumdef_new(owner);  if (!new_e) return NULL;  upb_enum_iter i;  for(upb_enum_begin(&i, e); !upb_enum_done(&i); upb_enum_next(&i)) {    bool success = upb_enumdef_addval(        new_e, upb_enum_iter_name(&i),upb_enum_iter_number(&i), NULL);    if (!success) {      upb_enumdef_unref(new_e, owner);      return NULL;    }  }  return new_e;}bool upb_enumdef_isfrozen(const upb_enumdef *e) {  return upb_def_isfrozen(UPB_UPCAST(e));}void upb_enumdef_ref(const upb_enumdef *e, const void *owner) {  upb_def_ref(UPB_UPCAST(e), owner);}void upb_enumdef_unref(const upb_enumdef *e, const void *owner) {  upb_def_unref(UPB_UPCAST(e), owner);}void upb_enumdef_donateref(    const upb_enumdef *e, const void *from, const void *to) {  upb_def_donateref(UPB_UPCAST(e), from, to);}void upb_enumdef_checkref(const upb_enumdef *e, const void *owner) {  upb_def_checkref(UPB_UPCAST(e), owner);}bool upb_enumdef_freeze(upb_enumdef *e, upb_status *status) {  upb_def *d = UPB_UPCAST(e);  return upb_def_freeze(&d, 1, status);}const char *upb_enumdef_fullname(const upb_enumdef *e) {  return upb_def_fullname(UPB_UPCAST(e));}bool upb_enumdef_setfullname(upb_enumdef *e, const char *fullname,                             upb_status *s) {  return upb_def_setfullname(UPB_UPCAST(e), fullname, s);}bool upb_enumdef_addval(upb_enumdef *e, const char *name, int32_t num,                        upb_status *status) {  if (!upb_isident(name, strlen(name), false, status)) {    return false;  }  if (upb_enumdef_ntoiz(e, name, NULL)) {    upb_status_seterrf(status, "name '%s' is already defined", name);    return false;  }  if (!upb_strtable_insert(&e->ntoi, name, upb_value_int32(num))) {    upb_status_seterrmsg(status, "out of memory");    return false;  }  if (!upb_inttable_lookup(&e->iton, num, NULL) &&      !upb_inttable_insert(&e->iton, num, upb_value_cstr(upb_strdup(name)))) {    upb_status_seterrmsg(status, "out of memory");    upb_strtable_remove(&e->ntoi, name, NULL);    return false;  }  if (upb_enumdef_numvals(e) == 1) {    bool ok = upb_enumdef_setdefault(e, num, NULL);    UPB_ASSERT_VAR(ok, ok);  }  return true;}int32_t upb_enumdef_default(const upb_enumdef *e) {  assert(upb_enumdef_iton(e, e->defaultval));  return e->defaultval;}bool upb_enumdef_setdefault(upb_enumdef *e, int32_t val, upb_status *s) {  assert(!upb_enumdef_isfrozen(e));  if (!upb_enumdef_iton(e, val)) {    upb_status_seterrf(s, "number '%d' is not in the enum.", val);    return false;  }  e->defaultval = val;  return true;}int upb_enumdef_numvals(const upb_enumdef *e) {  return upb_strtable_count(&e->ntoi);}void upb_enum_begin(upb_enum_iter *i, const upb_enumdef *e) {  // We iterate over the ntoi table, to account for duplicate numbers.  upb_strtable_begin(i, &e->ntoi);}void upb_enum_next(upb_enum_iter *iter) { upb_strtable_next(iter); }bool upb_enum_done(upb_enum_iter *iter) { return upb_strtable_done(iter); }bool upb_enumdef_ntoi(const upb_enumdef *def, const char *name,                      size_t len, int32_t *num) {  upb_value v;  if (!upb_strtable_lookup2(&def->ntoi, name, len, &v)) {    return false;  }  if (num) *num = upb_value_getint32(v);  return true;}const char *upb_enumdef_iton(const upb_enumdef *def, int32_t num) {  upb_value v;  return upb_inttable_lookup32(&def->iton, num, &v) ?      upb_value_getcstr(v) : NULL;}const char *upb_enum_iter_name(upb_enum_iter *iter) {  return upb_strtable_iter_key(iter);}int32_t upb_enum_iter_number(upb_enum_iter *iter) {  return upb_value_getint32(upb_strtable_iter_value(iter));}/* upb_fielddef ***************************************************************/static void upb_fielddef_init_default(upb_fielddef *f);static void upb_fielddef_uninit_default(upb_fielddef *f) {  if (f->type_is_set_ && f->default_is_string && f->defaultval.bytes)    freestr(f->defaultval.bytes);}static void visitfield(const upb_refcounted *r, upb_refcounted_visit *visit,                       void *closure) {  const upb_fielddef *f = (const upb_fielddef*)r;  if (upb_fielddef_containingtype(f)) {    visit(r, UPB_UPCAST2(upb_fielddef_containingtype(f)), closure);  }  if (upb_fielddef_subdef(f)) {    visit(r, UPB_UPCAST(upb_fielddef_subdef(f)), closure);  }}static void freefield(upb_refcounted *r) {  upb_fielddef *f = (upb_fielddef*)r;  upb_fielddef_uninit_default(f);  if (f->subdef_is_symbolic)    free(f->sub.name);  upb_def_uninit(UPB_UPCAST(f));  free(f);}static const char *enumdefaultstr(const upb_fielddef *f) {  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);  const upb_enumdef *e = upb_fielddef_enumsubdef(f);  if (f->default_is_string && f->defaultval.bytes) {    // Default was explicitly set as a string.    str_t *s = f->defaultval.bytes;    return s->str;  } else if (e) {    if (!f->default_is_string) {      // Default was explicitly set as an integer; look it up in enumdef.      const char *name = upb_enumdef_iton(e, f->defaultval.sint);      if (name) {        return name;      }    } else {      // Default is completely unset; pull enumdef default.      if (upb_enumdef_numvals(e) > 0) {        const char *name = upb_enumdef_iton(e, upb_enumdef_default(e));        assert(name);        return name;      }    }  }  return NULL;}static bool enumdefaultint32(const upb_fielddef *f, int32_t *val) {  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);  const upb_enumdef *e = upb_fielddef_enumsubdef(f);  if (!f->default_is_string) {    // Default was explicitly set as an integer.    *val = f->defaultval.sint;    return true;  } else if (e) {    if (f->defaultval.bytes) {      // Default was explicitly set as a str; try to lookup corresponding int.      str_t *s = f->defaultval.bytes;      if (upb_enumdef_ntoiz(e, s->str, val)) {        return true;      }    } else {      // Default is unset; try to pull in enumdef default.      if (upb_enumdef_numvals(e) > 0) {        *val = upb_enumdef_default(e);        return true;      }    }  }  return false;}upb_fielddef *upb_fielddef_new(const void *owner) {  static const struct upb_refcounted_vtbl vtbl = {visitfield, freefield};  upb_fielddef *f = malloc(sizeof(*f));  if (!f) return NULL;  if (!upb_def_init(UPB_UPCAST(f), UPB_DEF_FIELD, &vtbl, owner)) {    free(f);    return NULL;  }  f->msg.def = NULL;  f->sub.def = NULL;  f->subdef_is_symbolic = false;  f->msg_is_symbolic = false;  f->label_ = UPB_LABEL_OPTIONAL;  f->type_ = UPB_TYPE_INT32;  f->number_ = 0;  f->type_is_set_ = false;  f->tagdelim = false;  f->is_extension_ = false;  f->lazy_ = false;  f->packed_ = true;  // For the moment we default this to UPB_INTFMT_VARIABLE, since it will work  // with all integer types and is in some since more "default" since the most  // normal-looking proto2 types int32/int64/uint32/uint64 use variable.  //  // Other options to consider:  // - there is no default; users must set this manually (like type).  // - default signed integers to UPB_INTFMT_ZIGZAG, since it's more likely to  //   be an optimal default for signed integers.  f->intfmt = UPB_INTFMT_VARIABLE;  return f;}upb_fielddef *upb_fielddef_dup(const upb_fielddef *f, const void *owner) {  upb_fielddef *newf = upb_fielddef_new(owner);  if (!newf) return NULL;  upb_fielddef_settype(newf, upb_fielddef_type(f));  upb_fielddef_setlabel(newf, upb_fielddef_label(f));  upb_fielddef_setnumber(newf, upb_fielddef_number(f), NULL);  upb_fielddef_setname(newf, upb_fielddef_name(f), NULL);  if (f->default_is_string && f->defaultval.bytes) {    str_t *s = f->defaultval.bytes;    upb_fielddef_setdefaultstr(newf, s->str, s->len, NULL);  } else {    newf->default_is_string = f->default_is_string;    newf->defaultval = f->defaultval;  }  const char *srcname;  if (f->subdef_is_symbolic) {    srcname = f->sub.name;  // Might be NULL.  } else {    srcname = f->sub.def ? upb_def_fullname(f->sub.def) : NULL;  }  if (srcname) {    char *newname = malloc(strlen(f->sub.def->fullname) + 2);    if (!newname) {      upb_fielddef_unref(newf, owner);      return NULL;    }    strcpy(newname, ".");    strcat(newname, f->sub.def->fullname);    upb_fielddef_setsubdefname(newf, newname, NULL);    free(newname);  }  return newf;}bool upb_fielddef_isfrozen(const upb_fielddef *f) {  return upb_def_isfrozen(UPB_UPCAST(f));}void upb_fielddef_ref(const upb_fielddef *f, const void *owner) {  upb_def_ref(UPB_UPCAST(f), owner);}void upb_fielddef_unref(const upb_fielddef *f, const void *owner) {  upb_def_unref(UPB_UPCAST(f), owner);}void upb_fielddef_donateref(    const upb_fielddef *f, const void *from, const void *to) {  upb_def_donateref(UPB_UPCAST(f), from, to);}void upb_fielddef_checkref(const upb_fielddef *f, const void *owner) {  upb_def_checkref(UPB_UPCAST(f), owner);}bool upb_fielddef_typeisset(const upb_fielddef *f) {  return f->type_is_set_;}upb_fieldtype_t upb_fielddef_type(const upb_fielddef *f) {  assert(f->type_is_set_);  return f->type_;}uint32_t upb_fielddef_index(const upb_fielddef *f) {  return f->index_;}upb_label_t upb_fielddef_label(const upb_fielddef *f) {  return f->label_;}upb_intfmt_t upb_fielddef_intfmt(const upb_fielddef *f) {  return f->intfmt;}bool upb_fielddef_istagdelim(const upb_fielddef *f) {  return f->tagdelim;}uint32_t upb_fielddef_number(const upb_fielddef *f) {  return f->number_;}bool upb_fielddef_isextension(const upb_fielddef *f) {  return f->is_extension_;}bool upb_fielddef_lazy(const upb_fielddef *f) {  return f->lazy_;}bool upb_fielddef_packed(const upb_fielddef *f) {  return f->packed_;}const char *upb_fielddef_name(const upb_fielddef *f) {  return upb_def_fullname(UPB_UPCAST(f));}const upb_msgdef *upb_fielddef_containingtype(const upb_fielddef *f) {  return f->msg_is_symbolic ? NULL : f->msg.def;}upb_msgdef *upb_fielddef_containingtype_mutable(upb_fielddef *f) {  return (upb_msgdef*)upb_fielddef_containingtype(f);}const char *upb_fielddef_containingtypename(upb_fielddef *f) {  return f->msg_is_symbolic ? f->msg.name : NULL;}static void release_containingtype(upb_fielddef *f) {  if (f->msg_is_symbolic) free(f->msg.name);}bool upb_fielddef_setcontainingtypename(upb_fielddef *f, const char *name,                                        upb_status *s) {  assert(!upb_fielddef_isfrozen(f));  if (upb_fielddef_containingtype(f)) {    upb_status_seterrmsg(s, "field has already been added to a message.");    return false;  }  // TODO: validate name (upb_isident() doesn't quite work atm because this name  // may have a leading ".").  release_containingtype(f);  f->msg.name = upb_strdup(name);  f->msg_is_symbolic = true;  return true;}bool upb_fielddef_setname(upb_fielddef *f, const char *name, upb_status *s) {  return upb_def_setfullname(UPB_UPCAST(f), name, s);}static void chkdefaulttype(const upb_fielddef *f, upb_fieldtype_t type) {  UPB_UNUSED(f);  UPB_UNUSED(type);  assert(f->type_is_set_ && upb_fielddef_type(f) == type);}int64_t upb_fielddef_defaultint64(const upb_fielddef *f) {  chkdefaulttype(f, UPB_TYPE_INT64);  return f->defaultval.sint;}int32_t upb_fielddef_defaultint32(const upb_fielddef *f) {  if (f->type_is_set_ && upb_fielddef_type(f) == UPB_TYPE_ENUM) {    int32_t val;    bool ok = enumdefaultint32(f, &val);    UPB_ASSERT_VAR(ok, ok);    return val;  } else {    chkdefaulttype(f, UPB_TYPE_INT32);    return f->defaultval.sint;  }}uint64_t upb_fielddef_defaultuint64(const upb_fielddef *f) {  chkdefaulttype(f, UPB_TYPE_UINT64);  return f->defaultval.uint;}uint32_t upb_fielddef_defaultuint32(const upb_fielddef *f) {  chkdefaulttype(f, UPB_TYPE_UINT32);  return f->defaultval.uint;}bool upb_fielddef_defaultbool(const upb_fielddef *f) {  chkdefaulttype(f, UPB_TYPE_BOOL);  return f->defaultval.uint;}float upb_fielddef_defaultfloat(const upb_fielddef *f) {  chkdefaulttype(f, UPB_TYPE_FLOAT);  return f->defaultval.flt;}double upb_fielddef_defaultdouble(const upb_fielddef *f) {  chkdefaulttype(f, UPB_TYPE_DOUBLE);  return f->defaultval.dbl;}const char *upb_fielddef_defaultstr(const upb_fielddef *f, size_t *len) {  assert(f->type_is_set_);  assert(upb_fielddef_type(f) == UPB_TYPE_STRING ||         upb_fielddef_type(f) == UPB_TYPE_BYTES ||         upb_fielddef_type(f) == UPB_TYPE_ENUM);  if (upb_fielddef_type(f) == UPB_TYPE_ENUM) {    const char *ret = enumdefaultstr(f);    assert(ret);    // Enum defaults can't have embedded NULLs.    if (len) *len = strlen(ret);    return ret;  }  if (f->default_is_string) {    str_t *str = f->defaultval.bytes;    if (len) *len = str->len;    return str->str;  }  return NULL;}static void upb_fielddef_init_default(upb_fielddef *f) {  f->default_is_string = false;  switch (upb_fielddef_type(f)) {    case UPB_TYPE_DOUBLE: f->defaultval.dbl = 0; break;    case UPB_TYPE_FLOAT: f->defaultval.flt = 0; break;    case UPB_TYPE_INT32:    case UPB_TYPE_INT64: f->defaultval.sint = 0; break;    case UPB_TYPE_UINT64:    case UPB_TYPE_UINT32:    case UPB_TYPE_BOOL: f->defaultval.uint = 0; break;    case UPB_TYPE_STRING:    case UPB_TYPE_BYTES:      f->defaultval.bytes = newstr("", 0);      f->default_is_string = true;      break;    case UPB_TYPE_MESSAGE: break;    case UPB_TYPE_ENUM:      // This is our special sentinel that indicates "not set" for an enum.      f->default_is_string = true;      f->defaultval.bytes = NULL;      break;  }}const upb_def *upb_fielddef_subdef(const upb_fielddef *f) {  return f->subdef_is_symbolic ? NULL : f->sub.def;}const upb_msgdef *upb_fielddef_msgsubdef(const upb_fielddef *f) {  const upb_def *def = upb_fielddef_subdef(f);  return def ? upb_dyncast_msgdef(def) : NULL;}const upb_enumdef *upb_fielddef_enumsubdef(const upb_fielddef *f) {  const upb_def *def = upb_fielddef_subdef(f);  return def ? upb_dyncast_enumdef(def) : NULL;}upb_def *upb_fielddef_subdef_mutable(upb_fielddef *f) {  return (upb_def*)upb_fielddef_subdef(f);}const char *upb_fielddef_subdefname(const upb_fielddef *f) {  if (f->subdef_is_symbolic) {    return f->sub.name;  } else if (f->sub.def) {    return upb_def_fullname(f->sub.def);  } else {    return NULL;  }}bool upb_fielddef_setnumber(upb_fielddef *f, uint32_t number, upb_status *s) {  if (upb_fielddef_containingtype(f)) {    upb_status_seterrmsg(        s, "cannot change field number after adding to a message");    return false;  }  if (number == 0 || number > UPB_MAX_FIELDNUMBER) {    upb_status_seterrf(s, "invalid field number (%u)", number);    return false;  }  f->number_ = number;  return true;}void upb_fielddef_settype(upb_fielddef *f, upb_fieldtype_t type) {  assert(!upb_fielddef_isfrozen(f));  assert(upb_fielddef_checktype(type));  upb_fielddef_uninit_default(f);  f->type_ = type;  f->type_is_set_ = true;  upb_fielddef_init_default(f);}void upb_fielddef_setdescriptortype(upb_fielddef *f, int type) {  assert(!upb_fielddef_isfrozen(f));  switch (type) {    case UPB_DESCRIPTOR_TYPE_DOUBLE:      upb_fielddef_settype(f, UPB_TYPE_DOUBLE);      break;    case UPB_DESCRIPTOR_TYPE_FLOAT:      upb_fielddef_settype(f, UPB_TYPE_FLOAT);      break;    case UPB_DESCRIPTOR_TYPE_INT64:    case UPB_DESCRIPTOR_TYPE_SFIXED64:    case UPB_DESCRIPTOR_TYPE_SINT64:      upb_fielddef_settype(f, UPB_TYPE_INT64);      break;    case UPB_DESCRIPTOR_TYPE_UINT64:    case UPB_DESCRIPTOR_TYPE_FIXED64:      upb_fielddef_settype(f, UPB_TYPE_UINT64);      break;    case UPB_DESCRIPTOR_TYPE_INT32:    case UPB_DESCRIPTOR_TYPE_SFIXED32:    case UPB_DESCRIPTOR_TYPE_SINT32:      upb_fielddef_settype(f, UPB_TYPE_INT32);      break;    case UPB_DESCRIPTOR_TYPE_UINT32:    case UPB_DESCRIPTOR_TYPE_FIXED32:      upb_fielddef_settype(f, UPB_TYPE_UINT32);      break;    case UPB_DESCRIPTOR_TYPE_BOOL:      upb_fielddef_settype(f, UPB_TYPE_BOOL);      break;    case UPB_DESCRIPTOR_TYPE_STRING:      upb_fielddef_settype(f, UPB_TYPE_STRING);      break;    case UPB_DESCRIPTOR_TYPE_BYTES:      upb_fielddef_settype(f, UPB_TYPE_BYTES);      break;    case UPB_DESCRIPTOR_TYPE_GROUP:    case UPB_DESCRIPTOR_TYPE_MESSAGE:      upb_fielddef_settype(f, UPB_TYPE_MESSAGE);      break;    case UPB_DESCRIPTOR_TYPE_ENUM:      upb_fielddef_settype(f, UPB_TYPE_ENUM);      break;    default: assert(false);  }  if (type == UPB_DESCRIPTOR_TYPE_FIXED64 ||      type == UPB_DESCRIPTOR_TYPE_FIXED32 ||      type == UPB_DESCRIPTOR_TYPE_SFIXED64 ||      type == UPB_DESCRIPTOR_TYPE_SFIXED32) {    upb_fielddef_setintfmt(f, UPB_INTFMT_FIXED);  } else if (type == UPB_DESCRIPTOR_TYPE_SINT64 ||             type == UPB_DESCRIPTOR_TYPE_SINT32) {    upb_fielddef_setintfmt(f, UPB_INTFMT_ZIGZAG);  } else {    upb_fielddef_setintfmt(f, UPB_INTFMT_VARIABLE);  }  upb_fielddef_settagdelim(f, type == UPB_DESCRIPTOR_TYPE_GROUP);}upb_descriptortype_t upb_fielddef_descriptortype(const upb_fielddef *f) {  switch (upb_fielddef_type(f)) {    case UPB_TYPE_FLOAT:  return UPB_DESCRIPTOR_TYPE_FLOAT;    case UPB_TYPE_DOUBLE: return UPB_DESCRIPTOR_TYPE_DOUBLE;    case UPB_TYPE_BOOL:   return UPB_DESCRIPTOR_TYPE_BOOL;    case UPB_TYPE_STRING: return UPB_DESCRIPTOR_TYPE_STRING;    case UPB_TYPE_BYTES:  return UPB_DESCRIPTOR_TYPE_BYTES;    case UPB_TYPE_ENUM:   return UPB_DESCRIPTOR_TYPE_ENUM;    case UPB_TYPE_INT32:      switch (upb_fielddef_intfmt(f)) {        case UPB_INTFMT_VARIABLE: return UPB_DESCRIPTOR_TYPE_INT32;        case UPB_INTFMT_FIXED:    return UPB_DESCRIPTOR_TYPE_SFIXED32;        case UPB_INTFMT_ZIGZAG:   return UPB_DESCRIPTOR_TYPE_SINT32;      }    case UPB_TYPE_INT64:      switch (upb_fielddef_intfmt(f)) {        case UPB_INTFMT_VARIABLE: return UPB_DESCRIPTOR_TYPE_INT64;        case UPB_INTFMT_FIXED:    return UPB_DESCRIPTOR_TYPE_SFIXED64;        case UPB_INTFMT_ZIGZAG:   return UPB_DESCRIPTOR_TYPE_SINT64;      }    case UPB_TYPE_UINT32:      switch (upb_fielddef_intfmt(f)) {        case UPB_INTFMT_VARIABLE: return UPB_DESCRIPTOR_TYPE_UINT32;        case UPB_INTFMT_FIXED:    return UPB_DESCRIPTOR_TYPE_FIXED32;        case UPB_INTFMT_ZIGZAG:   return -1;      }    case UPB_TYPE_UINT64:      switch (upb_fielddef_intfmt(f)) {        case UPB_INTFMT_VARIABLE: return UPB_DESCRIPTOR_TYPE_UINT64;        case UPB_INTFMT_FIXED:    return UPB_DESCRIPTOR_TYPE_FIXED64;        case UPB_INTFMT_ZIGZAG:   return -1;      }    case UPB_TYPE_MESSAGE:      return upb_fielddef_istagdelim(f) ?          UPB_DESCRIPTOR_TYPE_GROUP : UPB_DESCRIPTOR_TYPE_MESSAGE;  }  return 0;}void upb_fielddef_setisextension(upb_fielddef *f, bool is_extension) {  assert(!upb_fielddef_isfrozen(f));  f->is_extension_ = is_extension;}void upb_fielddef_setlazy(upb_fielddef *f, bool lazy) {  assert(!upb_fielddef_isfrozen(f));  f->lazy_ = lazy;}void upb_fielddef_setpacked(upb_fielddef *f, bool packed) {  assert(!upb_fielddef_isfrozen(f));  f->packed_ = packed;}void upb_fielddef_setlabel(upb_fielddef *f, upb_label_t label) {  assert(!upb_fielddef_isfrozen(f));  assert(upb_fielddef_checklabel(label));  f->label_ = label;}void upb_fielddef_setintfmt(upb_fielddef *f, upb_intfmt_t fmt) {  assert(!upb_fielddef_isfrozen(f));  assert(upb_fielddef_checkintfmt(fmt));  f->intfmt = fmt;}void upb_fielddef_settagdelim(upb_fielddef *f, bool tag_delim) {  assert(!upb_fielddef_isfrozen(f));  f->tagdelim = tag_delim;  f->tagdelim = tag_delim;}static bool checksetdefault(upb_fielddef *f, upb_fieldtype_t type) {  if (!f->type_is_set_ || upb_fielddef_isfrozen(f) ||      upb_fielddef_type(f) != type) {    assert(false);    return false;  }  if (f->default_is_string) {    str_t *s = f->defaultval.bytes;    assert(s || type == UPB_TYPE_ENUM);    if (s) freestr(s);  }  f->default_is_string = false;  return true;}void upb_fielddef_setdefaultint64(upb_fielddef *f, int64_t value) {  if (checksetdefault(f, UPB_TYPE_INT64))    f->defaultval.sint = value;}void upb_fielddef_setdefaultint32(upb_fielddef *f, int32_t value) {  if ((upb_fielddef_type(f) == UPB_TYPE_ENUM &&       checksetdefault(f, UPB_TYPE_ENUM)) ||      checksetdefault(f, UPB_TYPE_INT32)) {    f->defaultval.sint = value;  }}void upb_fielddef_setdefaultuint64(upb_fielddef *f, uint64_t value) {  if (checksetdefault(f, UPB_TYPE_UINT64))    f->defaultval.uint = value;}void upb_fielddef_setdefaultuint32(upb_fielddef *f, uint32_t value) {  if (checksetdefault(f, UPB_TYPE_UINT32))    f->defaultval.uint = value;}void upb_fielddef_setdefaultbool(upb_fielddef *f, bool value) {  if (checksetdefault(f, UPB_TYPE_BOOL))    f->defaultval.uint = value;}void upb_fielddef_setdefaultfloat(upb_fielddef *f, float value) {  if (checksetdefault(f, UPB_TYPE_FLOAT))    f->defaultval.flt = value;}void upb_fielddef_setdefaultdouble(upb_fielddef *f, double value) {  if (checksetdefault(f, UPB_TYPE_DOUBLE))    f->defaultval.dbl = value;}bool upb_fielddef_setdefaultstr(upb_fielddef *f, const void *str, size_t len,                                upb_status *s) {  assert(upb_fielddef_isstring(f) || f->type_ == UPB_TYPE_ENUM);  if (f->type_ == UPB_TYPE_ENUM && !upb_isident(str, len, false, s))    return false;  if (f->default_is_string) {    str_t *s = f->defaultval.bytes;    assert(s || f->type_ == UPB_TYPE_ENUM);    if (s) freestr(s);  } else {    assert(f->type_ == UPB_TYPE_ENUM);  }  str_t *str2 = newstr(str, len);  f->defaultval.bytes = str2;  f->default_is_string = true;  return true;}void upb_fielddef_setdefaultcstr(upb_fielddef *f, const char *str,                                 upb_status *s) {  assert(f->type_is_set_);  upb_fielddef_setdefaultstr(f, str, str ? strlen(str) : 0, s);}bool upb_fielddef_enumhasdefaultint32(const upb_fielddef *f) {  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);  int32_t val;  return enumdefaultint32(f, &val);}bool upb_fielddef_enumhasdefaultstr(const upb_fielddef *f) {  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);  return enumdefaultstr(f) != NULL;}static bool upb_subdef_typecheck(upb_fielddef *f, const upb_def *subdef,                                 upb_status *s) {  if (f->type_ == UPB_TYPE_MESSAGE) {    if (upb_dyncast_msgdef(subdef)) return true;    upb_status_seterrmsg(s, "invalid subdef type for this submessage field");    return false;  } else if (f->type_ == UPB_TYPE_ENUM) {    if (upb_dyncast_enumdef(subdef)) return true;    upb_status_seterrmsg(s, "invalid subdef type for this enum field");    return false;  } else {    upb_status_seterrmsg(s, "only message and enum fields can have a subdef");    return false;  }}static void release_subdef(upb_fielddef *f) {  if (f->subdef_is_symbolic) {    free(f->sub.name);  } else if (f->sub.def) {    upb_unref2(f->sub.def, f);  }}bool upb_fielddef_setsubdef(upb_fielddef *f, const upb_def *subdef,                            upb_status *s) {  assert(!upb_fielddef_isfrozen(f));  assert(upb_fielddef_hassubdef(f));  if (subdef && !upb_subdef_typecheck(f, subdef, s)) return false;  release_subdef(f);  f->sub.def = subdef;  f->subdef_is_symbolic = false;  if (f->sub.def) upb_ref2(f->sub.def, f);  return true;}bool upb_fielddef_setmsgsubdef(upb_fielddef *f, const upb_msgdef *subdef,                               upb_status *s) {  return upb_fielddef_setsubdef(f, UPB_UPCAST(subdef), s);}bool upb_fielddef_setenumsubdef(upb_fielddef *f, const upb_enumdef *subdef,                                upb_status *s) {  return upb_fielddef_setsubdef(f, UPB_UPCAST(subdef), s);}bool upb_fielddef_setsubdefname(upb_fielddef *f, const char *name,                                upb_status *s) {  assert(!upb_fielddef_isfrozen(f));  if (!upb_fielddef_hassubdef(f)) {    upb_status_seterrmsg(s, "field type does not accept a subdef");    return false;  }  // TODO: validate name (upb_isident() doesn't quite work atm because this name  // may have a leading ".").  release_subdef(f);  f->sub.name = upb_strdup(name);  f->subdef_is_symbolic = true;  return true;}bool upb_fielddef_issubmsg(const upb_fielddef *f) {  return upb_fielddef_type(f) == UPB_TYPE_MESSAGE;}bool upb_fielddef_isstring(const upb_fielddef *f) {  return upb_fielddef_type(f) == UPB_TYPE_STRING ||         upb_fielddef_type(f) == UPB_TYPE_BYTES;}bool upb_fielddef_isseq(const upb_fielddef *f) {  return upb_fielddef_label(f) == UPB_LABEL_REPEATED;}bool upb_fielddef_isprimitive(const upb_fielddef *f) {  return !upb_fielddef_isstring(f) && !upb_fielddef_issubmsg(f);}bool upb_fielddef_hassubdef(const upb_fielddef *f) {  return upb_fielddef_issubmsg(f) || upb_fielddef_type(f) == UPB_TYPE_ENUM;}static bool between(int32_t x, int32_t low, int32_t high) {  return x >= low && x <= high;}bool upb_fielddef_checklabel(int32_t label) { return between(label, 1, 3); }bool upb_fielddef_checktype(int32_t type) { return between(type, 1, 11); }bool upb_fielddef_checkintfmt(int32_t fmt) { return between(fmt, 1, 3); }bool upb_fielddef_checkdescriptortype(int32_t type) {  return between(type, 1, 18);}/* upb_msgdef *****************************************************************/static void visitmsg(const upb_refcounted *r, upb_refcounted_visit *visit,                     void *closure) {  const upb_msgdef *m = (const upb_msgdef*)r;  upb_msg_iter i;  for(upb_msg_begin(&i, m); !upb_msg_done(&i); upb_msg_next(&i)) {    upb_fielddef *f = upb_msg_iter_field(&i);    visit(r, UPB_UPCAST2(f), closure);  }}static void freemsg(upb_refcounted *r) {  upb_msgdef *m = (upb_msgdef*)r;  upb_strtable_uninit(&m->ntof);  upb_inttable_uninit(&m->itof);  upb_def_uninit(UPB_UPCAST(m));  free(m);}upb_msgdef *upb_msgdef_new(const void *owner) {  static const struct upb_refcounted_vtbl vtbl = {visitmsg, freemsg};  upb_msgdef *m = malloc(sizeof(*m));  if (!m) return NULL;  if (!upb_def_init(UPB_UPCAST(m), UPB_DEF_MSG, &vtbl, owner)) goto err2;  if (!upb_inttable_init(&m->itof, UPB_CTYPE_PTR)) goto err2;  if (!upb_strtable_init(&m->ntof, UPB_CTYPE_PTR)) goto err1;  m->map_entry = false;  return m;err1:  upb_inttable_uninit(&m->itof);err2:  free(m);  return NULL;}upb_msgdef *upb_msgdef_dup(const upb_msgdef *m, const void *owner) {  upb_msgdef *newm = upb_msgdef_new(owner);  if (!newm) return NULL;  bool ok = upb_def_setfullname(UPB_UPCAST(newm),                                upb_def_fullname(UPB_UPCAST(m)), NULL);  newm->map_entry = m->map_entry;  UPB_ASSERT_VAR(ok, ok);  upb_msg_iter i;  for(upb_msg_begin(&i, m); !upb_msg_done(&i); upb_msg_next(&i)) {    upb_fielddef *f = upb_fielddef_dup(upb_msg_iter_field(&i), &f);    if (!f || !upb_msgdef_addfield(newm, f, &f, NULL)) {      upb_msgdef_unref(newm, owner);      return NULL;    }  }  return newm;}bool upb_msgdef_isfrozen(const upb_msgdef *m) {  return upb_def_isfrozen(UPB_UPCAST(m));}void upb_msgdef_ref(const upb_msgdef *m, const void *owner) {  upb_def_ref(UPB_UPCAST(m), owner);}void upb_msgdef_unref(const upb_msgdef *m, const void *owner) {  upb_def_unref(UPB_UPCAST(m), owner);}void upb_msgdef_donateref(    const upb_msgdef *m, const void *from, const void *to) {  upb_def_donateref(UPB_UPCAST(m), from, to);}void upb_msgdef_checkref(const upb_msgdef *m, const void *owner) {  upb_def_checkref(UPB_UPCAST(m), owner);}bool upb_msgdef_freeze(upb_msgdef *m, upb_status *status) {  upb_def *d = UPB_UPCAST(m);  return upb_def_freeze(&d, 1, status);}const char *upb_msgdef_fullname(const upb_msgdef *m) {  return upb_def_fullname(UPB_UPCAST(m));}bool upb_msgdef_setfullname(upb_msgdef *m, const char *fullname,                            upb_status *s) {  return upb_def_setfullname(UPB_UPCAST(m), fullname, s);}bool upb_msgdef_addfield(upb_msgdef *m, upb_fielddef *f, const void *ref_donor,                         upb_status *s) {  // TODO: extensions need to have a separate namespace, because proto2 allows a  // top-level extension (ie. one not in any package) to have the same name as a  // field from the message.  //  // This also implies that there needs to be a separate lookup-by-name method  // for extensions.  It seems desirable for iteration to return both extensions  // and non-extensions though.  //  // We also need to validate that the field number is in an extension range iff  // it is an extension.  // Check constraints for all fields before performing any action.  if (upb_fielddef_containingtype(f) != NULL) {    upb_status_seterrmsg(s, "fielddef already belongs to a message");    return false;  } else if (upb_fielddef_name(f) == NULL || upb_fielddef_number(f) == 0) {    upb_status_seterrmsg(s, "field name or number were not set");    return false;  } else if(upb_msgdef_itof(m, upb_fielddef_number(f)) ||            upb_msgdef_ntofz(m, upb_fielddef_name(f))) {    upb_status_seterrmsg(s, "duplicate field name or number");    return false;  }  // Constraint checks ok, perform the action.  release_containingtype(f);  f->msg.def = m;  f->msg_is_symbolic = false;  upb_inttable_insert(&m->itof, upb_fielddef_number(f), upb_value_ptr(f));  upb_strtable_insert(&m->ntof, upb_fielddef_name(f), upb_value_ptr(f));  upb_ref2(f, m);  upb_ref2(m, f);  if (ref_donor) upb_fielddef_unref(f, ref_donor);  return true;}const upb_fielddef *upb_msgdef_itof(const upb_msgdef *m, uint32_t i) {  upb_value val;  return upb_inttable_lookup32(&m->itof, i, &val) ?      upb_value_getptr(val) : NULL;}const upb_fielddef *upb_msgdef_ntof(const upb_msgdef *m, const char *name,                                    size_t len) {  upb_value val;  return upb_strtable_lookup2(&m->ntof, name, len, &val) ?      upb_value_getptr(val) : NULL;}int upb_msgdef_numfields(const upb_msgdef *m) {  return upb_strtable_count(&m->ntof);}void upb_msgdef_setmapentry(upb_msgdef *m, bool map_entry) {  assert(!upb_msgdef_isfrozen(m));  m->map_entry = map_entry;}bool upb_msgdef_mapentry(const upb_msgdef *m) {  return m->map_entry;}void upb_msg_begin(upb_msg_iter *iter, const upb_msgdef *m) {  upb_inttable_begin(iter, &m->itof);}void upb_msg_next(upb_msg_iter *iter) { upb_inttable_next(iter); }bool upb_msg_done(const upb_msg_iter *iter) { return upb_inttable_done(iter); }upb_fielddef *upb_msg_iter_field(const upb_msg_iter *iter) {  return (upb_fielddef*)upb_value_getptr(upb_inttable_iter_value(iter));}void upb_msg_iter_setdone(upb_msg_iter *iter) {  upb_inttable_iter_setdone(iter);}/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2011-2012 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> * * TODO(haberman): it's unclear whether a lot of the consistency checks should * assert() or return false. */#include <stdlib.h>#include <string.h>// Defined for the sole purpose of having a unique pointer value for// UPB_NO_CLOSURE.char _upb_noclosure;static void freehandlers(upb_refcounted *r) {  upb_handlers *h = (upb_handlers*)r;  upb_inttable_iter i;  upb_inttable_begin(&i, &h->cleanup_);  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {    void *val = (void*)upb_inttable_iter_key(&i);    upb_value func_val = upb_inttable_iter_value(&i);    upb_handlerfree *func = upb_value_getfptr(func_val);    func(val);  }  upb_inttable_uninit(&h->cleanup_);  upb_msgdef_unref(h->msg, h);  free(h->sub);  free(h);}static void visithandlers(const upb_refcounted *r, upb_refcounted_visit *visit,                          void *closure) {  const upb_handlers *h = (const upb_handlers*)r;  upb_msg_iter i;  for(upb_msg_begin(&i, h->msg); !upb_msg_done(&i); upb_msg_next(&i)) {    upb_fielddef *f = upb_msg_iter_field(&i);    if (!upb_fielddef_issubmsg(f)) continue;    const upb_handlers *sub = upb_handlers_getsubhandlers(h, f);    if (sub) visit(r, UPB_UPCAST(sub), closure);  }}static const struct upb_refcounted_vtbl vtbl = {visithandlers, freehandlers};typedef struct {  upb_inttable tab;  // maps upb_msgdef* -> upb_handlers*.  upb_handlers_callback *callback;  const void *closure;} dfs_state;// TODO(haberman): discard upb_handlers* objects that do not actually have any// handlers set and cannot reach any upb_handlers* object that does.  This is// slightly tricky to do correctly.static upb_handlers *newformsg(const upb_msgdef *m, const void *owner,                               dfs_state *s) {  upb_handlers *h = upb_handlers_new(m, owner);  if (!h) return NULL;  if (!upb_inttable_insertptr(&s->tab, m, upb_value_ptr(h))) goto oom;  s->callback(s->closure, h);  // For each submessage field, get or create a handlers object and set it as  // the subhandlers.  upb_msg_iter i;  for(upb_msg_begin(&i, m); !upb_msg_done(&i); upb_msg_next(&i)) {    upb_fielddef *f = upb_msg_iter_field(&i);    if (!upb_fielddef_issubmsg(f)) continue;    const upb_msgdef *subdef = upb_downcast_msgdef(upb_fielddef_subdef(f));    upb_value subm_ent;    if (upb_inttable_lookupptr(&s->tab, subdef, &subm_ent)) {      upb_handlers_setsubhandlers(h, f, upb_value_getptr(subm_ent));    } else {      upb_handlers *sub_mh = newformsg(subdef, &sub_mh, s);      if (!sub_mh) goto oom;      upb_handlers_setsubhandlers(h, f, sub_mh);      upb_handlers_unref(sub_mh, &sub_mh);    }  }  return h;oom:  upb_handlers_unref(h, owner);  return NULL;}// Given a selector for a STARTSUBMSG handler, resolves to a pointer to the// subhandlers for this submessage field.#define SUBH(h, selector) (h->sub[selector])// The selector for a submessage field is the field index.#define SUBH_F(h, f) SUBH(h, f->index_)static int32_t trygetsel(upb_handlers *h, const upb_fielddef *f,                         upb_handlertype_t type) {  upb_selector_t sel;  assert(!upb_handlers_isfrozen(h));  if (upb_handlers_msgdef(h) != upb_fielddef_containingtype(f)) {    upb_status_seterrf(        &h->status_, "type mismatch: field %s does not belong to message %s",        upb_fielddef_name(f), upb_msgdef_fullname(upb_handlers_msgdef(h)));    return -1;  }  if (!upb_handlers_getselector(f, type, &sel)) {    upb_status_seterrf(        &h->status_,        "type mismatch: cannot register handler type %d for field %s",        type, upb_fielddef_name(f));    return -1;  }  return sel;}static upb_selector_t handlers_getsel(upb_handlers *h, const upb_fielddef *f,                             upb_handlertype_t type) {  int32_t sel = trygetsel(h, f, type);  assert(sel >= 0);  return sel;}static const void **returntype(upb_handlers *h, const upb_fielddef *f,                               upb_handlertype_t type) {  return &h->table[handlers_getsel(h, f, type)].attr.return_closure_type_;}static bool doset(upb_handlers *h, int32_t sel, const upb_fielddef *f,                  upb_handlertype_t type, upb_func *func,                  upb_handlerattr *attr) {  assert(!upb_handlers_isfrozen(h));  if (sel < 0) {    upb_status_seterrmsg(&h->status_,                         "incorrect handler type for this field.");    return false;  }  if (h->table[sel].func) {    upb_status_seterrmsg(&h->status_,                         "cannot change handler once it has been set.");    return false;  }  upb_handlerattr set_attr = UPB_HANDLERATTR_INITIALIZER;  if (attr) {    set_attr = *attr;  }  // Check that the given closure type matches the closure type that has been  // established for this context (if any).  const void *closure_type = upb_handlerattr_closuretype(&set_attr);  const void **context_closure_type;  if (type == UPB_HANDLER_STRING) {    context_closure_type = returntype(h, f, UPB_HANDLER_STARTSTR);  } else if (f && upb_fielddef_isseq(f) &&             type != UPB_HANDLER_STARTSEQ &&             type != UPB_HANDLER_ENDSEQ) {    context_closure_type = returntype(h, f, UPB_HANDLER_STARTSEQ);  } else {    context_closure_type = &h->top_closure_type;  }  if (closure_type && *context_closure_type &&      closure_type != *context_closure_type) {    // TODO(haberman): better message for debugging.    upb_status_seterrmsg(&h->status_, "closure type does not match");    return false;  }  if (closure_type)    *context_closure_type = closure_type;  // If this is a STARTSEQ or STARTSTR handler, check that the returned pointer  // matches any pre-existing expectations about what type is expected.  if (type == UPB_HANDLER_STARTSEQ || type == UPB_HANDLER_STARTSTR) {    const void *return_type = upb_handlerattr_returnclosuretype(&set_attr);    const void *table_return_type =        upb_handlerattr_returnclosuretype(&h->table[sel].attr);    if (return_type && table_return_type && return_type != table_return_type) {      upb_status_seterrmsg(&h->status_, "closure return type does not match");      return false;    }    if (table_return_type && !return_type)      upb_handlerattr_setreturnclosuretype(&set_attr, table_return_type);  }  h->table[sel].func = (upb_func*)func;  h->table[sel].attr = set_attr;  return true;}// Returns the effective closure type for this handler (which will propagate// from outer frames if this frame has no START* handler).  Not implemented for// UPB_HANDLER_STRING at the moment since this is not needed.  Returns NULL is// the effective closure type is unspecified (either no handler was registered// to specify it or the handler that was registered did not specify the closure// type).const void *effective_closure_type(upb_handlers *h, const upb_fielddef *f,                                   upb_handlertype_t type) {  assert(type != UPB_HANDLER_STRING);  const void *ret = h->top_closure_type;  upb_selector_t sel;  if (upb_fielddef_isseq(f) &&      type != UPB_HANDLER_STARTSEQ &&      type != UPB_HANDLER_ENDSEQ &&      h->table[sel = handlers_getsel(h, f, UPB_HANDLER_STARTSEQ)].func) {    ret = upb_handlerattr_returnclosuretype(&h->table[sel].attr);  }  if (type == UPB_HANDLER_STRING &&      h->table[sel = handlers_getsel(h, f, UPB_HANDLER_STARTSTR)].func) {    ret = upb_handlerattr_returnclosuretype(&h->table[sel].attr);  }  // The effective type of the submessage; not used yet.  // if (type == SUBMESSAGE &&  //     h->table[sel = handlers_getsel(h, f, UPB_HANDLER_STARTSUBMSG)].func) {  //   ret = upb_handlerattr_returnclosuretype(&h->table[sel].attr);  // }  return ret;}// Checks whether the START* handler specified by f & type is missing even// though it is required to convert the established type of an outer frame// ("closure_type") into the established type of an inner frame (represented in// the return closure type of this handler's attr.bool checkstart(upb_handlers *h, const upb_fielddef *f, upb_handlertype_t type,                upb_status *status) {  upb_selector_t sel = handlers_getsel(h, f, type);  if (h->table[sel].func) return true;  const void *closure_type = effective_closure_type(h, f, type);  const upb_handlerattr *attr = &h->table[sel].attr;  const void *return_closure_type = upb_handlerattr_returnclosuretype(attr);  if (closure_type && return_closure_type &&      closure_type != return_closure_type) {    upb_status_seterrf(status,                       "expected start handler to return sub type for field %f",                       upb_fielddef_name(f));    return false;  }  return true;}/* Public interface ***********************************************************/bool upb_handlers_isfrozen(const upb_handlers *h) {  return upb_refcounted_isfrozen(UPB_UPCAST(h));}void upb_handlers_ref(const upb_handlers *h, const void *owner) {  upb_refcounted_ref(UPB_UPCAST(h), owner);}void upb_handlers_unref(const upb_handlers *h, const void *owner) {  upb_refcounted_unref(UPB_UPCAST(h), owner);}void upb_handlers_donateref(    const upb_handlers *h, const void *from, const void *to) {  upb_refcounted_donateref(UPB_UPCAST(h), from, to);}void upb_handlers_checkref(const upb_handlers *h, const void *owner) {  upb_refcounted_checkref(UPB_UPCAST(h), owner);}upb_handlers *upb_handlers_new(const upb_msgdef *md, const void *owner) {  assert(upb_msgdef_isfrozen(md));  int extra = sizeof(upb_handlers_tabent) * (md->selector_count - 1);  upb_handlers *h = calloc(sizeof(*h) + extra, 1);  if (!h) return NULL;  h->msg = md;  upb_msgdef_ref(h->msg, h);  upb_status_clear(&h->status_);  h->sub = calloc(md->submsg_field_count, sizeof(*h->sub));  if (!h->sub) goto oom;  if (!upb_refcounted_init(UPB_UPCAST(h), &vtbl, owner)) goto oom;  if (!upb_inttable_init(&h->cleanup_, UPB_CTYPE_FPTR)) goto oom;  // calloc() above initialized all handlers to NULL.  return h;oom:  freehandlers(UPB_UPCAST(h));  return NULL;}const upb_handlers *upb_handlers_newfrozen(const upb_msgdef *m,                                           const void *owner,                                           upb_handlers_callback *callback,                                           const void *closure) {  dfs_state state;  state.callback = callback;  state.closure = closure;  if (!upb_inttable_init(&state.tab, UPB_CTYPE_PTR)) return NULL;  upb_handlers *ret = newformsg(m, owner, &state);  upb_inttable_uninit(&state.tab);  if (!ret) return NULL;  upb_refcounted *r = UPB_UPCAST(ret);  bool ok = upb_refcounted_freeze(&r, 1, NULL, UPB_MAX_HANDLER_DEPTH);  UPB_ASSERT_VAR(ok, ok);  return ret;}const upb_status *upb_handlers_status(upb_handlers *h) {  assert(!upb_handlers_isfrozen(h));  return &h->status_;}void upb_handlers_clearerr(upb_handlers *h) {  assert(!upb_handlers_isfrozen(h));  upb_status_clear(&h->status_);}#define SETTER(name, handlerctype, handlertype) \  bool upb_handlers_set ## name(upb_handlers *h, const upb_fielddef *f, \                                handlerctype func, upb_handlerattr *attr) { \    int32_t sel = trygetsel(h, f, handlertype); \    return doset(h, sel, f, handlertype, (upb_func*)func, attr); \  }SETTER(int32,       upb_int32_handlerfunc*,       UPB_HANDLER_INT32);SETTER(int64,       upb_int64_handlerfunc*,       UPB_HANDLER_INT64);SETTER(uint32,      upb_uint32_handlerfunc*,      UPB_HANDLER_UINT32);SETTER(uint64,      upb_uint64_handlerfunc*,      UPB_HANDLER_UINT64);SETTER(float,       upb_float_handlerfunc*,       UPB_HANDLER_FLOAT);SETTER(double,      upb_double_handlerfunc*,      UPB_HANDLER_DOUBLE);SETTER(bool,        upb_bool_handlerfunc*,        UPB_HANDLER_BOOL);SETTER(startstr,    upb_startstr_handlerfunc*,    UPB_HANDLER_STARTSTR);SETTER(string,      upb_string_handlerfunc*,      UPB_HANDLER_STRING);SETTER(endstr,      upb_endfield_handlerfunc*,    UPB_HANDLER_ENDSTR);SETTER(startseq,    upb_startfield_handlerfunc*,  UPB_HANDLER_STARTSEQ);SETTER(startsubmsg, upb_startfield_handlerfunc*,  UPB_HANDLER_STARTSUBMSG);SETTER(endsubmsg,   upb_endfield_handlerfunc*,    UPB_HANDLER_ENDSUBMSG);SETTER(endseq,      upb_endfield_handlerfunc*,    UPB_HANDLER_ENDSEQ);#undef SETTERbool upb_handlers_setstartmsg(upb_handlers *h, upb_startmsg_handlerfunc *func,                              upb_handlerattr *attr) {  return doset(h, UPB_STARTMSG_SELECTOR, NULL, UPB_HANDLER_INT32,               (upb_func *)func, attr);}bool upb_handlers_setendmsg(upb_handlers *h, upb_endmsg_handlerfunc *func,                            upb_handlerattr *attr) {  assert(!upb_handlers_isfrozen(h));  return doset(h, UPB_ENDMSG_SELECTOR, NULL, UPB_HANDLER_INT32,               (upb_func *)func, attr);}bool upb_handlers_setsubhandlers(upb_handlers *h, const upb_fielddef *f,                                 const upb_handlers *sub) {  assert(sub);  assert(!upb_handlers_isfrozen(h));  assert(upb_fielddef_issubmsg(f));  if (SUBH_F(h, f)) return false;  // Can't reset.  if (UPB_UPCAST(upb_handlers_msgdef(sub)) != upb_fielddef_subdef(f)) {    return false;  }  SUBH_F(h, f) = sub;  upb_ref2(sub, h);  return true;}const upb_handlers *upb_handlers_getsubhandlers(const upb_handlers *h,                                                const upb_fielddef *f) {  assert(upb_fielddef_issubmsg(f));  return SUBH_F(h, f);}bool upb_handlers_getattr(const upb_handlers *h, upb_selector_t sel,                          upb_handlerattr *attr) {  if (!upb_handlers_gethandler(h, sel))    return false;  *attr = h->table[sel].attr;  return true;}const upb_handlers *upb_handlers_getsubhandlers_sel(const upb_handlers *h,                                                    upb_selector_t sel) {  // STARTSUBMSG selector in sel is the field's selector base.  return SUBH(h, sel - UPB_STATIC_SELECTOR_COUNT);}const upb_msgdef *upb_handlers_msgdef(const upb_handlers *h) { return h->msg; }bool upb_handlers_addcleanup(upb_handlers *h, void *p, upb_handlerfree *func) {  if (upb_inttable_lookupptr(&h->cleanup_, p, NULL)) {    return false;  }  bool ok = upb_inttable_insertptr(&h->cleanup_, p, upb_value_fptr(func));  UPB_ASSERT_VAR(ok, ok);  return true;}/* "Static" methods ***********************************************************/bool upb_handlers_freeze(upb_handlers *const*handlers, int n, upb_status *s) {  // TODO: verify we have a transitive closure.  for (int i = 0; i < n; i++) {    upb_handlers *h = handlers[i];    if (!upb_ok(&h->status_)) {      upb_status_seterrf(s, "handlers for message %s had error status: %s",                         upb_msgdef_fullname(upb_handlers_msgdef(h)),                         upb_status_errmsg(&h->status_));      return false;    }    // Check that there are no closure mismatches due to missing Start* handlers    // or subhandlers with different type-level types.    upb_msg_iter j;    for(upb_msg_begin(&j, h->msg); !upb_msg_done(&j); upb_msg_next(&j)) {      const upb_fielddef *f = upb_msg_iter_field(&j);      if (upb_fielddef_isseq(f)) {        if (!checkstart(h, f, UPB_HANDLER_STARTSEQ, s))          return false;      }      if (upb_fielddef_isstring(f)) {        if (!checkstart(h, f, UPB_HANDLER_STARTSTR, s))          return false;      }      if (upb_fielddef_issubmsg(f)) {        bool hashandler = false;        if (upb_handlers_gethandler(                h, handlers_getsel(h, f, UPB_HANDLER_STARTSUBMSG)) ||            upb_handlers_gethandler(                h, handlers_getsel(h, f, UPB_HANDLER_ENDSUBMSG))) {          hashandler = true;        }        if (upb_fielddef_isseq(f) &&            (upb_handlers_gethandler(                 h, handlers_getsel(h, f, UPB_HANDLER_STARTSEQ)) ||             upb_handlers_gethandler(                 h, handlers_getsel(h, f, UPB_HANDLER_ENDSEQ)))) {          hashandler = true;        }        if (hashandler && !upb_handlers_getsubhandlers(h, f)) {          // For now we add an empty subhandlers in this case.  It makes the          // decoder code generator simpler, because it only has to handle two          // cases (submessage has handlers or not) as opposed to three          // (submessage has handlers in enclosing message but no subhandlers).          //          // This makes parsing less efficient in the case that we want to          // notice a submessage but skip its contents (like if we're testing          // for submessage presence or counting the number of repeated          // submessages).  In this case we will end up parsing the submessage          // field by field and throwing away the results for each, instead of          // skipping the whole delimited thing at once.  If this is an issue we          // can revisit it, but do remember that this only arises when you have          // handlers (startseq/startsubmsg/endsubmsg/endseq) set for the          // submessage but no subhandlers.  The uses cases for this are          // limited.          upb_handlers *sub = upb_handlers_new(upb_fielddef_msgsubdef(f), &sub);          upb_handlers_setsubhandlers(h, f, sub);          upb_handlers_unref(sub, &sub);        }        // TODO(haberman): check type of submessage.        // This is slightly tricky; also consider whether we should check that        // they match at setsubhandlers time.      }    }  }  if (!upb_refcounted_freeze((upb_refcounted*const*)handlers, n, s,                             UPB_MAX_HANDLER_DEPTH)) {    return false;  }  return true;}upb_handlertype_t upb_handlers_getprimitivehandlertype(const upb_fielddef *f) {  switch (upb_fielddef_type(f)) {    case UPB_TYPE_INT32:    case UPB_TYPE_ENUM: return UPB_HANDLER_INT32;    case UPB_TYPE_INT64: return UPB_HANDLER_INT64;    case UPB_TYPE_UINT32: return UPB_HANDLER_UINT32;    case UPB_TYPE_UINT64: return UPB_HANDLER_UINT64;    case UPB_TYPE_FLOAT: return UPB_HANDLER_FLOAT;    case UPB_TYPE_DOUBLE: return UPB_HANDLER_DOUBLE;    case UPB_TYPE_BOOL: return UPB_HANDLER_BOOL;    default: assert(false); return -1;  // Invalid input.  }}bool upb_handlers_getselector(const upb_fielddef *f, upb_handlertype_t type,                              upb_selector_t *s) {  switch (type) {    case UPB_HANDLER_INT32:    case UPB_HANDLER_INT64:    case UPB_HANDLER_UINT32:    case UPB_HANDLER_UINT64:    case UPB_HANDLER_FLOAT:    case UPB_HANDLER_DOUBLE:    case UPB_HANDLER_BOOL:      if (!upb_fielddef_isprimitive(f) ||          upb_handlers_getprimitivehandlertype(f) != type)        return false;      *s = f->selector_base;      break;    case UPB_HANDLER_STRING:      if (upb_fielddef_isstring(f)) {        *s = f->selector_base;      } else if (upb_fielddef_lazy(f)) {        *s = f->selector_base + 3;      } else {        return false;      }      break;    case UPB_HANDLER_STARTSTR:      if (upb_fielddef_isstring(f) || upb_fielddef_lazy(f)) {        *s = f->selector_base + 1;      } else {        return false;      }      break;    case UPB_HANDLER_ENDSTR:      if (upb_fielddef_isstring(f) || upb_fielddef_lazy(f)) {        *s = f->selector_base + 2;      } else {        return false;      }      break;    case UPB_HANDLER_STARTSEQ:      if (!upb_fielddef_isseq(f)) return false;      *s = f->selector_base - 2;      break;    case UPB_HANDLER_ENDSEQ:      if (!upb_fielddef_isseq(f)) return false;      *s = f->selector_base - 1;      break;    case UPB_HANDLER_STARTSUBMSG:      if (!upb_fielddef_issubmsg(f)) return false;      // Selectors for STARTSUBMSG are at the beginning of the table so that the      // selector can also be used as an index into the "sub" array of      // subhandlers.  The indexes for the two into these two tables are the      // same, except that in the handler table the static selectors come first.      *s = f->index_ + UPB_STATIC_SELECTOR_COUNT;      break;    case UPB_HANDLER_ENDSUBMSG:      if (!upb_fielddef_issubmsg(f)) return false;      *s = f->selector_base;      break;  }  assert(*s < upb_fielddef_containingtype(f)->selector_count);  return true;}uint32_t upb_handlers_selectorbaseoffset(const upb_fielddef *f) {  return upb_fielddef_isseq(f) ? 2 : 0;}uint32_t upb_handlers_selectorcount(const upb_fielddef *f) {  uint32_t ret = 1;  if (upb_fielddef_isseq(f)) ret += 2;    // STARTSEQ/ENDSEQ  if (upb_fielddef_isstring(f)) ret += 2; // [STRING]/STARTSTR/ENDSTR  if (upb_fielddef_issubmsg(f)) {    // ENDSUBMSG (STARTSUBMSG is at table beginning)    ret += 0;    if (upb_fielddef_lazy(f)) {      // STARTSTR/ENDSTR/STRING (for lazy)      ret += 3;    }  }  return ret;}/* upb_handlerattr ************************************************************/void upb_handlerattr_init(upb_handlerattr *attr) {  upb_handlerattr from = UPB_HANDLERATTR_INITIALIZER;  memcpy(attr, &from, sizeof(*attr));}void upb_handlerattr_uninit(upb_handlerattr *attr) {  UPB_UNUSED(attr);}bool upb_handlerattr_sethandlerdata(upb_handlerattr *attr, const void *hd) {  attr->handler_data_ = hd;  return true;}bool upb_handlerattr_setclosuretype(upb_handlerattr *attr, const void *type) {  attr->closure_type_ = type;  return true;}const void *upb_handlerattr_closuretype(const upb_handlerattr *attr) {  return attr->closure_type_;}bool upb_handlerattr_setreturnclosuretype(upb_handlerattr *attr,                                          const void *type) {  attr->return_closure_type_ = type;  return true;}const void *upb_handlerattr_returnclosuretype(const upb_handlerattr *attr) {  return attr->return_closure_type_;}bool upb_handlerattr_setalwaysok(upb_handlerattr *attr, bool alwaysok) {  attr->alwaysok_ = alwaysok;  return true;}bool upb_handlerattr_alwaysok(const upb_handlerattr *attr) {  return attr->alwaysok_;}/* upb_bufhandle **************************************************************/size_t upb_bufhandle_objofs(const upb_bufhandle *h) {  return h->objofs_;}/* upb_byteshandler ***********************************************************/void upb_byteshandler_init(upb_byteshandler* h) {  memset(h, 0, sizeof(*h));}// For when we support handlerfree callbacks.void upb_byteshandler_uninit(upb_byteshandler* h) {  UPB_UNUSED(h);}bool upb_byteshandler_setstartstr(upb_byteshandler *h,                                  upb_startstr_handlerfunc *func, void *d) {  h->table[UPB_STARTSTR_SELECTOR].func = (upb_func*)func;  h->table[UPB_STARTSTR_SELECTOR].attr.handler_data_ = d;  return true;}bool upb_byteshandler_setstring(upb_byteshandler *h,                                upb_string_handlerfunc *func, void *d) {  h->table[UPB_STRING_SELECTOR].func = (upb_func*)func;  h->table[UPB_STRING_SELECTOR].attr.handler_data_ = d;  return true;}bool upb_byteshandler_setendstr(upb_byteshandler *h,                                upb_endfield_handlerfunc *func, void *d) {  h->table[UPB_ENDSTR_SELECTOR].func = (upb_func*)func;  h->table[UPB_ENDSTR_SELECTOR].attr.handler_data_ = d;  return true;}/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2012 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> * * Our key invariants are: * 1. reference cycles never span groups * 2. for ref2(to, from), we increment to's count iff group(from) != group(to) * * The previous two are how we avoid leaking cycles.  Other important * invariants are: * 3. for mutable objects "from" and "to", if there exists a ref2(to, from) *    this implies group(from) == group(to).  (In practice, what we implement *    is even stronger; "from" and "to" will share a group if there has *ever* *    been a ref2(to, from), but all that is necessary for correctness is the *    weaker one). * 4. mutable and immutable objects are never in the same group. */#include <setjmp.h>#include <stdlib.h>static void freeobj(upb_refcounted *o);const char untracked_val;const void *UPB_UNTRACKED_REF = &untracked_val;/* arch-specific atomic primitives  *******************************************/#ifdef UPB_THREAD_UNSAFE  //////////////////////////////////////////////////////static void atomic_inc(uint32_t *a) { (*a)++; }static bool atomic_dec(uint32_t *a) { return --(*a) == 0; }#elif defined(__GNUC__) || defined(__clang__) //////////////////////////////////static void atomic_inc(uint32_t *a) { __sync_fetch_and_add(a, 1); }static bool atomic_dec(uint32_t *a) { return __sync_sub_and_fetch(a, 1) == 0; }#elif defined(WIN32) ///////////////////////////////////////////////////////////#include <Windows.h>static void atomic_inc(upb_atomic_t *a) { InterlockedIncrement(&a->val); }static bool atomic_dec(upb_atomic_t *a) {  return InterlockedDecrement(&a->val) == 0;}#else#error Atomic primitives not defined for your platform/CPU.  \       Implement them or compile with UPB_THREAD_UNSAFE.#endif// All static objects point to this refcount.// It is special-cased in ref/unref below.uint32_t static_refcount = -1;// We can avoid atomic ops for statically-declared objects.// This is a minor optimization but nice since we can avoid degrading under// contention in this case.static void refgroup(uint32_t *group) {  if (group != &static_refcount)    atomic_inc(group);}static bool unrefgroup(uint32_t *group) {  if (group == &static_refcount) {    return false;  } else {    return atomic_dec(group);  }}/* Reference tracking (debug only) ********************************************/#ifdef UPB_DEBUG_REFS#ifdef UPB_THREAD_UNSAFEstatic void upb_lock() {}static void upb_unlock() {}#else// User must define functions that lock/unlock a global mutex and link this// file against them.void upb_lock();void upb_unlock();#endif// UPB_DEBUG_REFS mode counts on being able to malloc() memory in some// code-paths that can normally never fail, like upb_refcounted_ref().  Since// we have no way to propagage out-of-memory errors back to the user, and since// these errors can only occur in UPB_DEBUG_REFS mode, we immediately fail.#define CHECK_OOM(predicate) if (!(predicate)) { assert(predicate); exit(1); }typedef struct {  int count;  // How many refs there are (duplicates only allowed for ref2).  bool is_ref2;} trackedref;static trackedref *trackedref_new(bool is_ref2) {  trackedref *ret = malloc(sizeof(*ret));  CHECK_OOM(ret);  ret->count = 1;  ret->is_ref2 = is_ref2;  return ret;}static void track(const upb_refcounted *r, const void *owner, bool ref2) {  assert(owner);  if (owner == UPB_UNTRACKED_REF) return;  upb_lock();  upb_value v;  if (upb_inttable_lookupptr(r->refs, owner, &v)) {    trackedref *ref = upb_value_getptr(v);    // Since we allow multiple ref2's for the same to/from pair without    // allocating separate memory for each one, we lose the fine-grained    // tracking behavior we get with regular refs.  Since ref2s only happen    // inside upb, we'll accept this limitation until/unless there is a really    // difficult upb-internal bug that can't be figured out without it.    assert(ref2);    assert(ref->is_ref2);    ref->count++;  } else {    trackedref *ref = trackedref_new(ref2);    bool ok = upb_inttable_insertptr(r->refs, owner, upb_value_ptr(ref));    CHECK_OOM(ok);    if (ref2) {      // We know this cast is safe when it is a ref2, because it's coming from      // another refcounted object.      const upb_refcounted *from = owner;      assert(!upb_inttable_lookupptr(from->ref2s, r, NULL));      ok = upb_inttable_insertptr(from->ref2s, r, upb_value_ptr(NULL));      CHECK_OOM(ok);    }  }  upb_unlock();}static void untrack(const upb_refcounted *r, const void *owner, bool ref2) {  assert(owner);  if (owner == UPB_UNTRACKED_REF) return;  upb_lock();  upb_value v;  bool found = upb_inttable_lookupptr(r->refs, owner, &v);  // This assert will fail if an owner attempts to release a ref it didn't have.  UPB_ASSERT_VAR(found, found);  trackedref *ref = upb_value_getptr(v);  assert(ref->is_ref2 == ref2);  if (--ref->count == 0) {    free(ref);    upb_inttable_removeptr(r->refs, owner, NULL);    if (ref2) {      // We know this cast is safe when it is a ref2, because it's coming from      // another refcounted object.      const upb_refcounted *from = owner;      bool removed = upb_inttable_removeptr(from->ref2s, r, NULL);      assert(removed);    }  }  upb_unlock();}static void checkref(const upb_refcounted *r, const void *owner, bool ref2) {  upb_lock();  upb_value v;  bool found = upb_inttable_lookupptr(r->refs, owner, &v);  UPB_ASSERT_VAR(found, found);  trackedref *ref = upb_value_getptr(v);  assert(ref->is_ref2 == ref2);  upb_unlock();}// Populates the given UPB_CTYPE_INT32 inttable with counts of ref2's that// originate from the given owner.static void getref2s(const upb_refcounted *owner, upb_inttable *tab) {  upb_lock();  upb_inttable_iter i;  upb_inttable_begin(&i, owner->ref2s);  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {    upb_refcounted *to = (upb_refcounted*)upb_inttable_iter_key(&i);    // To get the count we need to look in the target's table.    upb_value v;    bool found = upb_inttable_lookupptr(to->refs, owner, &v);    assert(found);    trackedref *ref = upb_value_getptr(v);    upb_value count = upb_value_int32(ref->count);    bool ok = upb_inttable_insertptr(tab, to, count);    CHECK_OOM(ok);  }  upb_unlock();}typedef struct {  upb_inttable ref2;  const upb_refcounted *obj;} check_state;static void visit_check(const upb_refcounted *obj, const upb_refcounted *subobj,                        void *closure) {  check_state *s = closure;  assert(obj == s->obj);  assert(subobj);  upb_inttable *ref2 = &s->ref2;  upb_value v;  bool removed = upb_inttable_removeptr(ref2, subobj, &v);  // The following assertion will fail if the visit() function visits a subobj  // that it did not have a ref2 on, or visits the same subobj too many times.  assert(removed);  int32_t newcount = upb_value_getint32(v) - 1;  if (newcount > 0) {    upb_inttable_insert(ref2, (uintptr_t)subobj, upb_value_int32(newcount));  }}static void visit(const upb_refcounted *r, upb_refcounted_visit *v,                  void *closure) {  // In DEBUG_REFS mode we know what existing ref2 refs there are, so we know  // exactly the set of nodes that visit() should visit.  So we verify visit()'s  // correctness here.  check_state state;  state.obj = r;  bool ok = upb_inttable_init(&state.ref2, UPB_CTYPE_INT32);  CHECK_OOM(ok);  getref2s(r, &state.ref2);  // This should visit any children in the ref2 table.  if (r->vtbl->visit) r->vtbl->visit(r, visit_check, &state);  // This assertion will fail if the visit() function missed any children.  assert(upb_inttable_count(&state.ref2) == 0);  upb_inttable_uninit(&state.ref2);  if (r->vtbl->visit) r->vtbl->visit(r, v, closure);}static bool trackinit(upb_refcounted *r) {  r->refs = malloc(sizeof(*r->refs));  r->ref2s = malloc(sizeof(*r->ref2s));  if (!r->refs || !r->ref2s) goto err1;  if (!upb_inttable_init(r->refs, UPB_CTYPE_PTR)) goto err1;  if (!upb_inttable_init(r->ref2s, UPB_CTYPE_PTR)) goto err2;  return true;err2:  upb_inttable_uninit(r->refs);err1:  free(r->refs);  free(r->ref2s);  return false;}static void trackfree(const upb_refcounted *r) {  upb_inttable_uninit(r->refs);  upb_inttable_uninit(r->ref2s);  free(r->refs);  free(r->ref2s);}#elsestatic void track(const upb_refcounted *r, const void *owner, bool ref2) {  UPB_UNUSED(r);  UPB_UNUSED(owner);  UPB_UNUSED(ref2);}static void untrack(const upb_refcounted *r, const void *owner, bool ref2) {  UPB_UNUSED(r);  UPB_UNUSED(owner);  UPB_UNUSED(ref2);}static void checkref(const upb_refcounted *r, const void *owner, bool ref2) {  UPB_UNUSED(r);  UPB_UNUSED(owner);  UPB_UNUSED(ref2);}static bool trackinit(upb_refcounted *r) {  UPB_UNUSED(r);  return true;}static void trackfree(const upb_refcounted *r) {  UPB_UNUSED(r);}static void visit(const upb_refcounted *r, upb_refcounted_visit *v,                  void *closure) {  if (r->vtbl->visit) r->vtbl->visit(r, v, closure);}#endif  // UPB_DEBUG_REFS/* freeze() *******************************************************************/// The freeze() operation is by far the most complicated part of this scheme.// We compute strongly-connected components and then mutate the graph such that// we preserve the invariants documented at the top of this file.  And we must// handle out-of-memory errors gracefully (without leaving the graph// inconsistent), which adds to the fun.// The state used by the freeze operation (shared across many functions).typedef struct {  int depth;  int maxdepth;  uint64_t index;  // Maps upb_refcounted* -> attributes (color, etc).  attr layout varies by  // color.  upb_inttable objattr;  upb_inttable stack;   // stack of upb_refcounted* for Tarjan's algorithm.  upb_inttable groups;  // array of uint32_t*, malloc'd refcounts for new groups  upb_status *status;  jmp_buf err;} tarjan;static void release_ref2(const upb_refcounted *obj,                         const upb_refcounted *subobj,                         void *closure);// Node attributes /////////////////////////////////////////////////////////////// After our analysis phase all nodes will be either GRAY or WHITE.typedef enum {  BLACK = 0,  // Object has not been seen.  GRAY,   // Object has been found via a refgroup but may not be reachable.  GREEN,  // Object is reachable and is currently on the Tarjan stack.  WHITE,  // Object is reachable and has been assigned a group (SCC).} color_t;UPB_NORETURN static void err(tarjan *t) { longjmp(t->err, 1); }UPB_NORETURN static void oom(tarjan *t) {  upb_status_seterrmsg(t->status, "out of memory");  err(t);}static uint64_t trygetattr(const tarjan *t, const upb_refcounted *r) {  upb_value v;  return upb_inttable_lookupptr(&t->objattr, r, &v) ?      upb_value_getuint64(v) : 0;}static uint64_t getattr(const tarjan *t, const upb_refcounted *r) {  upb_value v;  bool found = upb_inttable_lookupptr(&t->objattr, r, &v);  UPB_ASSERT_VAR(found, found);  return upb_value_getuint64(v);}static void setattr(tarjan *t, const upb_refcounted *r, uint64_t attr) {  upb_inttable_removeptr(&t->objattr, r, NULL);  upb_inttable_insertptr(&t->objattr, r, upb_value_uint64(attr));}static color_t color(tarjan *t, const upb_refcounted *r) {  return trygetattr(t, r) & 0x3;  // Color is always stored in the low 2 bits.}static void set_gray(tarjan *t, const upb_refcounted *r) {  assert(color(t, r) == BLACK);  setattr(t, r, GRAY);}// Pushes an obj onto the Tarjan stack and sets it to GREEN.static void push(tarjan *t, const upb_refcounted *r) {  assert(color(t, r) == BLACK || color(t, r) == GRAY);  // This defines the attr layout for the GREEN state.  "index" and "lowlink"  // get 31 bits, which is plenty (limit of 2B objects frozen at a time).  setattr(t, r, GREEN | (t->index << 2) | (t->index << 33));  if (++t->index == 0x80000000) {    upb_status_seterrmsg(t->status, "too many objects to freeze");    err(t);  }  upb_inttable_push(&t->stack, upb_value_ptr((void*)r));}// Pops an obj from the Tarjan stack and sets it to WHITE, with a ptr to its// SCC group.static upb_refcounted *pop(tarjan *t) {  upb_refcounted *r = upb_value_getptr(upb_inttable_pop(&t->stack));  assert(color(t, r) == GREEN);  // This defines the attr layout for nodes in the WHITE state.  // Top of group stack is [group, NULL]; we point at group.  setattr(t, r, WHITE | (upb_inttable_count(&t->groups) - 2) << 8);  return r;}static void tarjan_newgroup(tarjan *t) {  uint32_t *group = malloc(sizeof(*group));  if (!group) oom(t);  // Push group and empty group leader (we'll fill in leader later).  if (!upb_inttable_push(&t->groups, upb_value_ptr(group)) ||      !upb_inttable_push(&t->groups, upb_value_ptr(NULL))) {    free(group);    oom(t);  }  *group = 0;}static uint32_t idx(tarjan *t, const upb_refcounted *r) {  assert(color(t, r) == GREEN);  return (getattr(t, r) >> 2) & 0x7FFFFFFF;}static uint32_t lowlink(tarjan *t, const upb_refcounted *r) {  if (color(t, r) == GREEN) {    return getattr(t, r) >> 33;  } else {    return UINT32_MAX;  }}static void set_lowlink(tarjan *t, const upb_refcounted *r, uint32_t lowlink) {  assert(color(t, r) == GREEN);  setattr(t, r, ((uint64_t)lowlink << 33) | (getattr(t, r) & 0x1FFFFFFFF));}static uint32_t *group(tarjan *t, upb_refcounted *r) {  assert(color(t, r) == WHITE);  uint64_t groupnum = getattr(t, r) >> 8;  upb_value v;  bool found = upb_inttable_lookup(&t->groups, groupnum, &v);  UPB_ASSERT_VAR(found, found);  return upb_value_getptr(v);}// If the group leader for this object's group has not previously been set,// the given object is assigned to be its leader.static upb_refcounted *groupleader(tarjan *t, upb_refcounted *r) {  assert(color(t, r) == WHITE);  uint64_t leader_slot = (getattr(t, r) >> 8) + 1;  upb_value v;  bool found = upb_inttable_lookup(&t->groups, leader_slot, &v);  UPB_ASSERT_VAR(found, found);  if (upb_value_getptr(v)) {    return upb_value_getptr(v);  } else {    upb_inttable_remove(&t->groups, leader_slot, NULL);    upb_inttable_insert(&t->groups, leader_slot, upb_value_ptr(r));    return r;  }}// Tarjan's algorithm //////////////////////////////////////////////////////////// See://   http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithmstatic void do_tarjan(const upb_refcounted *obj, tarjan *t);static void tarjan_visit(const upb_refcounted *obj,                         const upb_refcounted *subobj,                         void *closure) {  tarjan *t = closure;  if (++t->depth > t->maxdepth) {    upb_status_seterrf(t->status, "graph too deep to freeze (%d)", t->maxdepth);    err(t);  } else if (subobj->is_frozen || color(t, subobj) == WHITE) {    // Do nothing: we don't want to visit or color already-frozen nodes,    // and WHITE nodes have already been assigned a SCC.  } else if (color(t, subobj) < GREEN) {    // Subdef has not yet been visited; recurse on it.    do_tarjan(subobj, t);    set_lowlink(t, obj, UPB_MIN(lowlink(t, obj), lowlink(t, subobj)));  } else if (color(t, subobj) == GREEN) {    // Subdef is in the stack and hence in the current SCC.    set_lowlink(t, obj, UPB_MIN(lowlink(t, obj), idx(t, subobj)));  }  --t->depth;}static void do_tarjan(const upb_refcounted *obj, tarjan *t) {  if (color(t, obj) == BLACK) {    // We haven't seen this object's group; mark the whole group GRAY.    const upb_refcounted *o = obj;    do { set_gray(t, o); } while ((o = o->next) != obj);  }  push(t, obj);  visit(obj, tarjan_visit, t);  if (lowlink(t, obj) == idx(t, obj)) {    tarjan_newgroup(t);    while (pop(t) != obj)      ;  }}// freeze() ////////////////////////////////////////////////////////////////////static void crossref(const upb_refcounted *r, const upb_refcounted *subobj,                     void *_t) {  tarjan *t = _t;  assert(color(t, r) > BLACK);  if (color(t, subobj) > BLACK && r->group != subobj->group) {    // Previously this ref was not reflected in subobj->group because they    // were in the same group; now that they are split a ref must be taken.    refgroup(subobj->group);  }}static bool freeze(upb_refcounted *const*roots, int n, upb_status *s,                   int maxdepth) {  volatile bool ret = false;  // We run in two passes so that we can allocate all memory before performing  // any mutation of the input -- this allows us to leave the input unchanged  // in the case of memory allocation failure.  tarjan t;  t.index = 0;  t.depth = 0;  t.maxdepth = maxdepth;  t.status = s;  if (!upb_inttable_init(&t.objattr, UPB_CTYPE_UINT64)) goto err1;  if (!upb_inttable_init(&t.stack, UPB_CTYPE_PTR)) goto err2;  if (!upb_inttable_init(&t.groups, UPB_CTYPE_PTR)) goto err3;  if (setjmp(t.err) != 0) goto err4;  for (int i = 0; i < n; i++) {    if (color(&t, roots[i]) < GREEN) {      do_tarjan(roots[i], &t);    }  }  // If we've made it this far, no further errors are possible so it's safe to  // mutate the objects without risk of leaving them in an inconsistent state.  ret = true;  // The transformation that follows requires care.  The preconditions are:  // - all objects in attr map are WHITE or GRAY, and are in mutable groups  //   (groups of all mutable objs)  // - no ref2(to, from) refs have incremented count(to) if both "to" and  //   "from" are in our attr map (this follows from invariants (2) and (3))  // Pass 1: we remove WHITE objects from their mutable groups, and add them to  // new groups  according to the SCC's we computed.  These new groups will  // consist of only frozen objects.  None will be immediately collectible,  // because WHITE objects are by definition reachable from one of "roots",  // which the caller must own refs on.  upb_inttable_iter i;  upb_inttable_begin(&i, &t.objattr);  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {    upb_refcounted *obj = (upb_refcounted*)upb_inttable_iter_key(&i);    // Since removal from a singly-linked list requires access to the object's    // predecessor, we consider obj->next instead of obj for moving.  With the    // while() loop we guarantee that we will visit every node's predecessor.    // Proof:    //  1. every node's predecessor is in our attr map.    //  2. though the loop body may change a node's predecessor, it will only    //     change it to be the node we are currently operating on, so with a    //     while() loop we guarantee ourselves the chance to remove each node.    while (color(&t, obj->next) == WHITE &&           group(&t, obj->next) != obj->next->group) {      // Remove from old group.      upb_refcounted *move = obj->next;      if (obj == move) {        // Removing the last object from a group.        assert(*obj->group == obj->individual_count);        free(obj->group);      } else {        obj->next = move->next;        // This may decrease to zero; we'll collect GRAY objects (if any) that        // remain in the group in the third pass.        assert(*move->group >= move->individual_count);        *move->group -= move->individual_count;      }      // Add to new group.      upb_refcounted *leader = groupleader(&t, move);      if (move == leader) {        // First object added to new group is its leader.        move->group = group(&t, move);        move->next = move;        *move->group = move->individual_count;      } else {        // Group already has at least one object in it.        assert(leader->group == group(&t, move));        move->group = group(&t, move);        move->next = leader->next;        leader->next = move;        *move->group += move->individual_count;      }      move->is_frozen = true;    }  }  // Pass 2: GRAY and WHITE objects "obj" with ref2(to, obj) references must  // increment count(to) if group(obj) != group(to) (which could now be the  // case if "to" was just frozen).  upb_inttable_begin(&i, &t.objattr);  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {    upb_refcounted *obj = (upb_refcounted*)upb_inttable_iter_key(&i);    visit(obj, crossref, &t);  }  // Pass 3: GRAY objects are collected if their group's refcount dropped to  // zero when we removed its white nodes.  This can happen if they had only  // been kept alive by virtue of sharing a group with an object that was just  // frozen.  //  // It is important that we do this last, since the GRAY object's free()  // function could call unref2() on just-frozen objects, which will decrement  // refs that were added in pass 2.  upb_inttable_begin(&i, &t.objattr);  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {    upb_refcounted *obj = (upb_refcounted*)upb_inttable_iter_key(&i);    if (obj->group == NULL || *obj->group == 0) {      if (obj->group) {        // We eagerly free() the group's count (since we can't easily determine        // the group's remaining size it's the easiest way to ensure it gets        // done).        free(obj->group);        // Visit to release ref2's (done in a separate pass since release_ref2        // depends on o->group being unmodified so it can test merged()).        upb_refcounted *o = obj;        do { visit(o, release_ref2, NULL); } while ((o = o->next) != obj);        // Mark "group" fields as NULL so we know to free the objects later in        // this loop, but also don't try to delete the group twice.        o = obj;        do { o->group = NULL; } while ((o = o->next) != obj);      }      freeobj(obj);    }  }err4:  if (!ret) {    upb_inttable_begin(&i, &t.groups);    for(; !upb_inttable_done(&i); upb_inttable_next(&i))      free(upb_value_getptr(upb_inttable_iter_value(&i)));  }  upb_inttable_uninit(&t.groups);err3:  upb_inttable_uninit(&t.stack);err2:  upb_inttable_uninit(&t.objattr);err1:  return ret;}/* Misc internal functions  ***************************************************/static bool merged(const upb_refcounted *r, const upb_refcounted *r2) {  return r->group == r2->group;}static void merge(upb_refcounted *r, upb_refcounted *from) {  if (merged(r, from)) return;  *r->group += *from->group;  free(from->group);  upb_refcounted *base = from;  // Set all refcount pointers in the "from" chain to the merged refcount.  //  // TODO(haberman): this linear algorithm can result in an overall O(n^2) bound  // if the user continuously extends a group by one object.  Prevent this by  // using one of the techniques in this paper:  //     ftp://www.ncedc.org/outgoing/geomorph/dino/orals/p245-tarjan.pdf  do { from->group = r->group; } while ((from = from->next) != base);  // Merge the two circularly linked lists by swapping their next pointers.  upb_refcounted *tmp = r->next;  r->next = base->next;  base->next = tmp;}static void unref(const upb_refcounted *r);static void release_ref2(const upb_refcounted *obj,                         const upb_refcounted *subobj,                         void *closure) {  UPB_UNUSED(closure);  untrack(subobj, obj, true);  if (!merged(obj, subobj)) {    assert(subobj->is_frozen);    unref(subobj);  }}static void unref(const upb_refcounted *r) {  if (unrefgroup(r->group)) {    free(r->group);    // In two passes, since release_ref2 needs a guarantee that any subobjs    // are alive.    const upb_refcounted *o = r;    do { visit(o, release_ref2, NULL); } while((o = o->next) != r);    o = r;    do {      const upb_refcounted *next = o->next;      assert(o->is_frozen || o->individual_count == 0);      freeobj((upb_refcounted*)o);      o = next;    } while(o != r);  }}static void freeobj(upb_refcounted *o) {  trackfree(o);  o->vtbl->free((upb_refcounted*)o);}/* Public interface ***********************************************************/bool upb_refcounted_init(upb_refcounted *r,                         const struct upb_refcounted_vtbl *vtbl,                         const void *owner) {  r->next = r;  r->vtbl = vtbl;  r->individual_count = 0;  r->is_frozen = false;  r->group = malloc(sizeof(*r->group));  if (!r->group) return false;  *r->group = 0;  if (!trackinit(r)) {    free(r->group);    return false;  }  upb_refcounted_ref(r, owner);  return true;}bool upb_refcounted_isfrozen(const upb_refcounted *r) {  return r->is_frozen;}void upb_refcounted_ref(const upb_refcounted *r, const void *owner) {  track(r, owner, false);  if (!r->is_frozen)    ((upb_refcounted*)r)->individual_count++;  refgroup(r->group);}void upb_refcounted_unref(const upb_refcounted *r, const void *owner) {  untrack(r, owner, false);  if (!r->is_frozen)    ((upb_refcounted*)r)->individual_count--;  unref(r);}void upb_refcounted_ref2(const upb_refcounted *r, upb_refcounted *from) {  assert(!from->is_frozen);  // Non-const pointer implies this.  track(r, from, true);  if (r->is_frozen) {    refgroup(r->group);  } else {    merge((upb_refcounted*)r, from);  }}void upb_refcounted_unref2(const upb_refcounted *r, upb_refcounted *from) {  assert(!from->is_frozen);  // Non-const pointer implies this.  untrack(r, from, true);  if (r->is_frozen) {    unref(r);  } else {    assert(merged(r, from));  }}void upb_refcounted_donateref(    const upb_refcounted *r, const void *from, const void *to) {  assert(from != to);  if (to != NULL)    upb_refcounted_ref(r, to);  if (from != NULL)    upb_refcounted_unref(r, from);}void upb_refcounted_checkref(const upb_refcounted *r, const void *owner) {  checkref(r, owner, false);}bool upb_refcounted_freeze(upb_refcounted *const*roots, int n, upb_status *s,                           int maxdepth) {  for (int i = 0; i < n; i++) {    assert(!roots[i]->is_frozen);  }  return freeze(roots, n, s, maxdepth);}/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2013 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> */#include <stdlib.h>// Fallback implementation if the shim is not specialized by the JIT.#define SHIM_WRITER(type, ctype)                                              \  bool upb_shim_set ## type (void *c, const void *hd, ctype val) {            \    uint8_t *m = c;                                                           \    const upb_shim_data *d = hd;                                              \    if (d->hasbit > 0)                                                        \      *(uint8_t*)&m[d->hasbit / 8] |= 1 << (d->hasbit % 8);                   \    *(ctype*)&m[d->offset] = val;                                             \    return true;                                                              \  }                                                                           \SHIM_WRITER(double, double)SHIM_WRITER(float,  float)SHIM_WRITER(int32,  int32_t)SHIM_WRITER(int64,  int64_t)SHIM_WRITER(uint32, uint32_t)SHIM_WRITER(uint64, uint64_t)SHIM_WRITER(bool,   bool)#undef SHIM_WRITERbool upb_shim_set(upb_handlers *h, const upb_fielddef *f, size_t offset,                  int32_t hasbit) {  upb_shim_data *d = malloc(sizeof(*d));  if (!d) return false;  d->offset = offset;  d->hasbit = hasbit;  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;  upb_handlerattr_sethandlerdata(&attr, d);  upb_handlerattr_setalwaysok(&attr, true);  upb_handlers_addcleanup(h, d, free);#define TYPE(u, l) \  case UPB_TYPE_##u: \    ok = upb_handlers_set##l(h, f, upb_shim_set##l, &attr); break;  bool ok = false;  switch (upb_fielddef_type(f)) {    TYPE(INT64,  int64);    TYPE(INT32,  int32);    TYPE(ENUM,   int32);    TYPE(UINT64, uint64);    TYPE(UINT32, uint32);    TYPE(DOUBLE, double);    TYPE(FLOAT,  float);    TYPE(BOOL,   bool);    default: assert(false); break;  }#undef TYPE  upb_handlerattr_uninit(&attr);  return ok;}const upb_shim_data *upb_shim_getdata(const upb_handlers *h, upb_selector_t s,                                      upb_fieldtype_t *type) {  upb_func *f = upb_handlers_gethandler(h, s);  if ((upb_int64_handlerfunc*)f == upb_shim_setint64) {    *type = UPB_TYPE_INT64;  } else if ((upb_int32_handlerfunc*)f == upb_shim_setint32) {    *type = UPB_TYPE_INT32;  } else if ((upb_uint64_handlerfunc*)f == upb_shim_setuint64) {    *type = UPB_TYPE_UINT64;  } else if ((upb_uint32_handlerfunc*)f == upb_shim_setuint32) {    *type = UPB_TYPE_UINT32;  } else if ((upb_double_handlerfunc*)f == upb_shim_setdouble) {    *type = UPB_TYPE_DOUBLE;  } else if ((upb_float_handlerfunc*)f == upb_shim_setfloat) {    *type = UPB_TYPE_FLOAT;  } else if ((upb_bool_handlerfunc*)f == upb_shim_setbool) {    *type = UPB_TYPE_BOOL;  } else {    return NULL;  }  return (const upb_shim_data*)upb_handlers_gethandlerdata(h, s);}/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2008-2012 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> */#include <stdlib.h>#include <string.h>bool upb_symtab_isfrozen(const upb_symtab *s) {  return upb_refcounted_isfrozen(UPB_UPCAST(s));}void upb_symtab_ref(const upb_symtab *s, const void *owner) {  upb_refcounted_ref(UPB_UPCAST(s), owner);}void upb_symtab_unref(const upb_symtab *s, const void *owner) {  upb_refcounted_unref(UPB_UPCAST(s), owner);}void upb_symtab_donateref(    const upb_symtab *s, const void *from, const void *to) {  upb_refcounted_donateref(UPB_UPCAST(s), from, to);}void upb_symtab_checkref(const upb_symtab *s, const void *owner) {  upb_refcounted_checkref(UPB_UPCAST(s), owner);}static void upb_symtab_free(upb_refcounted *r) {  upb_symtab *s = (upb_symtab*)r;  upb_strtable_iter i;  upb_strtable_begin(&i, &s->symtab);  for (; !upb_strtable_done(&i); upb_strtable_next(&i)) {    const upb_def *def = upb_value_getptr(upb_strtable_iter_value(&i));    upb_def_unref(def, s);  }  upb_strtable_uninit(&s->symtab);  free(s);}upb_symtab *upb_symtab_new(const void *owner) {  static const struct upb_refcounted_vtbl vtbl = {NULL, &upb_symtab_free};  upb_symtab *s = malloc(sizeof(*s));  upb_refcounted_init(UPB_UPCAST(s), &vtbl, owner);  upb_strtable_init(&s->symtab, UPB_CTYPE_PTR);  return s;}void upb_symtab_freeze(upb_symtab *s) {  assert(!upb_symtab_isfrozen(s));  upb_refcounted *r = UPB_UPCAST(s);  // The symtab does not take ref2's (see refcounted.h) on the defs, because  // defs cannot refer back to the table and therefore cannot create cycles.  So  // 0 will suffice for maxdepth here.  bool ok = upb_refcounted_freeze(&r, 1, NULL, 0);  UPB_ASSERT_VAR(ok, ok);}const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym) {  upb_value v;  upb_def *ret = upb_strtable_lookup(&s->symtab, sym, &v) ?      upb_value_getptr(v) : NULL;  return ret;}const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym) {  upb_value v;  upb_def *def = upb_strtable_lookup(&s->symtab, sym, &v) ?      upb_value_getptr(v) : NULL;  return def ? upb_dyncast_msgdef(def) : NULL;}const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym) {  upb_value v;  upb_def *def = upb_strtable_lookup(&s->symtab, sym, &v) ?      upb_value_getptr(v) : NULL;  return def ? upb_dyncast_enumdef(def) : NULL;}// Given a symbol and the base symbol inside which it is defined, find the// symbol's definition in t.static upb_def *upb_resolvename(const upb_strtable *t,                                const char *base, const char *sym) {  if(strlen(sym) == 0) return NULL;  if(sym[0] == '.') {    // Symbols starting with '.' are absolute, so we do a single lookup.    // Slice to omit the leading '.'    upb_value v;    return upb_strtable_lookup(t, sym + 1, &v) ? upb_value_getptr(v) : NULL;  } else {    // Remove components from base until we find an entry or run out.    // TODO: This branch is totally broken, but currently not used.    (void)base;    assert(false);    return NULL;  }}const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,                                  const char *sym) {  upb_def *ret = upb_resolvename(&s->symtab, base, sym);  return ret;}// Searches def and its children to find defs that have the same name as any// def in "addtab."  Returns true if any where found, and as a side-effect adds// duplicates of these defs into addtab.//// We use a modified depth-first traversal that traverses each SCC (which we// already computed) as if it were a single node.  This allows us to traverse// the possibly-cyclic graph as if it were a DAG and to dup the correct set of// nodes with O(n) time.static bool upb_resolve_dfs(const upb_def *def, upb_strtable *addtab,                            const void *new_owner, upb_inttable *seen,                            upb_status *s) {  // Memoize results of this function for efficiency (since we're traversing a  // DAG this is not needed to limit the depth of the search).  upb_value v;  if (upb_inttable_lookup(seen, (uintptr_t)def, &v))    return upb_value_getbool(v);  // Visit submessages for all messages in the SCC.  bool need_dup = false;  const upb_def *base = def;  do {    assert(upb_def_isfrozen(def));    if (def->type == UPB_DEF_FIELD) continue;    upb_value v;    if (upb_strtable_lookup(addtab, upb_def_fullname(def), &v)) {      need_dup = true;    }    // For messages, continue the recursion by visiting all subdefs.    const upb_msgdef *m = upb_dyncast_msgdef(def);    if (m) {      upb_msg_iter i;      for(upb_msg_begin(&i, m); !upb_msg_done(&i); upb_msg_next(&i)) {        upb_fielddef *f = upb_msg_iter_field(&i);        if (!upb_fielddef_hassubdef(f)) continue;        // |= to avoid short-circuit; we need its side-effects.        need_dup |= upb_resolve_dfs(            upb_fielddef_subdef(f), addtab, new_owner, seen, s);        if (!upb_ok(s)) return false;      }    }  } while ((def = (upb_def*)def->base.next) != base);  if (need_dup) {    // Dup any defs that don't already have entries in addtab.    def = base;    do {      if (def->type == UPB_DEF_FIELD) continue;      const char *name = upb_def_fullname(def);      if (!upb_strtable_lookup(addtab, name, NULL)) {        upb_def *newdef = upb_def_dup(def, new_owner);        if (!newdef) goto oom;        newdef->came_from_user = false;        if (!upb_strtable_insert(addtab, name, upb_value_ptr(newdef)))          goto oom;      }    } while ((def = (upb_def*)def->base.next) != base);  }  upb_inttable_insert(seen, (uintptr_t)def, upb_value_bool(need_dup));  return need_dup;oom:  upb_status_seterrmsg(s, "out of memory");  return false;}// TODO(haberman): we need a lot more testing of error conditions.// The came_from_user stuff in particular is not tested.bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, int n, void *ref_donor,                    upb_status *status) {  assert(!upb_symtab_isfrozen(s));  upb_def **add_defs = NULL;  upb_strtable addtab;  if (!upb_strtable_init(&addtab, UPB_CTYPE_PTR)) {    upb_status_seterrmsg(status, "out of memory");    return false;  }  // Add new defs to our "add" set.  for (int i = 0; i < n; i++) {    upb_def *def = defs[i];    if (upb_def_isfrozen(def)) {      upb_status_seterrmsg(status, "added defs must be mutable");      goto err;    }    assert(!upb_def_isfrozen(def));    const char *fullname = upb_def_fullname(def);    if (!fullname) {      upb_status_seterrmsg(          status, "Anonymous defs cannot be added to a symtab");      goto err;    }    upb_fielddef *f = upb_dyncast_fielddef_mutable(def);    if (f) {      if (!upb_fielddef_containingtypename(f)) {        upb_status_seterrmsg(status,                             "Standalone fielddefs must have a containing type "                             "(extendee) name set");        goto err;      }    } else {      if (upb_strtable_lookup(&addtab, fullname, NULL)) {        upb_status_seterrf(status, "Conflicting defs named '%s'", fullname);        goto err;      }      // We need this to back out properly, because if there is a failure we      // need to donate the ref back to the caller.      def->came_from_user = true;      upb_def_donateref(def, ref_donor, s);      if (!upb_strtable_insert(&addtab, fullname, upb_value_ptr(def)))        goto oom_err;    }  }  // Add standalone fielddefs (ie. extensions) to the appropriate messages.  // If the appropriate message only exists in the existing symtab, duplicate  // it so we have a mutable copy we can add the fields to.  for (int i = 0; i < n; i++) {    upb_def *def = defs[i];    upb_fielddef *f = upb_dyncast_fielddef_mutable(def);    if (!f) continue;    const char *msgname = upb_fielddef_containingtypename(f);    // We validated this earlier in this function.    assert(msgname);    // If the extendee name is absolutely qualified, move past the initial ".".    // TODO(haberman): it is not obvious what it would mean if this was not    // absolutely qualified.    if (msgname[0] == '.') {      msgname++;    }    upb_value v;    upb_msgdef *m;    if (upb_strtable_lookup(&addtab, msgname, &v)) {      // Extendee is in the set of defs the user asked us to add.      m = upb_value_getptr(v);    } else {      // Need to find and dup the extendee from the existing symtab.      const upb_msgdef *frozen_m = upb_symtab_lookupmsg(s, msgname);      if (!frozen_m) {        upb_status_seterrf(status,                           "Tried to extend message %s that does not exist "                           "in this SymbolTable.",                           msgname);        goto err;      }      m = upb_msgdef_dup(frozen_m, s);      if (!m) goto oom_err;      if (!upb_strtable_insert(&addtab, msgname, upb_value_ptr(m))) {        upb_msgdef_unref(m, s);        goto oom_err;      }    }    if (!upb_msgdef_addfield(m, f, ref_donor, status)) {      goto err;    }  }  // Add dups of any existing def that can reach a def with the same name as  // anything in our "add" set.  upb_inttable seen;  if (!upb_inttable_init(&seen, UPB_CTYPE_BOOL)) goto oom_err;  upb_strtable_iter i;  upb_strtable_begin(&i, &s->symtab);  for (; !upb_strtable_done(&i); upb_strtable_next(&i)) {    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&i));    upb_resolve_dfs(def, &addtab, s, &seen, status);    if (!upb_ok(status)) goto err;  }  upb_inttable_uninit(&seen);  // Now using the table, resolve symbolic references for subdefs.  upb_strtable_begin(&i, &addtab);  for (; !upb_strtable_done(&i); upb_strtable_next(&i)) {    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&i));    upb_msgdef *m = upb_dyncast_msgdef_mutable(def);    if (!m) continue;    // Type names are resolved relative to the message in which they appear.    const char *base = upb_msgdef_fullname(m);    upb_msg_iter j;    for(upb_msg_begin(&j, m); !upb_msg_done(&j); upb_msg_next(&j)) {      upb_fielddef *f = upb_msg_iter_field(&j);      const char *name = upb_fielddef_subdefname(f);      if (name && !upb_fielddef_subdef(f)) {        // Try the lookup in the current set of to-be-added defs first. If not        // there, try existing defs.        upb_def *subdef = upb_resolvename(&addtab, base, name);        if (subdef == NULL) {          subdef = upb_resolvename(&s->symtab, base, name);        }        if (subdef == NULL) {          upb_status_seterrf(              status, "couldn't resolve name '%s' in message '%s'", name, base);          goto err;        } else if (!upb_fielddef_setsubdef(f, subdef, status)) {          goto err;        }      }    }  }  // We need an array of the defs in addtab, for passing to upb_def_freeze.  add_defs = malloc(sizeof(void*) * upb_strtable_count(&addtab));  if (add_defs == NULL) goto oom_err;  upb_strtable_begin(&i, &addtab);  for (n = 0; !upb_strtable_done(&i); upb_strtable_next(&i)) {    add_defs[n++] = upb_value_getptr(upb_strtable_iter_value(&i));  }  if (!upb_def_freeze(add_defs, n, status)) goto err;  // This must be delayed until all errors have been detected, since error  // recovery code uses this table to cleanup defs.  upb_strtable_uninit(&addtab);  // TODO(haberman) we don't properly handle errors after this point (like  // OOM in upb_strtable_insert() below).  for (int i = 0; i < n; i++) {    upb_def *def = add_defs[i];    const char *name = upb_def_fullname(def);    upb_value v;    if (upb_strtable_remove(&s->symtab, name, &v)) {      const upb_def *def = upb_value_getptr(v);      upb_def_unref(def, s);    }    bool success = upb_strtable_insert(&s->symtab, name, upb_value_ptr(def));    UPB_ASSERT_VAR(success, success == true);  }  free(add_defs);  return true;oom_err:  upb_status_seterrmsg(status, "out of memory");err: {    // For defs the user passed in, we need to donate the refs back.  For defs    // we dup'd, we need to just unref them.    upb_strtable_iter i;    upb_strtable_begin(&i, &addtab);    for (; !upb_strtable_done(&i); upb_strtable_next(&i)) {      upb_def *def = upb_value_getptr(upb_strtable_iter_value(&i));      bool came_from_user = def->came_from_user;      def->came_from_user = false;      if (came_from_user) {        upb_def_donateref(def, s, ref_donor);      } else {        upb_def_unref(def, s);      }    }  }  upb_strtable_uninit(&addtab);  free(add_defs);  assert(!upb_ok(status));  return false;}// Iteration.static void advance_to_matching(upb_symtab_iter *iter) {  if (iter->type == UPB_DEF_ANY)    return;  while (!upb_strtable_done(&iter->iter) &&         iter->type != upb_symtab_iter_def(iter)->type) {    upb_strtable_next(&iter->iter);  }}void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,                      upb_deftype_t type) {  upb_strtable_begin(&iter->iter, &s->symtab);  iter->type = type;  advance_to_matching(iter);}void upb_symtab_next(upb_symtab_iter *iter) {  upb_strtable_next(&iter->iter);  advance_to_matching(iter);}bool upb_symtab_done(const upb_symtab_iter *iter) {  return upb_strtable_done(&iter->iter);}const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter) {  return upb_value_getptr(upb_strtable_iter_value(&iter->iter));}/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2009 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> * * Implementation is heavily inspired by Lua's ltable.c. */#include <stdlib.h>#include <string.h>#define UPB_MAXARRSIZE 16  // 64k.// From Chromium.#define ARRAY_SIZE(x) \    ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))static const double MAX_LOAD = 0.85;// The minimum utilization of the array part of a mixed hash/array table.  This// is a speed/memory-usage tradeoff (though it's not straightforward because of// cache effects).  The lower this is, the more memory we'll use.static const double MIN_DENSITY = 0.1;bool is_pow2(uint64_t v) { return v == 0 || (v & (v - 1)) == 0; }int log2ceil(uint64_t v) {  int ret = 0;  bool pow2 = is_pow2(v);  while (v >>= 1) ret++;  ret = pow2 ? ret : ret + 1;  // Ceiling.  return UPB_MIN(UPB_MAXARRSIZE, ret);}char *upb_strdup(const char *s) {  return upb_strdup2(s, strlen(s));}char *upb_strdup2(const char *s, size_t len) {  // Always null-terminate, even if binary data; but don't rely on the input to  // have a null-terminating byte since it may be a raw binary buffer.  size_t n = len + 1;  char *p = malloc(n);  if (p) memcpy(p, s, len);  p[len] = 0;  return p;}// A type to represent the lookup key of either a strtable or an inttable.typedef struct {  upb_tabkey key;} lookupkey_t;static lookupkey_t strkey2(const char *str, size_t len) {  lookupkey_t k;  k.key.s.str = (char*)str;  k.key.s.length = len;  return k;}static lookupkey_t intkey(uintptr_t key) {  lookupkey_t k;  k.key = upb_intkey(key);  return k;}typedef uint32_t hashfunc_t(upb_tabkey key);typedef bool eqlfunc_t(upb_tabkey k1, lookupkey_t k2);/* Base table (shared code) ***************************************************/// For when we need to cast away const.static upb_tabent *mutable_entries(upb_table *t) {  return (upb_tabent*)t->entries;}static bool isfull(upb_table *t) {  return (double)(t->count + 1) / upb_table_size(t) > MAX_LOAD;}static bool init(upb_table *t, upb_ctype_t ctype, uint8_t size_lg2) {  t->count = 0;  t->ctype = ctype;  t->size_lg2 = size_lg2;  t->mask = upb_table_size(t) ? upb_table_size(t) - 1 : 0;  size_t bytes = upb_table_size(t) * sizeof(upb_tabent);  if (bytes > 0) {    t->entries = malloc(bytes);    if (!t->entries) return false;    memset(mutable_entries(t), 0, bytes);  } else {    t->entries = NULL;  }  return true;}static void uninit(upb_table *t) { free(mutable_entries(t)); }static upb_tabent *emptyent(upb_table *t) {  upb_tabent *e = mutable_entries(t) + upb_table_size(t);  while (1) { if (upb_tabent_isempty(--e)) return e; assert(e > t->entries); }}static upb_tabent *getentry_mutable(upb_table *t, uint32_t hash) {  return (upb_tabent*)upb_getentry(t, hash);}static const upb_tabent *findentry(const upb_table *t, lookupkey_t key,                                   uint32_t hash, eqlfunc_t *eql) {  if (t->size_lg2 == 0) return NULL;  const upb_tabent *e = upb_getentry(t, hash);  if (upb_tabent_isempty(e)) return NULL;  while (1) {    if (eql(e->key, key)) return e;    if ((e = e->next) == NULL) return NULL;  }}static upb_tabent *findentry_mutable(upb_table *t, lookupkey_t key,                                     uint32_t hash, eqlfunc_t *eql) {  return (upb_tabent*)findentry(t, key, hash, eql);}static bool lookup(const upb_table *t, lookupkey_t key, upb_value *v,                   uint32_t hash, eqlfunc_t *eql) {  const upb_tabent *e = findentry(t, key, hash, eql);  if (e) {    if (v) {      _upb_value_setval(v, e->val, t->ctype);    }    return true;  } else {    return false;  }}// The given key must not already exist in the table.static void insert(upb_table *t, lookupkey_t key, upb_value val,                   uint32_t hash, hashfunc_t *hashfunc, eqlfunc_t *eql) {  UPB_UNUSED(eql);  assert(findentry(t, key, hash, eql) == NULL);  assert(val.ctype == t->ctype);  t->count++;  upb_tabent *mainpos_e = getentry_mutable(t, hash);  upb_tabent *our_e = mainpos_e;  if (upb_tabent_isempty(mainpos_e)) {    // Our main position is empty; use it.    our_e->next = NULL;  } else {    // Collision.    upb_tabent *new_e = emptyent(t);    // Head of collider's chain.    upb_tabent *chain = getentry_mutable(t, hashfunc(mainpos_e->key));    if (chain == mainpos_e) {      // Existing ent is in its main posisiton (it has the same hash as us, and      // is the head of our chain).  Insert to new ent and append to this chain.      new_e->next = mainpos_e->next;      mainpos_e->next = new_e;      our_e = new_e;    } else {      // Existing ent is not in its main position (it is a node in some other      // chain).  This implies that no existing ent in the table has our hash.      // Evict it (updating its chain) and use its ent for head of our chain.      *new_e = *mainpos_e;  // copies next.      while (chain->next != mainpos_e) {        chain = (upb_tabent*)chain->next;        assert(chain);      }      chain->next = new_e;      our_e = mainpos_e;      our_e->next = NULL;    }  }  our_e->key = key.key;  our_e->val = val.val;  assert(findentry(t, key, hash, eql) == our_e);}static bool rm(upb_table *t, lookupkey_t key, upb_value *val,               upb_tabkey *removed, uint32_t hash, eqlfunc_t *eql) {  upb_tabent *chain = getentry_mutable(t, hash);  if (upb_tabent_isempty(chain)) return false;  if (eql(chain->key, key)) {    // Element to remove is at the head of its chain.    t->count--;    if (val) {      _upb_value_setval(val, chain->val, t->ctype);    }    if (chain->next) {      upb_tabent *move = (upb_tabent*)chain->next;      *chain = *move;      if (removed) *removed = move->key;      move->key.num = 0;  // Make the slot empty.    } else {      if (removed) *removed = chain->key;      chain->key.num = 0;  // Make the slot empty.    }    return true;  } else {    // Element to remove is either in a non-head position or not in the table.    while (chain->next && !eql(chain->next->key, key))      chain = (upb_tabent*)chain->next;    if (chain->next) {      // Found element to remove.      if (val) {        _upb_value_setval(val, chain->next->val, t->ctype);      }      upb_tabent *rm = (upb_tabent*)chain->next;      if (removed) *removed = rm->key;      rm->key.num = 0;      chain->next = rm->next;      t->count--;      return true;    } else {      return false;    }  }}static size_t next(const upb_table *t, size_t i) {  do {    if (++i >= upb_table_size(t))      return SIZE_MAX;  } while(upb_tabent_isempty(&t->entries[i]));  return i;}static size_t begin(const upb_table *t) {  return next(t, -1);}/* upb_strtable ***************************************************************/// A simple "subclass" of upb_table that only adds a hash function for strings.static uint32_t strhash(upb_tabkey key) {  return MurmurHash2(key.s.str, key.s.length, 0);}static bool streql(upb_tabkey k1, lookupkey_t k2) {  return k1.s.length == k2.key.s.length &&         memcmp(k1.s.str, k2.key.s.str, k1.s.length) == 0;}bool upb_strtable_init(upb_strtable *t, upb_ctype_t ctype) {  return init(&t->t, ctype, 2);}void upb_strtable_uninit(upb_strtable *t) {  for (size_t i = 0; i < upb_table_size(&t->t); i++)    free((void*)t->t.entries[i].key.s.str);  uninit(&t->t);}bool upb_strtable_resize(upb_strtable *t, size_t size_lg2) {  upb_strtable new_table;  if (!init(&new_table.t, t->t.ctype, size_lg2))    return false;  upb_strtable_iter i;  upb_strtable_begin(&i, t);  for ( ; !upb_strtable_done(&i); upb_strtable_next(&i)) {    upb_strtable_insert2(        &new_table,        upb_strtable_iter_key(&i),        upb_strtable_iter_keylength(&i),        upb_strtable_iter_value(&i));  }  upb_strtable_uninit(t);  *t = new_table;  return true;}bool upb_strtable_insert2(upb_strtable *t, const char *k, size_t len,                          upb_value v) {  if (isfull(&t->t)) {    // Need to resize.  New table of double the size, add old elements to it.    if (!upb_strtable_resize(t, t->t.size_lg2 + 1)) {      return false;    }  }  if ((k = upb_strdup2(k, len)) == NULL) return false;  lookupkey_t key = strkey2(k, len);  uint32_t hash = MurmurHash2(key.key.s.str, key.key.s.length, 0);  insert(&t->t, key, v, hash, &strhash, &streql);  return true;}bool upb_strtable_lookup2(const upb_strtable *t, const char *key, size_t len,                          upb_value *v) {  uint32_t hash = MurmurHash2(key, len, 0);  return lookup(&t->t, strkey2(key, len), v, hash, &streql);}bool upb_strtable_remove2(upb_strtable *t, const char *key, size_t len,                         upb_value *val) {  uint32_t hash = MurmurHash2(key, strlen(key), 0);  upb_tabkey tabkey;  if (rm(&t->t, strkey2(key, len), val, &tabkey, hash, &streql)) {    free((void*)tabkey.s.str);    return true;  } else {    return false;  }}// Iterationstatic const upb_tabent *str_tabent(const upb_strtable_iter *i) {  return &i->t->t.entries[i->index];}void upb_strtable_begin(upb_strtable_iter *i, const upb_strtable *t) {  i->t = t;  i->index = begin(&t->t);}void upb_strtable_next(upb_strtable_iter *i) {  i->index = next(&i->t->t, i->index);}bool upb_strtable_done(const upb_strtable_iter *i) {  return i->index >= upb_table_size(&i->t->t) ||         upb_tabent_isempty(str_tabent(i));}const char *upb_strtable_iter_key(upb_strtable_iter *i) {  assert(!upb_strtable_done(i));  return str_tabent(i)->key.s.str;}size_t upb_strtable_iter_keylength(upb_strtable_iter *i) {  assert(!upb_strtable_done(i));  return str_tabent(i)->key.s.length;}upb_value upb_strtable_iter_value(const upb_strtable_iter *i) {  assert(!upb_strtable_done(i));  return _upb_value_val(str_tabent(i)->val, i->t->t.ctype);}void upb_strtable_iter_setdone(upb_strtable_iter *i) {  i->index = SIZE_MAX;}bool upb_strtable_iter_isequal(const upb_strtable_iter *i1,                               const upb_strtable_iter *i2) {  if (upb_strtable_done(i1) && upb_strtable_done(i2))    return true;  return i1->t == i2->t && i1->index == i2->index;}/* upb_inttable ***************************************************************/// For inttables we use a hybrid structure where small keys are kept in an// array and large keys are put in the hash table.static uint32_t inthash(upb_tabkey key) { return upb_inthash(key.num); }static bool inteql(upb_tabkey k1, lookupkey_t k2) {  return k1.num == k2.key.num;}static _upb_value *mutable_array(upb_inttable *t) {  return (_upb_value*)t->array;}static _upb_value *inttable_val(upb_inttable *t, uintptr_t key) {  if (key < t->array_size) {    return upb_arrhas(t->array[key]) ? &(mutable_array(t)[key]) : NULL;  } else {    upb_tabent *e =        findentry_mutable(&t->t, intkey(key), upb_inthash(key), &inteql);    return e ? &e->val : NULL;  }}static const _upb_value *inttable_val_const(const upb_inttable *t,                                            uintptr_t key) {  return inttable_val((upb_inttable*)t, key);}size_t upb_inttable_count(const upb_inttable *t) {  return t->t.count + t->array_count;}static void check(upb_inttable *t) {  UPB_UNUSED(t);#if defined(UPB_DEBUG_TABLE) && !defined(NDEBUG)  // This check is very expensive (makes inserts/deletes O(N)).  size_t count = 0;  upb_inttable_iter i;  upb_inttable_begin(&i, t);  for(; !upb_inttable_done(&i); upb_inttable_next(&i), count++) {    assert(upb_inttable_lookup(t, upb_inttable_iter_key(&i), NULL));  }  assert(count == upb_inttable_count(t));#endif}bool upb_inttable_sizedinit(upb_inttable *t, upb_ctype_t ctype,                            size_t asize, int hsize_lg2) {  if (!init(&t->t, ctype, hsize_lg2)) return false;  // Always make the array part at least 1 long, so that we know key 0  // won't be in the hash part, which simplifies things.  t->array_size = UPB_MAX(1, asize);  t->array_count = 0;  size_t array_bytes = t->array_size * sizeof(upb_value);  t->array = malloc(array_bytes);  if (!t->array) {    uninit(&t->t);    return false;  }  memset(mutable_array(t), 0xff, array_bytes);  check(t);  return true;}bool upb_inttable_init(upb_inttable *t, upb_ctype_t ctype) {  return upb_inttable_sizedinit(t, ctype, 0, 4);}void upb_inttable_uninit(upb_inttable *t) {  uninit(&t->t);  free(mutable_array(t));}bool upb_inttable_insert(upb_inttable *t, uintptr_t key, upb_value val) {  assert(upb_arrhas(val.val));  if (key < t->array_size) {    assert(!upb_arrhas(t->array[key]));    t->array_count++;    mutable_array(t)[key] = val.val;  } else {    if (isfull(&t->t)) {      // Need to resize the hash part, but we re-use the array part.      upb_table new_table;      if (!init(&new_table, t->t.ctype, t->t.size_lg2 + 1))        return false;      size_t i;      for (i = begin(&t->t); i < upb_table_size(&t->t); i = next(&t->t, i)) {        const upb_tabent *e = &t->t.entries[i];        upb_value v;        _upb_value_setval(&v, e->val, t->t.ctype);        uint32_t hash = upb_inthash(e->key.num);        insert(&new_table, intkey(e->key.num), v, hash, &inthash, &inteql);      }      assert(t->t.count == new_table.count);      uninit(&t->t);      t->t = new_table;    }    insert(&t->t, intkey(key), val, upb_inthash(key), &inthash, &inteql);  }  check(t);  return true;}bool upb_inttable_lookup(const upb_inttable *t, uintptr_t key, upb_value *v) {  const _upb_value *table_v = inttable_val_const(t, key);  if (!table_v) return false;  if (v) _upb_value_setval(v, *table_v, t->t.ctype);  return true;}bool upb_inttable_replace(upb_inttable *t, uintptr_t key, upb_value val) {  _upb_value *table_v = inttable_val(t, key);  if (!table_v) return false;  *table_v = val.val;  return true;}bool upb_inttable_remove(upb_inttable *t, uintptr_t key, upb_value *val) {  bool success;  if (key < t->array_size) {    if (upb_arrhas(t->array[key])) {      t->array_count--;      if (val) {        _upb_value_setval(val, t->array[key], t->t.ctype);      }      _upb_value empty = UPB_ARRAY_EMPTYENT;      mutable_array(t)[key] = empty;      success = true;    } else {      success = false;    }  } else {    upb_tabkey removed;    uint32_t hash = upb_inthash(key);    success = rm(&t->t, intkey(key), val, &removed, hash, &inteql);  }  check(t);  return success;}bool upb_inttable_push(upb_inttable *t, upb_value val) {  return upb_inttable_insert(t, upb_inttable_count(t), val);}upb_value upb_inttable_pop(upb_inttable *t) {  upb_value val;  bool ok = upb_inttable_remove(t, upb_inttable_count(t) - 1, &val);  UPB_ASSERT_VAR(ok, ok);  return val;}bool upb_inttable_insertptr(upb_inttable *t, const void *key, upb_value val) {  return upb_inttable_insert(t, (uintptr_t)key, val);}bool upb_inttable_lookupptr(const upb_inttable *t, const void *key,                            upb_value *v) {  return upb_inttable_lookup(t, (uintptr_t)key, v);}bool upb_inttable_removeptr(upb_inttable *t, const void *key, upb_value *val) {  return upb_inttable_remove(t, (uintptr_t)key, val);}void upb_inttable_compact(upb_inttable *t) {  // Create a power-of-two histogram of the table keys.  int counts[UPB_MAXARRSIZE + 1] = {0};  uintptr_t max_key = 0;  upb_inttable_iter i;  upb_inttable_begin(&i, t);  for (; !upb_inttable_done(&i); upb_inttable_next(&i)) {    uintptr_t key = upb_inttable_iter_key(&i);    if (key > max_key) {      max_key = key;    }    counts[log2ceil(key)]++;  }  int arr_size;  int arr_count = upb_inttable_count(t);  if (upb_inttable_count(t) >= max_key * MIN_DENSITY) {    // We can put 100% of the entries in the array part.    arr_size = max_key + 1;  } else {    // Find the largest power of two that satisfies the MIN_DENSITY definition.    for (int size_lg2 = ARRAY_SIZE(counts) - 1; size_lg2 > 1; size_lg2--) {      arr_size = 1 << size_lg2;      arr_count -= counts[size_lg2];      if (arr_count >= arr_size * MIN_DENSITY) {        break;      }    }  }  // Array part must always be at least 1 entry large to catch lookups of key  // 0.  Key 0 must always be in the array part because "0" in the hash part  // denotes an empty entry.  arr_size = UPB_MAX(arr_size, 1);  // Insert all elements into new, perfectly-sized table.  int hash_count = upb_inttable_count(t) - arr_count;  int hash_size = hash_count ? (hash_count / MAX_LOAD) + 1 : 0;  int hashsize_lg2 = log2ceil(hash_size);  assert(hash_count >= 0);  upb_inttable new_t;  upb_inttable_sizedinit(&new_t, t->t.ctype, arr_size, hashsize_lg2);  upb_inttable_begin(&i, t);  for (; !upb_inttable_done(&i); upb_inttable_next(&i)) {    uintptr_t k = upb_inttable_iter_key(&i);    upb_inttable_insert(&new_t, k, upb_inttable_iter_value(&i));  }  assert(new_t.array_size == arr_size);  assert(new_t.t.size_lg2 == hashsize_lg2);  upb_inttable_uninit(t);  *t = new_t;}// Iteration.static const upb_tabent *int_tabent(const upb_inttable_iter *i) {  assert(!i->array_part);  return &i->t->t.entries[i->index];}static _upb_value int_arrent(const upb_inttable_iter *i) {  assert(i->array_part);  return i->t->array[i->index];}void upb_inttable_begin(upb_inttable_iter *i, const upb_inttable *t) {  i->t = t;  i->index = -1;  i->array_part = true;  upb_inttable_next(i);}void upb_inttable_next(upb_inttable_iter *iter) {  const upb_inttable *t = iter->t;  if (iter->array_part) {    while (++iter->index < t->array_size) {      if (upb_arrhas(int_arrent(iter))) {        return;      }    }    iter->array_part = false;    iter->index = begin(&t->t);  } else {    iter->index = next(&t->t, iter->index);  }}bool upb_inttable_done(const upb_inttable_iter *i) {  if (i->array_part) {    return i->index >= i->t->array_size ||           !upb_arrhas(int_arrent(i));  } else {    return i->index >= upb_table_size(&i->t->t) ||           upb_tabent_isempty(int_tabent(i));  }}uintptr_t upb_inttable_iter_key(const upb_inttable_iter *i) {  assert(!upb_inttable_done(i));  return i->array_part ? i->index : int_tabent(i)->key.num;}upb_value upb_inttable_iter_value(const upb_inttable_iter *i) {  assert(!upb_inttable_done(i));  return _upb_value_val(      i->array_part ? i->t->array[i->index] : int_tabent(i)->val,      i->t->t.ctype);}void upb_inttable_iter_setdone(upb_inttable_iter *i) {  i->index = SIZE_MAX;  i->array_part = false;}bool upb_inttable_iter_isequal(const upb_inttable_iter *i1,                                          const upb_inttable_iter *i2) {  if (upb_inttable_done(i1) && upb_inttable_done(i2))    return true;  return i1->t == i2->t && i1->index == i2->index &&         i1->array_part == i2->array_part;}#ifdef UPB_UNALIGNED_READS_OK//-----------------------------------------------------------------------------// MurmurHash2, by Austin Appleby (released as public domain).// Reformatted and C99-ified by Joshua Haberman.// Note - This code makes a few assumptions about how your machine behaves -//   1. We can read a 4-byte value from any address without crashing//   2. sizeof(int) == 4 (in upb this limitation is removed by using uint32_t// And it has a few limitations -//   1. It will not work incrementally.//   2. It will not produce the same results on little-endian and big-endian//      machines.uint32_t MurmurHash2(const void *key, size_t len, uint32_t seed) {  // 'm' and 'r' are mixing constants generated offline.  // They're not really 'magic', they just happen to work well.  const uint32_t m = 0x5bd1e995;  const int32_t r = 24;  // Initialize the hash to a 'random' value  uint32_t h = seed ^ len;  // Mix 4 bytes at a time into the hash  const uint8_t * data = (const uint8_t *)key;  while(len >= 4) {    uint32_t k = *(uint32_t *)data;    k *= m;    k ^= k >> r;    k *= m;    h *= m;    h ^= k;    data += 4;    len -= 4;  }  // Handle the last few bytes of the input array  switch(len) {    case 3: h ^= data[2] << 16;    case 2: h ^= data[1] << 8;    case 1: h ^= data[0]; h *= m;  };  // Do a few final mixes of the hash to ensure the last few  // bytes are well-incorporated.  h ^= h >> 13;  h *= m;  h ^= h >> 15;  return h;}#else // !UPB_UNALIGNED_READS_OK//-----------------------------------------------------------------------------// MurmurHashAligned2, by Austin Appleby// Same algorithm as MurmurHash2, but only does aligned reads - should be safer// on certain platforms.// Performance will be lower than MurmurHash2#define MIX(h,k,m) { k *= m; k ^= k >> r; k *= m; h *= m; h ^= k; }uint32_t MurmurHash2(const void * key, size_t len, uint32_t seed) {  const uint32_t m = 0x5bd1e995;  const int32_t r = 24;  const uint8_t * data = (const uint8_t *)key;  uint32_t h = seed ^ len;  uint8_t align = (uintptr_t)data & 3;  if(align && (len >= 4)) {    // Pre-load the temp registers    uint32_t t = 0, d = 0;    switch(align) {      case 1: t |= data[2] << 16;      case 2: t |= data[1] << 8;      case 3: t |= data[0];    }    t <<= (8 * align);    data += 4-align;    len -= 4-align;    int32_t sl = 8 * (4-align);    int32_t sr = 8 * align;    // Mix    while(len >= 4) {      d = *(uint32_t *)data;      t = (t >> sr) | (d << sl);      uint32_t k = t;      MIX(h,k,m);      t = d;      data += 4;      len -= 4;    }    // Handle leftover data in temp registers    d = 0;    if(len >= align) {      switch(align) {        case 3: d |= data[2] << 16;        case 2: d |= data[1] << 8;        case 1: d |= data[0];      }      uint32_t k = (t >> sr) | (d << sl);      MIX(h,k,m);      data += align;      len -= align;      //----------      // Handle tail bytes      switch(len) {        case 3: h ^= data[2] << 16;        case 2: h ^= data[1] << 8;        case 1: h ^= data[0]; h *= m;      };    } else {      switch(len) {        case 3: d |= data[2] << 16;        case 2: d |= data[1] << 8;        case 1: d |= data[0];        case 0: h ^= (t >> sr) | (d << sl); h *= m;      }    }    h ^= h >> 13;    h *= m;    h ^= h >> 15;    return h;  } else {    while(len >= 4) {      uint32_t k = *(uint32_t *)data;      MIX(h,k,m);      data += 4;      len -= 4;    }    //----------    // Handle tail bytes    switch(len) {      case 3: h ^= data[2] << 16;      case 2: h ^= data[1] << 8;      case 1: h ^= data[0]; h *= m;    };    h ^= h >> 13;    h *= m;    h ^= h >> 15;    return h;  }}#undef MIX#endif // UPB_UNALIGNED_READS_OK/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2009-2012 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> */#include <errno.h>#include <stdarg.h>#include <stddef.h>#include <stdint.h>#include <stdio.h>#include <stdlib.h>#include <string.h>bool upb_dumptostderr(void *closure, const upb_status* status) {  UPB_UNUSED(closure);  fprintf(stderr, "%s\n", upb_status_errmsg(status));  return false;}// Guarantee null-termination and provide ellipsis truncation.// It may be tempting to "optimize" this by initializing these final// four bytes up-front and then being careful never to overwrite them,// this is safer and simpler.static void nullz(upb_status *status) {  const char *ellipsis = "...";  size_t len = strlen(ellipsis);  assert(sizeof(status->msg) > len);  memcpy(status->msg + sizeof(status->msg) - len, ellipsis, len);}void upb_status_clear(upb_status *status) {  upb_status blank = UPB_STATUS_INIT;  upb_status_copy(status, &blank);}bool upb_ok(const upb_status *status) { return status->ok_; }upb_errorspace *upb_status_errspace(const upb_status *status) {  return status->error_space_;}int upb_status_errcode(const upb_status *status) { return status->code_; }const char *upb_status_errmsg(const upb_status *status) { return status->msg; }void upb_status_seterrmsg(upb_status *status, const char *msg) {  if (!status) return;  status->ok_ = false;  strncpy(status->msg, msg, sizeof(status->msg));  nullz(status);}void upb_status_seterrf(upb_status *status, const char *fmt, ...) {  va_list args;  va_start(args, fmt);  upb_status_vseterrf(status, fmt, args);  va_end(args);}void upb_status_vseterrf(upb_status *status, const char *fmt, va_list args) {  if (!status) return;  status->ok_ = false;  vsnprintf(status->msg, sizeof(status->msg), fmt, args);  nullz(status);}void upb_status_seterrcode(upb_status *status, upb_errorspace *space,                           int code) {  if (!status) return;  status->ok_ = false;  status->error_space_ = space;  status->code_ = code;  space->set_message(status, code);}void upb_status_copy(upb_status *to, const upb_status *from) {  if (!to) return;  *to = *from;}// This file was generated by upbc (the upb compiler).// Do not edit -- your changes will be discarded when the file is// regenerated.static const upb_msgdef msgs[20];static const upb_fielddef fields[81];static const upb_enumdef enums[4];static const upb_tabent strentries[236];static const upb_tabent intentries[14];static const _upb_value arrays[232];#ifdef UPB_DEBUG_REFSstatic upb_inttable reftables[212];#endifstatic const upb_msgdef msgs[20] = {  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto", 27, 6, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[0], 8, 7), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[0]),&reftables[0], &reftables[1]),  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ExtensionRange", 4, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[8], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[16]),&reftables[2], &reftables[3]),  UPB_MSGDEF_INIT("google.protobuf.EnumDescriptorProto", 11, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[11], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[20]),&reftables[4], &reftables[5]),  UPB_MSGDEF_INIT("google.protobuf.EnumOptions", 7, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[0], &arrays[15], 8, 1), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[24]),&reftables[6], &reftables[7]),  UPB_MSGDEF_INIT("google.protobuf.EnumValueDescriptorProto", 8, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[23], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[28]),&reftables[8], &reftables[9]),  UPB_MSGDEF_INIT("google.protobuf.EnumValueOptions", 6, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[2], &arrays[27], 4, 0), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[32]),&reftables[10], &reftables[11]),  UPB_MSGDEF_INIT("google.protobuf.FieldDescriptorProto", 19, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[31], 9, 8), UPB_STRTABLE_INIT(8, 15, UPB_CTYPE_PTR, 4, &strentries[36]),&reftables[12], &reftables[13]),  UPB_MSGDEF_INIT("google.protobuf.FieldOptions", 14, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[4], &arrays[40], 32, 6), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[52]),&reftables[14], &reftables[15]),  UPB_MSGDEF_INIT("google.protobuf.FileDescriptorProto", 39, 6, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[72], 12, 11), UPB_STRTABLE_INIT(11, 15, UPB_CTYPE_PTR, 4, &strentries[68]),&reftables[16], &reftables[17]),  UPB_MSGDEF_INIT("google.protobuf.FileDescriptorSet", 6, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[84], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[84]),&reftables[18], &reftables[19]),  UPB_MSGDEF_INIT("google.protobuf.FileOptions", 21, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[6], &arrays[86], 64, 9), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[88]),&reftables[20], &reftables[21]),  UPB_MSGDEF_INIT("google.protobuf.MessageOptions", 8, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[8], &arrays[150], 16, 2), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[104]),&reftables[22], &reftables[23]),  UPB_MSGDEF_INIT("google.protobuf.MethodDescriptorProto", 13, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[166], 5, 4), UPB_STRTABLE_INIT(4, 7, UPB_CTYPE_PTR, 3, &strentries[108]),&reftables[24], &reftables[25]),  UPB_MSGDEF_INIT("google.protobuf.MethodOptions", 6, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[10], &arrays[171], 4, 0), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[116]),&reftables[26], &reftables[27]),  UPB_MSGDEF_INIT("google.protobuf.ServiceDescriptorProto", 11, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[175], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[120]),&reftables[28], &reftables[29]),  UPB_MSGDEF_INIT("google.protobuf.ServiceOptions", 6, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[12], &arrays[179], 4, 0), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[124]),&reftables[30], &reftables[31]),  UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo", 6, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[183], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[128]),&reftables[32], &reftables[33]),  UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo.Location", 14, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[185], 5, 4), UPB_STRTABLE_INIT(4, 7, UPB_CTYPE_PTR, 3, &strentries[132]),&reftables[34], &reftables[35]),  UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption", 18, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[190], 9, 7), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[140]),&reftables[36], &reftables[37]),  UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption.NamePart", 6, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[199], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[156]),&reftables[38], &reftables[39]),};static const upb_fielddef fields[81] = {  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "aggregate_value", 8, &msgs[18], NULL, 15, 6, {0},&reftables[40], &reftables[41]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "allow_alias", 2, &msgs[3], NULL, 6, 1, {0},&reftables[42], &reftables[43]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_generic_services", 16, &msgs[10], NULL, 17, 6, {0},&reftables[44], &reftables[45]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "ctype", 1, &msgs[7], UPB_UPCAST(&enums[2]), 6, 1, {0},&reftables[46], &reftables[47]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "default_value", 7, &msgs[6], NULL, 16, 7, {0},&reftables[48], &reftables[49]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "dependency", 3, &msgs[8], NULL, 30, 8, {0},&reftables[50], &reftables[51]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[7], NULL, 8, 3, {0},&reftables[52], &reftables[53]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_DOUBLE, 0, false, false, false, false, "double_value", 6, &msgs[18], NULL, 11, 4, {0},&reftables[54], &reftables[55]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[1], NULL, 3, 1, {0},&reftables[56], &reftables[57]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 4, &msgs[0], UPB_UPCAST(&msgs[2]), 16, 2, {0},&reftables[58], &reftables[59]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 5, &msgs[8], UPB_UPCAST(&msgs[2]), 13, 1, {0},&reftables[60], &reftables[61]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "experimental_map_key", 9, &msgs[7], NULL, 10, 5, {0},&reftables[62], &reftables[63]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "extendee", 2, &msgs[6], NULL, 7, 2, {0},&reftables[64], &reftables[65]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 7, &msgs[8], UPB_UPCAST(&msgs[6]), 19, 3, {0},&reftables[66], &reftables[67]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 6, &msgs[0], UPB_UPCAST(&msgs[6]), 22, 4, {0},&reftables[68], &reftables[69]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension_range", 5, &msgs[0], UPB_UPCAST(&msgs[1]), 19, 3, {0},&reftables[70], &reftables[71]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "field", 2, &msgs[0], UPB_UPCAST(&msgs[6]), 10, 0, {0},&reftables[72], &reftables[73]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "file", 1, &msgs[9], UPB_UPCAST(&msgs[8]), 5, 0, {0},&reftables[74], &reftables[75]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "go_package", 11, &msgs[10], NULL, 14, 5, {0},&reftables[76], &reftables[77]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "identifier_value", 3, &msgs[18], NULL, 6, 1, {0},&reftables[78], &reftables[79]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "input_type", 2, &msgs[12], NULL, 7, 2, {0},&reftables[80], &reftables[81]),  UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_BOOL, 0, false, false, false, false, "is_extension", 2, &msgs[19], NULL, 5, 1, {0},&reftables[82], &reftables[83]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generate_equals_and_hash", 20, &msgs[10], NULL, 20, 9, {0},&reftables[84], &reftables[85]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generic_services", 17, &msgs[10], NULL, 18, 7, {0},&reftables[86], &reftables[87]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_multiple_files", 10, &msgs[10], NULL, 13, 4, {0},&reftables[88], &reftables[89]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_outer_classname", 8, &msgs[10], NULL, 9, 2, {0},&reftables[90], &reftables[91]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_package", 1, &msgs[10], NULL, 6, 1, {0},&reftables[92], &reftables[93]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "label", 4, &msgs[6], UPB_UPCAST(&enums[0]), 11, 4, {0},&reftables[94], &reftables[95]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "lazy", 5, &msgs[7], NULL, 9, 4, {0},&reftables[96], &reftables[97]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "leading_comments", 3, &msgs[17], NULL, 8, 2, {0},&reftables[98], &reftables[99]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "location", 1, &msgs[16], UPB_UPCAST(&msgs[17]), 5, 0, {0},&reftables[100], &reftables[101]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "message_set_wire_format", 1, &msgs[11], NULL, 6, 1, {0},&reftables[102], &reftables[103]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "message_type", 4, &msgs[8], UPB_UPCAST(&msgs[0]), 10, 0, {0},&reftables[104], &reftables[105]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "method", 2, &msgs[14], UPB_UPCAST(&msgs[12]), 6, 0, {0},&reftables[106], &reftables[107]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[8], NULL, 22, 6, {0},&reftables[108], &reftables[109]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[14], NULL, 8, 2, {0},&reftables[110], &reftables[111]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "name", 2, &msgs[18], UPB_UPCAST(&msgs[19]), 5, 0, {0},&reftables[112], &reftables[113]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[4], NULL, 4, 1, {0},&reftables[114], &reftables[115]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[0], NULL, 24, 6, {0},&reftables[116], &reftables[117]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[12], NULL, 4, 1, {0},&reftables[118], &reftables[119]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[2], NULL, 8, 2, {0},&reftables[120], &reftables[121]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[6], NULL, 4, 1, {0},&reftables[122], &reftables[123]),  UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_STRING, 0, false, false, false, false, "name_part", 1, &msgs[19], NULL, 2, 0, {0},&reftables[124], &reftables[125]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT64, UPB_INTFMT_VARIABLE, false, false, false, false, "negative_int_value", 5, &msgs[18], NULL, 10, 3, {0},&reftables[126], &reftables[127]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "nested_type", 3, &msgs[0], UPB_UPCAST(&msgs[0]), 13, 1, {0},&reftables[128], &reftables[129]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "no_standard_descriptor_accessor", 2, &msgs[11], NULL, 7, 2, {0},&reftables[130], &reftables[131]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 3, &msgs[6], NULL, 10, 3, {0},&reftables[132], &reftables[133]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 2, &msgs[4], NULL, 7, 2, {0},&reftables[134], &reftables[135]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "optimize_for", 9, &msgs[10], UPB_UPCAST(&enums[3]), 12, 3, {0},&reftables[136], &reftables[137]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], UPB_UPCAST(&msgs[11]), 23, 5, {0},&reftables[138], &reftables[139]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[2], UPB_UPCAST(&msgs[3]), 7, 1, {0},&reftables[140], &reftables[141]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[6], UPB_UPCAST(&msgs[7]), 3, 0, {0},&reftables[142], &reftables[143]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[4], UPB_UPCAST(&msgs[5]), 3, 0, {0},&reftables[144], &reftables[145]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[8], UPB_UPCAST(&msgs[10]), 20, 4, {0},&reftables[146], &reftables[147]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[14], UPB_UPCAST(&msgs[15]), 7, 1, {0},&reftables[148], &reftables[149]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[12], UPB_UPCAST(&msgs[13]), 3, 0, {0},&reftables[150], &reftables[151]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "output_type", 3, &msgs[12], NULL, 10, 3, {0},&reftables[152], &reftables[153]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "package", 2, &msgs[8], NULL, 25, 7, {0},&reftables[154], &reftables[155]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "packed", 2, &msgs[7], NULL, 7, 2, {0},&reftables[156], &reftables[157]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "path", 1, &msgs[17], NULL, 4, 0, {0},&reftables[158], &reftables[159]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_UINT64, UPB_INTFMT_VARIABLE, false, false, false, false, "positive_int_value", 4, &msgs[18], NULL, 9, 2, {0},&reftables[160], &reftables[161]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "public_dependency", 10, &msgs[8], NULL, 35, 9, {0},&reftables[162], &reftables[163]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "py_generic_services", 18, &msgs[10], NULL, 19, 8, {0},&reftables[164], &reftables[165]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[8], UPB_UPCAST(&msgs[14]), 16, 2, {0},&reftables[166], &reftables[167]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[8], UPB_UPCAST(&msgs[16]), 21, 5, {0},&reftables[168], &reftables[169]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "span", 2, &msgs[17], NULL, 7, 1, {0},&reftables[170], &reftables[171]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[1], NULL, 2, 0, {0},&reftables[172], &reftables[173]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BYTES, 0, false, false, false, false, "string_value", 7, &msgs[18], NULL, 12, 5, {0},&reftables[174], &reftables[175]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "trailing_comments", 4, &msgs[17], NULL, 11, 3, {0},&reftables[176], &reftables[177]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[6], UPB_UPCAST(&enums[1]), 12, 5, {0},&reftables[178], &reftables[179]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "type_name", 6, &msgs[6], NULL, 13, 6, {0},&reftables[180], &reftables[181]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[5], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[182], &reftables[183]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[15], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[184], &reftables[185]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[3], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[186], &reftables[187]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[13], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[188], &reftables[189]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[10], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[190], &reftables[191]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[192], &reftables[193]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[7], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[194], &reftables[195]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[2], UPB_UPCAST(&msgs[4]), 6, 0, {0},&reftables[196], &reftables[197]),  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "weak", 10, &msgs[7], NULL, 13, 6, {0},&reftables[198], &reftables[199]),  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "weak_dependency", 11, &msgs[8], NULL, 38, 10, {0},&reftables[200], &reftables[201]),};static const upb_enumdef enums[4] = {  UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Label", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[160]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[202], 4, 3), 0, &reftables[202], &reftables[203]),  UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Type", UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_INT32, 5, &strentries[164]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[206], 19, 18), 0, &reftables[204], &reftables[205]),  UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.CType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[196]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[225], 3, 3), 0, &reftables[206], &reftables[207]),  UPB_ENUMDEF_INIT("google.protobuf.FileOptions.OptimizeMode", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[200]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[228], 4, 3), 0, &reftables[208], &reftables[209]),};static const upb_tabent strentries[236] = {  {UPB_TABKEY_STR("extension"), UPB_VALUE_INIT_CONSTPTR(&fields[14]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[38]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("field"), UPB_VALUE_INIT_CONSTPTR(&fields[16]), NULL},  {UPB_TABKEY_STR("extension_range"), UPB_VALUE_INIT_CONSTPTR(&fields[15]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("nested_type"), UPB_VALUE_INIT_CONSTPTR(&fields[44]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[49]), NULL},  {UPB_TABKEY_STR("enum_type"), UPB_VALUE_INIT_CONSTPTR(&fields[9]), &strentries[14]},  {UPB_TABKEY_STR("start"), UPB_VALUE_INIT_CONSTPTR(&fields[66]), NULL},  {UPB_TABKEY_STR("end"), UPB_VALUE_INIT_CONSTPTR(&fields[8]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("value"), UPB_VALUE_INIT_CONSTPTR(&fields[78]), NULL},  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[50]), NULL},  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[40]), &strentries[22]},  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[73]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("allow_alias"), UPB_VALUE_INIT_CONSTPTR(&fields[1]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("number"), UPB_VALUE_INIT_CONSTPTR(&fields[47]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[52]), NULL},  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[37]), &strentries[30]},  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[71]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("label"), UPB_VALUE_INIT_CONSTPTR(&fields[27]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[41]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("number"), UPB_VALUE_INIT_CONSTPTR(&fields[46]), &strentries[49]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("type_name"), UPB_VALUE_INIT_CONSTPTR(&fields[70]), NULL},  {UPB_TABKEY_STR("extendee"), UPB_VALUE_INIT_CONSTPTR(&fields[12]), NULL},  {UPB_TABKEY_STR("type"), UPB_VALUE_INIT_CONSTPTR(&fields[69]), &strentries[48]},  {UPB_TABKEY_STR("default_value"), UPB_VALUE_INIT_CONSTPTR(&fields[4]), NULL},  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[51]), NULL},  {UPB_TABKEY_STR("experimental_map_key"), UPB_VALUE_INIT_CONSTPTR(&fields[11]), &strentries[67]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("weak"), UPB_VALUE_INIT_CONSTPTR(&fields[79]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("packed"), UPB_VALUE_INIT_CONSTPTR(&fields[58]), NULL},  {UPB_TABKEY_STR("lazy"), UPB_VALUE_INIT_CONSTPTR(&fields[28]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("ctype"), UPB_VALUE_INIT_CONSTPTR(&fields[3]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("deprecated"), UPB_VALUE_INIT_CONSTPTR(&fields[6]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[77]), NULL},  {UPB_TABKEY_STR("extension"), UPB_VALUE_INIT_CONSTPTR(&fields[13]), NULL},  {UPB_TABKEY_STR("weak_dependency"), UPB_VALUE_INIT_CONSTPTR(&fields[80]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[34]), NULL},  {UPB_TABKEY_STR("service"), UPB_VALUE_INIT_CONSTPTR(&fields[63]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("source_code_info"), UPB_VALUE_INIT_CONSTPTR(&fields[64]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("dependency"), UPB_VALUE_INIT_CONSTPTR(&fields[5]), NULL},  {UPB_TABKEY_STR("message_type"), UPB_VALUE_INIT_CONSTPTR(&fields[32]), NULL},  {UPB_TABKEY_STR("package"), UPB_VALUE_INIT_CONSTPTR(&fields[57]), NULL},  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[53]), &strentries[82]},  {UPB_TABKEY_STR("enum_type"), UPB_VALUE_INIT_CONSTPTR(&fields[10]), NULL},  {UPB_TABKEY_STR("public_dependency"), UPB_VALUE_INIT_CONSTPTR(&fields[61]), &strentries[81]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("file"), UPB_VALUE_INIT_CONSTPTR(&fields[17]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[75]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("cc_generic_services"), UPB_VALUE_INIT_CONSTPTR(&fields[2]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("java_multiple_files"), UPB_VALUE_INIT_CONSTPTR(&fields[24]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("java_generic_services"), UPB_VALUE_INIT_CONSTPTR(&fields[23]), &strentries[102]},  {UPB_TABKEY_STR("java_generate_equals_and_hash"), UPB_VALUE_INIT_CONSTPTR(&fields[22]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("go_package"), UPB_VALUE_INIT_CONSTPTR(&fields[18]), NULL},  {UPB_TABKEY_STR("java_package"), UPB_VALUE_INIT_CONSTPTR(&fields[26]), NULL},  {UPB_TABKEY_STR("optimize_for"), UPB_VALUE_INIT_CONSTPTR(&fields[48]), NULL},  {UPB_TABKEY_STR("py_generic_services"), UPB_VALUE_INIT_CONSTPTR(&fields[62]), NULL},  {UPB_TABKEY_STR("java_outer_classname"), UPB_VALUE_INIT_CONSTPTR(&fields[25]), NULL},  {UPB_TABKEY_STR("message_set_wire_format"), UPB_VALUE_INIT_CONSTPTR(&fields[31]), &strentries[106]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[76]), NULL},  {UPB_TABKEY_STR("no_standard_descriptor_accessor"), UPB_VALUE_INIT_CONSTPTR(&fields[45]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[39]), NULL},  {UPB_TABKEY_STR("input_type"), UPB_VALUE_INIT_CONSTPTR(&fields[20]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("output_type"), UPB_VALUE_INIT_CONSTPTR(&fields[56]), NULL},  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[55]), NULL},  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[74]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[54]), &strentries[122]},  {UPB_TABKEY_STR("method"), UPB_VALUE_INIT_CONSTPTR(&fields[33]), NULL},  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[35]), &strentries[121]},  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[72]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("location"), UPB_VALUE_INIT_CONSTPTR(&fields[30]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("span"), UPB_VALUE_INIT_CONSTPTR(&fields[65]), &strentries[139]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("trailing_comments"), UPB_VALUE_INIT_CONSTPTR(&fields[68]), NULL},  {UPB_TABKEY_STR("leading_comments"), UPB_VALUE_INIT_CONSTPTR(&fields[29]), &strentries[137]},  {UPB_TABKEY_STR("path"), UPB_VALUE_INIT_CONSTPTR(&fields[59]), NULL},  {UPB_TABKEY_STR("double_value"), UPB_VALUE_INIT_CONSTPTR(&fields[7]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[36]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("negative_int_value"), UPB_VALUE_INIT_CONSTPTR(&fields[43]), NULL},  {UPB_TABKEY_STR("aggregate_value"), UPB_VALUE_INIT_CONSTPTR(&fields[0]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("positive_int_value"), UPB_VALUE_INIT_CONSTPTR(&fields[60]), NULL},  {UPB_TABKEY_STR("identifier_value"), UPB_VALUE_INIT_CONSTPTR(&fields[19]), NULL},  {UPB_TABKEY_STR("string_value"), UPB_VALUE_INIT_CONSTPTR(&fields[67]), &strentries[154]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("is_extension"), UPB_VALUE_INIT_CONSTPTR(&fields[21]), NULL},  {UPB_TABKEY_STR("name_part"), UPB_VALUE_INIT_CONSTPTR(&fields[42]), NULL},  {UPB_TABKEY_STR("LABEL_REQUIRED"), UPB_VALUE_INIT_INT32(2), &strentries[162]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("LABEL_REPEATED"), UPB_VALUE_INIT_INT32(3), NULL},  {UPB_TABKEY_STR("LABEL_OPTIONAL"), UPB_VALUE_INIT_INT32(1), NULL},  {UPB_TABKEY_STR("TYPE_FIXED64"), UPB_VALUE_INIT_INT32(6), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("TYPE_STRING"), UPB_VALUE_INIT_INT32(9), NULL},  {UPB_TABKEY_STR("TYPE_FLOAT"), UPB_VALUE_INIT_INT32(2), &strentries[193]},  {UPB_TABKEY_STR("TYPE_DOUBLE"), UPB_VALUE_INIT_INT32(1), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("TYPE_INT32"), UPB_VALUE_INIT_INT32(5), NULL},  {UPB_TABKEY_STR("TYPE_SFIXED32"), UPB_VALUE_INIT_INT32(15), NULL},  {UPB_TABKEY_STR("TYPE_FIXED32"), UPB_VALUE_INIT_INT32(7), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("TYPE_MESSAGE"), UPB_VALUE_INIT_INT32(11), &strentries[194]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("TYPE_INT64"), UPB_VALUE_INIT_INT32(3), &strentries[191]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("TYPE_ENUM"), UPB_VALUE_INIT_INT32(14), NULL},  {UPB_TABKEY_STR("TYPE_UINT32"), UPB_VALUE_INIT_INT32(13), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("TYPE_UINT64"), UPB_VALUE_INIT_INT32(4), &strentries[190]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("TYPE_SFIXED64"), UPB_VALUE_INIT_INT32(16), NULL},  {UPB_TABKEY_STR("TYPE_BYTES"), UPB_VALUE_INIT_INT32(12), NULL},  {UPB_TABKEY_STR("TYPE_SINT64"), UPB_VALUE_INIT_INT32(18), NULL},  {UPB_TABKEY_STR("TYPE_BOOL"), UPB_VALUE_INIT_INT32(8), NULL},  {UPB_TABKEY_STR("TYPE_GROUP"), UPB_VALUE_INIT_INT32(10), NULL},  {UPB_TABKEY_STR("TYPE_SINT32"), UPB_VALUE_INIT_INT32(17), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("CORD"), UPB_VALUE_INIT_INT32(1), NULL},  {UPB_TABKEY_STR("STRING"), UPB_VALUE_INIT_INT32(0), &strentries[197]},  {UPB_TABKEY_STR("STRING_PIECE"), UPB_VALUE_INIT_INT32(2), NULL},  {UPB_TABKEY_STR("CODE_SIZE"), UPB_VALUE_INIT_INT32(2), NULL},  {UPB_TABKEY_STR("SPEED"), UPB_VALUE_INIT_INT32(1), &strentries[203]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("LITE_RUNTIME"), UPB_VALUE_INIT_INT32(3), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("google.protobuf.SourceCodeInfo.Location"), UPB_VALUE_INIT_CONSTPTR(&msgs[17]), NULL},  {UPB_TABKEY_STR("google.protobuf.UninterpretedOption"), UPB_VALUE_INIT_CONSTPTR(&msgs[18]), NULL},  {UPB_TABKEY_STR("google.protobuf.FileDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[8]), NULL},  {UPB_TABKEY_STR("google.protobuf.MethodDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[12]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("google.protobuf.EnumValueOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[5]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("google.protobuf.DescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[0]), &strentries[228]},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("google.protobuf.SourceCodeInfo"), UPB_VALUE_INIT_CONSTPTR(&msgs[16]), NULL},  {UPB_TABKEY_STR("google.protobuf.FieldDescriptorProto.Type"), UPB_VALUE_INIT_CONSTPTR(&enums[1]), NULL},  {UPB_TABKEY_STR("google.protobuf.DescriptorProto.ExtensionRange"), UPB_VALUE_INIT_CONSTPTR(&msgs[1]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_STR("google.protobuf.EnumValueDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[4]), NULL},  {UPB_TABKEY_STR("google.protobuf.FieldOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[7]), NULL},  {UPB_TABKEY_STR("google.protobuf.FileOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[10]), NULL},  {UPB_TABKEY_STR("google.protobuf.EnumDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[2]), &strentries[233]},  {UPB_TABKEY_STR("google.protobuf.FieldDescriptorProto.Label"), UPB_VALUE_INIT_CONSTPTR(&enums[0]), NULL},  {UPB_TABKEY_STR("google.protobuf.ServiceDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[14]), NULL},  {UPB_TABKEY_STR("google.protobuf.FieldOptions.CType"), UPB_VALUE_INIT_CONSTPTR(&enums[2]), &strentries[229]},  {UPB_TABKEY_STR("google.protobuf.FileDescriptorSet"), UPB_VALUE_INIT_CONSTPTR(&msgs[9]), &strentries[235]},  {UPB_TABKEY_STR("google.protobuf.EnumOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[3]), NULL},  {UPB_TABKEY_STR("google.protobuf.FieldDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[6]), NULL},  {UPB_TABKEY_STR("google.protobuf.FileOptions.OptimizeMode"), UPB_VALUE_INIT_CONSTPTR(&enums[3]), &strentries[221]},  {UPB_TABKEY_STR("google.protobuf.ServiceOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[15]), NULL},  {UPB_TABKEY_STR("google.protobuf.MessageOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[11]), NULL},  {UPB_TABKEY_STR("google.protobuf.MethodOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[13]), &strentries[226]},  {UPB_TABKEY_STR("google.protobuf.UninterpretedOption.NamePart"), UPB_VALUE_INIT_CONSTPTR(&msgs[19]), NULL},};static const upb_tabent intentries[14] = {  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[73]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[71]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[77]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[75]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[76]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[74]), NULL},  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[72]), NULL},};static const _upb_value arrays[232] = {  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[38]),  UPB_VALUE_INIT_CONSTPTR(&fields[16]),  UPB_VALUE_INIT_CONSTPTR(&fields[44]),  UPB_VALUE_INIT_CONSTPTR(&fields[9]),  UPB_VALUE_INIT_CONSTPTR(&fields[15]),  UPB_VALUE_INIT_CONSTPTR(&fields[14]),  UPB_VALUE_INIT_CONSTPTR(&fields[49]),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[66]),  UPB_VALUE_INIT_CONSTPTR(&fields[8]),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[40]),  UPB_VALUE_INIT_CONSTPTR(&fields[78]),  UPB_VALUE_INIT_CONSTPTR(&fields[50]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[1]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[37]),  UPB_VALUE_INIT_CONSTPTR(&fields[47]),  UPB_VALUE_INIT_CONSTPTR(&fields[52]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[41]),  UPB_VALUE_INIT_CONSTPTR(&fields[12]),  UPB_VALUE_INIT_CONSTPTR(&fields[46]),  UPB_VALUE_INIT_CONSTPTR(&fields[27]),  UPB_VALUE_INIT_CONSTPTR(&fields[69]),  UPB_VALUE_INIT_CONSTPTR(&fields[70]),  UPB_VALUE_INIT_CONSTPTR(&fields[4]),  UPB_VALUE_INIT_CONSTPTR(&fields[51]),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[3]),  UPB_VALUE_INIT_CONSTPTR(&fields[58]),  UPB_VALUE_INIT_CONSTPTR(&fields[6]),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[28]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[11]),  UPB_VALUE_INIT_CONSTPTR(&fields[79]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[34]),  UPB_VALUE_INIT_CONSTPTR(&fields[57]),  UPB_VALUE_INIT_CONSTPTR(&fields[5]),  UPB_VALUE_INIT_CONSTPTR(&fields[32]),  UPB_VALUE_INIT_CONSTPTR(&fields[10]),  UPB_VALUE_INIT_CONSTPTR(&fields[63]),  UPB_VALUE_INIT_CONSTPTR(&fields[13]),  UPB_VALUE_INIT_CONSTPTR(&fields[53]),  UPB_VALUE_INIT_CONSTPTR(&fields[64]),  UPB_VALUE_INIT_CONSTPTR(&fields[61]),  UPB_VALUE_INIT_CONSTPTR(&fields[80]),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[17]),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[26]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[25]),  UPB_VALUE_INIT_CONSTPTR(&fields[48]),  UPB_VALUE_INIT_CONSTPTR(&fields[24]),  UPB_VALUE_INIT_CONSTPTR(&fields[18]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[2]),  UPB_VALUE_INIT_CONSTPTR(&fields[23]),  UPB_VALUE_INIT_CONSTPTR(&fields[62]),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[22]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[31]),  UPB_VALUE_INIT_CONSTPTR(&fields[45]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[39]),  UPB_VALUE_INIT_CONSTPTR(&fields[20]),  UPB_VALUE_INIT_CONSTPTR(&fields[56]),  UPB_VALUE_INIT_CONSTPTR(&fields[55]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[35]),  UPB_VALUE_INIT_CONSTPTR(&fields[33]),  UPB_VALUE_INIT_CONSTPTR(&fields[54]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[30]),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[59]),  UPB_VALUE_INIT_CONSTPTR(&fields[65]),  UPB_VALUE_INIT_CONSTPTR(&fields[29]),  UPB_VALUE_INIT_CONSTPTR(&fields[68]),  UPB_ARRAY_EMPTYENT,  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[36]),  UPB_VALUE_INIT_CONSTPTR(&fields[19]),  UPB_VALUE_INIT_CONSTPTR(&fields[60]),  UPB_VALUE_INIT_CONSTPTR(&fields[43]),  UPB_VALUE_INIT_CONSTPTR(&fields[7]),  UPB_VALUE_INIT_CONSTPTR(&fields[67]),  UPB_VALUE_INIT_CONSTPTR(&fields[0]),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR(&fields[42]),  UPB_VALUE_INIT_CONSTPTR(&fields[21]),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR("LABEL_OPTIONAL"),  UPB_VALUE_INIT_CONSTPTR("LABEL_REQUIRED"),  UPB_VALUE_INIT_CONSTPTR("LABEL_REPEATED"),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR("TYPE_DOUBLE"),  UPB_VALUE_INIT_CONSTPTR("TYPE_FLOAT"),  UPB_VALUE_INIT_CONSTPTR("TYPE_INT64"),  UPB_VALUE_INIT_CONSTPTR("TYPE_UINT64"),  UPB_VALUE_INIT_CONSTPTR("TYPE_INT32"),  UPB_VALUE_INIT_CONSTPTR("TYPE_FIXED64"),  UPB_VALUE_INIT_CONSTPTR("TYPE_FIXED32"),  UPB_VALUE_INIT_CONSTPTR("TYPE_BOOL"),  UPB_VALUE_INIT_CONSTPTR("TYPE_STRING"),  UPB_VALUE_INIT_CONSTPTR("TYPE_GROUP"),  UPB_VALUE_INIT_CONSTPTR("TYPE_MESSAGE"),  UPB_VALUE_INIT_CONSTPTR("TYPE_BYTES"),  UPB_VALUE_INIT_CONSTPTR("TYPE_UINT32"),  UPB_VALUE_INIT_CONSTPTR("TYPE_ENUM"),  UPB_VALUE_INIT_CONSTPTR("TYPE_SFIXED32"),  UPB_VALUE_INIT_CONSTPTR("TYPE_SFIXED64"),  UPB_VALUE_INIT_CONSTPTR("TYPE_SINT32"),  UPB_VALUE_INIT_CONSTPTR("TYPE_SINT64"),  UPB_VALUE_INIT_CONSTPTR("STRING"),  UPB_VALUE_INIT_CONSTPTR("CORD"),  UPB_VALUE_INIT_CONSTPTR("STRING_PIECE"),  UPB_ARRAY_EMPTYENT,  UPB_VALUE_INIT_CONSTPTR("SPEED"),  UPB_VALUE_INIT_CONSTPTR("CODE_SIZE"),  UPB_VALUE_INIT_CONSTPTR("LITE_RUNTIME"),};static const upb_symtab symtab = UPB_SYMTAB_INIT(UPB_STRTABLE_INIT(24, 31, UPB_CTYPE_PTR, 5, &strentries[204]), &reftables[210], &reftables[211]);const upb_symtab *upbdefs_google_protobuf_descriptor(const void *owner) {  upb_symtab_ref(&symtab, owner);  return &symtab;}#ifdef UPB_DEBUG_REFSstatic upb_inttable reftables[212] = {  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),};#endif/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2008-2009 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> * * XXX: The routines in this file that consume a string do not currently * support having the string span buffers.  In the future, as upb_sink and * its buffering/sharing functionality evolve there should be an easy and * idiomatic way of correctly handling this case.  For now, we accept this * limitation since we currently only parse descriptors from single strings. */#include <errno.h>#include <stdlib.h>#include <string.h>static char *upb_strndup(const char *buf, size_t n) {  char *ret = malloc(n + 1);  if (!ret) return NULL;  memcpy(ret, buf, n);  ret[n] = '\0';  return ret;}// Returns a newly allocated string that joins input strings together, for// example://   join("Foo.Bar", "Baz") -> "Foo.Bar.Baz"//   join("", "Baz") -> "Baz"// Caller owns a ref on the returned string.static char *upb_join(const char *base, const char *name) {  if (!base || strlen(base) == 0) {    return upb_strdup(name);  } else {    char *ret = malloc(strlen(base) + strlen(name) + 2);    ret[0] = '\0';    strcat(ret, base);    strcat(ret, ".");    strcat(ret, name);    return ret;  }}/* upb_deflist ****************************************************************/void upb_deflist_init(upb_deflist *l) {  l->size = 0;  l->defs = NULL;  l->len = 0;  l->owned = true;}void upb_deflist_uninit(upb_deflist *l) {  if (l->owned)    for(size_t i = 0; i < l->len; i++)      upb_def_unref(l->defs[i], l);  free(l->defs);}bool upb_deflist_push(upb_deflist *l, upb_def *d) {  if(++l->len >= l->size) {    size_t new_size = UPB_MAX(l->size, 4);    new_size *= 2;    l->defs = realloc(l->defs, new_size * sizeof(void *));    if (!l->defs) return false;    l->size = new_size;  }  l->defs[l->len - 1] = d;  return true;}void upb_deflist_donaterefs(upb_deflist *l, void *owner) {  assert(l->owned);  for (size_t i = 0; i < l->len; i++)    upb_def_donateref(l->defs[i], l, owner);  l->owned = false;}static upb_def *upb_deflist_last(upb_deflist *l) {  return l->defs[l->len-1];}// Qualify the defname for all defs starting with offset "start" with "str".static void upb_deflist_qualify(upb_deflist *l, char *str, int32_t start) {  for (uint32_t i = start; i < l->len; i++) {    upb_def *def = l->defs[i];    char *name = upb_join(str, upb_def_fullname(def));    upb_def_setfullname(def, name, NULL);    free(name);  }}/* upb_descreader  ************************************************************/void upb_descreader_init(upb_descreader *r, const upb_handlers *handlers,                         upb_status *status) {  UPB_UNUSED(status);  upb_deflist_init(&r->defs);  upb_sink_reset(upb_descreader_input(r), handlers, r);  r->stack_len = 0;  r->name = NULL;  r->default_string = NULL;}void upb_descreader_uninit(upb_descreader *r) {  free(r->name);  upb_deflist_uninit(&r->defs);  free(r->default_string);  while (r->stack_len > 0) {    upb_descreader_frame *f = &r->stack[--r->stack_len];    free(f->name);  }}upb_def **upb_descreader_getdefs(upb_descreader *r, void *owner, int *n) {  *n = r->defs.len;  upb_deflist_donaterefs(&r->defs, owner);  return r->defs.defs;}upb_sink *upb_descreader_input(upb_descreader *r) {  return &r->sink;}static upb_msgdef *upb_descreader_top(upb_descreader *r) {  assert(r->stack_len > 1);  int index = r->stack[r->stack_len-1].start - 1;  assert(index >= 0);  return upb_downcast_msgdef_mutable(r->defs.defs[index]);}static upb_def *upb_descreader_last(upb_descreader *r) {  return upb_deflist_last(&r->defs);}// Start/end handlers for FileDescriptorProto and DescriptorProto (the two// entities that have names and can contain sub-definitions.void upb_descreader_startcontainer(upb_descreader *r) {  upb_descreader_frame *f = &r->stack[r->stack_len++];  f->start = r->defs.len;  f->name = NULL;}void upb_descreader_endcontainer(upb_descreader *r) {  upb_descreader_frame *f = &r->stack[--r->stack_len];  upb_deflist_qualify(&r->defs, f->name, f->start);  free(f->name);  f->name = NULL;}void upb_descreader_setscopename(upb_descreader *r, char *str) {  upb_descreader_frame *f = &r->stack[r->stack_len-1];  free(f->name);  f->name = str;}// Handlers for google.protobuf.FileDescriptorProto.static bool file_startmsg(void *r, const void *hd) {  UPB_UNUSED(hd);  upb_descreader_startcontainer(r);  return true;}static bool file_endmsg(void *closure, const void *hd, upb_status *status) {  UPB_UNUSED(hd);  UPB_UNUSED(status);  upb_descreader *r = closure;  upb_descreader_endcontainer(r);  return true;}static size_t file_onpackage(void *closure, const void *hd, const char *buf,                             size_t n, const upb_bufhandle *handle) {  UPB_UNUSED(hd);  UPB_UNUSED(handle);  upb_descreader *r = closure;  // XXX: see comment at the top of the file.  upb_descreader_setscopename(r, upb_strndup(buf, n));  return n;}// Handlers for google.protobuf.EnumValueDescriptorProto.static bool enumval_startmsg(void *closure, const void *hd) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  r->saw_number = false;  r->saw_name = false;  return true;}static size_t enumval_onname(void *closure, const void *hd, const char *buf,                             size_t n, const upb_bufhandle *handle) {  UPB_UNUSED(hd);  UPB_UNUSED(handle);  upb_descreader *r = closure;  // XXX: see comment at the top of the file.  free(r->name);  r->name = upb_strndup(buf, n);  r->saw_name = true;  return n;}static bool enumval_onnumber(void *closure, const void *hd, int32_t val) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  r->number = val;  r->saw_number = true;  return true;}static bool enumval_endmsg(void *closure, const void *hd, upb_status *status) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  if(!r->saw_number || !r->saw_name) {    upb_status_seterrmsg(status, "Enum value missing name or number.");    return false;  }  upb_enumdef *e = upb_downcast_enumdef_mutable(upb_descreader_last(r));  upb_enumdef_addval(e, r->name, r->number, status);  free(r->name);  r->name = NULL;  return true;}// Handlers for google.protobuf.EnumDescriptorProto.static bool enum_startmsg(void *closure, const void *hd) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  upb_deflist_push(&r->defs, UPB_UPCAST(upb_enumdef_new(&r->defs)));  return true;}static bool enum_endmsg(void *closure, const void *hd, upb_status *status) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  upb_enumdef *e = upb_downcast_enumdef_mutable(upb_descreader_last(r));  if (upb_def_fullname(upb_descreader_last(r)) == NULL) {    upb_status_seterrmsg(status, "Enum had no name.");    return false;  }  if (upb_enumdef_numvals(e) == 0) {    upb_status_seterrmsg(status, "Enum had no values.");    return false;  }  return true;}static size_t enum_onname(void *closure, const void *hd, const char *buf,                          size_t n, const upb_bufhandle *handle) {  UPB_UNUSED(hd);  UPB_UNUSED(handle);  upb_descreader *r = closure;  // XXX: see comment at the top of the file.  char *fullname = upb_strndup(buf, n);  upb_def_setfullname(upb_descreader_last(r), fullname, NULL);  free(fullname);  return n;}// Handlers for google.protobuf.FieldDescriptorProtostatic bool field_startmsg(void *closure, const void *hd) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  r->f = upb_fielddef_new(&r->defs);  free(r->default_string);  r->default_string = NULL;  // fielddefs default to packed, but descriptors default to non-packed.  upb_fielddef_setpacked(r->f, false);  return true;}// Converts the default value in string "str" into "d".  Passes a ref on str.// Returns true on success.static bool parse_default(char *str, upb_fielddef *f) {  bool success = true;  char *end;  switch (upb_fielddef_type(f)) {    case UPB_TYPE_INT32: {      long val = strtol(str, &end, 0);      if (val > INT32_MAX || val < INT32_MIN || errno == ERANGE || *end)        success = false;      else        upb_fielddef_setdefaultint32(f, val);      break;    }    case UPB_TYPE_INT64: {      long long val = strtoll(str, &end, 0);      if (val > INT64_MAX || val < INT64_MIN || errno == ERANGE || *end)        success = false;      else        upb_fielddef_setdefaultint64(f, val);      break;    }    case UPB_TYPE_UINT32: {      long val = strtoul(str, &end, 0);      if (val > UINT32_MAX || errno == ERANGE || *end)        success = false;      else        upb_fielddef_setdefaultuint32(f, val);      break;    }    case UPB_TYPE_UINT64: {      unsigned long long val = strtoull(str, &end, 0);      if (val > UINT64_MAX || errno == ERANGE || *end)        success = false;      else        upb_fielddef_setdefaultuint64(f, val);      break;    }    case UPB_TYPE_DOUBLE: {      double val = strtod(str, &end);      if (errno == ERANGE || *end)        success = false;      else        upb_fielddef_setdefaultdouble(f, val);      break;    }    case UPB_TYPE_FLOAT: {      float val = strtof(str, &end);      if (errno == ERANGE || *end)        success = false;      else        upb_fielddef_setdefaultfloat(f, val);      break;    }    case UPB_TYPE_BOOL: {      if (strcmp(str, "false") == 0)        upb_fielddef_setdefaultbool(f, false);      else if (strcmp(str, "true") == 0)        upb_fielddef_setdefaultbool(f, true);      else        success = false;      break;    }    default: abort();  }  return success;}static bool field_endmsg(void *closure, const void *hd, upb_status *status) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  upb_fielddef *f = r->f;  // TODO: verify that all required fields were present.  assert(upb_fielddef_number(f) != 0);  assert(upb_fielddef_name(f) != NULL);  assert((upb_fielddef_subdefname(f) != NULL) == upb_fielddef_hassubdef(f));  if (r->default_string) {    if (upb_fielddef_issubmsg(f)) {      upb_status_seterrmsg(status, "Submessages cannot have defaults.");      return false;    }    if (upb_fielddef_isstring(f) || upb_fielddef_type(f) == UPB_TYPE_ENUM) {      upb_fielddef_setdefaultcstr(f, r->default_string, NULL);    } else {      if (r->default_string && !parse_default(r->default_string, f)) {        // We don't worry too much about giving a great error message since the        // compiler should have ensured this was correct.        upb_status_seterrmsg(status, "Error converting default value.");        return false;      }    }  }  return true;}static bool field_onlazy(void *closure, const void *hd, bool val) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  upb_fielddef_setlazy(r->f, val);  return true;}static bool field_onpacked(void *closure, const void *hd, bool val) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  upb_fielddef_setpacked(r->f, val);  return true;}static bool field_ontype(void *closure, const void *hd, int32_t val) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  upb_fielddef_setdescriptortype(r->f, val);  return true;}static bool field_onlabel(void *closure, const void *hd, int32_t val) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  upb_fielddef_setlabel(r->f, val);  return true;}static bool field_onnumber(void *closure, const void *hd, int32_t val) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  bool ok = upb_fielddef_setnumber(r->f, val, NULL);  UPB_ASSERT_VAR(ok, ok);  return true;}static size_t field_onname(void *closure, const void *hd, const char *buf,                           size_t n, const upb_bufhandle *handle) {  UPB_UNUSED(hd);  UPB_UNUSED(handle);  upb_descreader *r = closure;  // XXX: see comment at the top of the file.  char *name = upb_strndup(buf, n);  upb_fielddef_setname(r->f, name, NULL);  free(name);  return n;}static size_t field_ontypename(void *closure, const void *hd, const char *buf,                               size_t n, const upb_bufhandle *handle) {  UPB_UNUSED(hd);  UPB_UNUSED(handle);  upb_descreader *r = closure;  // XXX: see comment at the top of the file.  char *name = upb_strndup(buf, n);  upb_fielddef_setsubdefname(r->f, name, NULL);  free(name);  return n;}static size_t field_onextendee(void *closure, const void *hd, const char *buf,                               size_t n, const upb_bufhandle *handle) {  UPB_UNUSED(hd);  UPB_UNUSED(handle);  upb_descreader *r = closure;  // XXX: see comment at the top of the file.  char *name = upb_strndup(buf, n);  upb_fielddef_setcontainingtypename(r->f, name, NULL);  free(name);  return n;}static size_t field_ondefaultval(void *closure, const void *hd, const char *buf,                                 size_t n, const upb_bufhandle *handle) {  UPB_UNUSED(hd);  UPB_UNUSED(handle);  upb_descreader *r = closure;  // Have to convert from string to the correct type, but we might not know the  // type yet, so we save it as a string until the end of the field.  // XXX: see comment at the top of the file.  free(r->default_string);  r->default_string = upb_strndup(buf, n);  return n;}// Handlers for google.protobuf.DescriptorProto (representing a message).static bool msg_startmsg(void *closure, const void *hd) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  upb_deflist_push(&r->defs, UPB_UPCAST(upb_msgdef_new(&r->defs)));  upb_descreader_startcontainer(r);  return true;}static bool msg_endmsg(void *closure, const void *hd, upb_status *status) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  upb_msgdef *m = upb_descreader_top(r);  if(!upb_def_fullname(UPB_UPCAST(m))) {    upb_status_seterrmsg(status, "Encountered message with no name.");    return false;  }  upb_descreader_endcontainer(r);  return true;}static size_t msg_onname(void *closure, const void *hd, const char *buf,                         size_t n, const upb_bufhandle *handle) {  UPB_UNUSED(hd);  UPB_UNUSED(handle);  upb_descreader *r = closure;  upb_msgdef *m = upb_descreader_top(r);  // XXX: see comment at the top of the file.  char *name = upb_strndup(buf, n);  upb_def_setfullname(UPB_UPCAST(m), name, NULL);  upb_descreader_setscopename(r, name);  // Passes ownership of name.  return n;}static bool msg_onendfield(void *closure, const void *hd) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  upb_msgdef *m = upb_descreader_top(r);  upb_msgdef_addfield(m, r->f, &r->defs, NULL);  r->f = NULL;  return true;}static bool pushextension(void *closure, const void *hd) {  UPB_UNUSED(hd);  upb_descreader *r = closure;  assert(upb_fielddef_containingtypename(r->f));  upb_fielddef_setisextension(r->f, true);  upb_deflist_push(&r->defs, UPB_UPCAST(r->f));  r->f = NULL;  return true;}#define D(name) upbdefs_google_protobuf_ ## name(s)static void reghandlers(const void *closure, upb_handlers *h) {  const upb_symtab *s = closure;  const upb_msgdef *m = upb_handlers_msgdef(h);  if (m == D(DescriptorProto)) {    upb_handlers_setstartmsg(h, &msg_startmsg, NULL);    upb_handlers_setendmsg(h, &msg_endmsg, NULL);    upb_handlers_setstring(h, D(DescriptorProto_name), &msg_onname, NULL);    upb_handlers_setendsubmsg(h, D(DescriptorProto_field), &msg_onendfield,                              NULL);    upb_handlers_setendsubmsg(h, D(DescriptorProto_extension), &pushextension,                              NULL);  } else if (m == D(FileDescriptorProto)) {    upb_handlers_setstartmsg(h, &file_startmsg, NULL);    upb_handlers_setendmsg(h, &file_endmsg, NULL);    upb_handlers_setstring(h, D(FileDescriptorProto_package), &file_onpackage,                           NULL);    upb_handlers_setendsubmsg(h, D(FileDescriptorProto_extension), &pushextension,                              NULL);  } else if (m == D(EnumValueDescriptorProto)) {    upb_handlers_setstartmsg(h, &enumval_startmsg, NULL);    upb_handlers_setendmsg(h, &enumval_endmsg, NULL);    upb_handlers_setstring(h, D(EnumValueDescriptorProto_name), &enumval_onname, NULL);    upb_handlers_setint32(h, D(EnumValueDescriptorProto_number), &enumval_onnumber,                          NULL);  } else if (m == D(EnumDescriptorProto)) {    upb_handlers_setstartmsg(h, &enum_startmsg, NULL);    upb_handlers_setendmsg(h, &enum_endmsg, NULL);    upb_handlers_setstring(h, D(EnumDescriptorProto_name), &enum_onname, NULL);  } else if (m == D(FieldDescriptorProto)) {    upb_handlers_setstartmsg(h, &field_startmsg, NULL);    upb_handlers_setendmsg(h, &field_endmsg, NULL);    upb_handlers_setint32(h, D(FieldDescriptorProto_type), &field_ontype,                          NULL);    upb_handlers_setint32(h, D(FieldDescriptorProto_label), &field_onlabel,                          NULL);    upb_handlers_setint32(h, D(FieldDescriptorProto_number), &field_onnumber,                          NULL);    upb_handlers_setstring(h, D(FieldDescriptorProto_name), &field_onname,                           NULL);    upb_handlers_setstring(h, D(FieldDescriptorProto_type_name),                           &field_ontypename, NULL);    upb_handlers_setstring(h, D(FieldDescriptorProto_extendee),                           &field_onextendee, NULL);    upb_handlers_setstring(h, D(FieldDescriptorProto_default_value),                           &field_ondefaultval, NULL);  } else if (m == D(FieldOptions)) {    upb_handlers_setbool(h, D(FieldOptions_lazy), &field_onlazy, NULL);    upb_handlers_setbool(h, D(FieldOptions_packed), &field_onpacked, NULL);  }}#undef Dconst upb_handlers *upb_descreader_newhandlers(const void *owner) {  const upb_symtab *s = upbdefs_google_protobuf_descriptor(&s);  const upb_handlers *h = upb_handlers_newfrozen(      upbdefs_google_protobuf_FileDescriptorSet(s), owner, reghandlers, s);  upb_symtab_unref(s, &s);  return h;}/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2013 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> * * Code to compile a upb::Handlers into bytecode for decoding a protobuf * according to that specific schema and destination handlers. * * Compiling to bytecode is always the first step.  If we are using the * interpreted decoder we leave it as bytecode and interpret that.  If we are * using a JIT decoder we use a code generator to turn the bytecode into native * code, LLVM IR, etc. * * Bytecode definition is in decoder.int.h. */#include <stdarg.h>#ifdef UPB_DUMP_BYTECODE#include <stdio.h>#endif#define MAXLABEL 5#define EMPTYLABEL -1/* mgroup *********************************************************************/static void freegroup(upb_refcounted *r) {  mgroup *g = (mgroup*)r;  upb_inttable_uninit(&g->methods);#ifdef UPB_USE_JIT_X64  upb_pbdecoder_freejit(g);#endif  free(g->bytecode);  free(g);}static void visitgroup(const upb_refcounted *r, upb_refcounted_visit *visit,                       void *closure) {  const mgroup *g = (const mgroup*)r;  upb_inttable_iter i;  upb_inttable_begin(&i, &g->methods);  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {    upb_pbdecodermethod *method = upb_value_getptr(upb_inttable_iter_value(&i));    visit(r, UPB_UPCAST(method), closure);  }}mgroup *newgroup(const void *owner) {  mgroup *g = malloc(sizeof(*g));  static const struct upb_refcounted_vtbl vtbl = {visitgroup, freegroup};  upb_refcounted_init(UPB_UPCAST(g), &vtbl, owner);  upb_inttable_init(&g->methods, UPB_CTYPE_PTR);  g->bytecode = NULL;  g->bytecode_end = NULL;  return g;}/* upb_pbdecodermethod ********************************************************/static void freemethod(upb_refcounted *r) {  upb_pbdecodermethod *method = (upb_pbdecodermethod*)r;  upb_byteshandler_uninit(&method->input_handler_);  if (method->dest_handlers_) {    upb_handlers_unref(method->dest_handlers_, method);  }  upb_inttable_uninit(&method->dispatch);  free(method);}static void visitmethod(const upb_refcounted *r, upb_refcounted_visit *visit,                        void *closure) {  const upb_pbdecodermethod *m = (const upb_pbdecodermethod*)r;  visit(r, m->group, closure);}static upb_pbdecodermethod *newmethod(const upb_handlers *dest_handlers,                                      mgroup *group) {  static const struct upb_refcounted_vtbl vtbl = {visitmethod, freemethod};  upb_pbdecodermethod *ret = malloc(sizeof(*ret));  upb_refcounted_init(UPB_UPCAST(ret), &vtbl, &ret);  upb_byteshandler_init(&ret->input_handler_);  // The method references the group and vice-versa, in a circular reference.  upb_ref2(ret, group);  upb_ref2(group, ret);  upb_inttable_insertptr(&group->methods, dest_handlers, upb_value_ptr(ret));  upb_refcounted_unref(UPB_UPCAST(ret), &ret);  ret->group = UPB_UPCAST(group);  ret->dest_handlers_ = dest_handlers;  ret->is_native_ = false;  // If we JIT, it will update this later.  upb_inttable_init(&ret->dispatch, UPB_CTYPE_UINT64);  if (ret->dest_handlers_) {    upb_handlers_ref(ret->dest_handlers_, ret);  }  return ret;}void upb_pbdecodermethod_ref(const upb_pbdecodermethod *m, const void *owner) {  upb_refcounted_ref(UPB_UPCAST(m), owner);}void upb_pbdecodermethod_unref(const upb_pbdecodermethod *m,                               const void *owner) {  upb_refcounted_unref(UPB_UPCAST(m), owner);}void upb_pbdecodermethod_donateref(const upb_pbdecodermethod *m,                                   const void *from, const void *to) {  upb_refcounted_donateref(UPB_UPCAST(m), from, to);}void upb_pbdecodermethod_checkref(const upb_pbdecodermethod *m,                                  const void *owner) {  upb_refcounted_checkref(UPB_UPCAST(m), owner);}const upb_handlers *upb_pbdecodermethod_desthandlers(    const upb_pbdecodermethod *m) {  return m->dest_handlers_;}const upb_byteshandler *upb_pbdecodermethod_inputhandler(    const upb_pbdecodermethod *m) {  return &m->input_handler_;}bool upb_pbdecodermethod_isnative(const upb_pbdecodermethod *m) {  return m->is_native_;}const upb_pbdecodermethod *upb_pbdecodermethod_new(    const upb_pbdecodermethodopts *opts, const void *owner) {  upb_pbcodecache cache;  upb_pbcodecache_init(&cache);  const upb_pbdecodermethod *ret =      upb_pbcodecache_getdecodermethod(&cache, opts);  upb_pbdecodermethod_ref(ret, owner);  upb_pbcodecache_uninit(&cache);  return ret;}/* bytecode compiler **********************************************************/// Data used only at compilation time.typedef struct {  mgroup *group;  uint32_t *pc;  int fwd_labels[MAXLABEL];  int back_labels[MAXLABEL];  // For fields marked "lazy", parse them lazily or eagerly?  bool lazy;} compiler;static compiler *newcompiler(mgroup *group, bool lazy) {  compiler *ret = malloc(sizeof(*ret));  ret->group = group;  ret->lazy = lazy;  for (int i = 0; i < MAXLABEL; i++) {    ret->fwd_labels[i] = EMPTYLABEL;    ret->back_labels[i] = EMPTYLABEL;  }  return ret;}static void freecompiler(compiler *c) {  free(c);}const size_t ptr_words = sizeof(void*) / sizeof(uint32_t);// How many words an instruction is.static int instruction_len(uint32_t instr) {  switch (getop(instr)) {    case OP_SETDISPATCH: return 1 + ptr_words;    case OP_TAGN: return 3;    case OP_SETBIGGROUPNUM: return 2;    default: return 1;  }}bool op_has_longofs(int32_t instruction) {  switch (getop(instruction)) {    case OP_CALL:    case OP_BRANCH:    case OP_CHECKDELIM:      return true;    // The "tag" instructions only have 8 bytes available for the jump target,    // but that is ok because these opcodes only require short jumps.    case OP_TAG1:    case OP_TAG2:    case OP_TAGN:      return false;    default:      assert(false);      return false;  }}static int32_t getofs(uint32_t instruction) {  if (op_has_longofs(instruction)) {    return (int32_t)instruction >> 8;  } else {    return (int8_t)(instruction >> 8);  }}static void setofs(uint32_t *instruction, int32_t ofs) {  if (op_has_longofs(*instruction)) {    *instruction = getop(*instruction) | ofs << 8;  } else {    *instruction = (*instruction & ~0xff00) | ((ofs & 0xff) << 8);  }  assert(getofs(*instruction) == ofs);  // Would fail in cases of overflow.}static uint32_t pcofs(compiler *c) { return c->pc - c->group->bytecode; }// Defines a local label at the current PC location.  All previous forward// references are updated to point to this location.  The location is noted// for any future backward references.static void label(compiler *c, unsigned int label) {  assert(label < MAXLABEL);  int val = c->fwd_labels[label];  uint32_t *codep = (val == EMPTYLABEL) ? NULL : c->group->bytecode + val;  while (codep) {    int ofs = getofs(*codep);    setofs(codep, c->pc - codep - instruction_len(*codep));    codep = ofs ? codep + ofs : NULL;  }  c->fwd_labels[label] = EMPTYLABEL;  c->back_labels[label] = pcofs(c);}// Creates a reference to a numbered label; either a forward reference// (positive arg) or backward reference (negative arg).  For forward references// the value returned now is actually a "next" pointer into a linked list of all// instructions that use this label and will be patched later when the label is// defined with label().//// The returned value is the offset that should be written into the instruction.static int32_t labelref(compiler *c, int label) {  assert(label < MAXLABEL);  if (label == LABEL_DISPATCH) {    // No resolving required.    return 0;  } else if (label < 0) {    // Backward local label.  Relative to the next instruction.    uint32_t from = (c->pc + 1) - c->group->bytecode;    return c->back_labels[-label] - from;  } else {    // Forward local label: prepend to (possibly-empty) linked list.    int *lptr = &c->fwd_labels[label];    int32_t ret = (*lptr == EMPTYLABEL) ? 0 : *lptr - pcofs(c);    *lptr = pcofs(c);    return ret;  }}static void put32(compiler *c, uint32_t v) {  mgroup *g = c->group;  if (c->pc == g->bytecode_end) {    int ofs = pcofs(c);    size_t oldsize = g->bytecode_end - g->bytecode;    size_t newsize = UPB_MAX(oldsize * 2, 64);    // TODO(haberman): handle OOM.    g->bytecode = realloc(g->bytecode, newsize * sizeof(uint32_t));    g->bytecode_end = g->bytecode + newsize;    c->pc = g->bytecode + ofs;  }  *c->pc++ = v;}static void putop(compiler *c, opcode op, ...) {  va_list ap;  va_start(ap, op);  switch (op) {    case OP_SETDISPATCH: {      uintptr_t ptr = (uintptr_t)va_arg(ap, void*);      put32(c, OP_SETDISPATCH);      put32(c, ptr);      if (sizeof(uintptr_t) > sizeof(uint32_t))        put32(c, (uint64_t)ptr >> 32);      break;    }    case OP_STARTMSG:    case OP_ENDMSG:    case OP_PUSHLENDELIM:    case OP_POP:    case OP_SETDELIM:    case OP_HALT:    case OP_RET:      put32(c, op);      break;    case OP_PARSE_DOUBLE:    case OP_PARSE_FLOAT:    case OP_PARSE_INT64:    case OP_PARSE_UINT64:    case OP_PARSE_INT32:    case OP_PARSE_FIXED64:    case OP_PARSE_FIXED32:    case OP_PARSE_BOOL:    case OP_PARSE_UINT32:    case OP_PARSE_SFIXED32:    case OP_PARSE_SFIXED64:    case OP_PARSE_SINT32:    case OP_PARSE_SINT64:    case OP_STARTSEQ:    case OP_ENDSEQ:    case OP_STARTSUBMSG:    case OP_ENDSUBMSG:    case OP_STARTSTR:    case OP_STRING:    case OP_ENDSTR:    case OP_PUSHTAGDELIM:      put32(c, op | va_arg(ap, upb_selector_t) << 8);      break;    case OP_SETBIGGROUPNUM:      put32(c, op);      put32(c, va_arg(ap, int));      break;    case OP_CALL: {      const upb_pbdecodermethod *method = va_arg(ap, upb_pbdecodermethod *);      put32(c, op | (method->code_base.ofs - (pcofs(c) + 1)) << 8);      break;    }    case OP_CHECKDELIM:    case OP_BRANCH: {      uint32_t instruction = op;      int label = va_arg(ap, int);      setofs(&instruction, labelref(c, label));      put32(c, instruction);      break;    }    case OP_TAG1:    case OP_TAG2: {      int label = va_arg(ap, int);      uint64_t tag = va_arg(ap, uint64_t);      uint32_t instruction = op | (tag << 16);      assert(tag <= 0xffff);      setofs(&instruction, labelref(c, label));      put32(c, instruction);      break;    }    case OP_TAGN: {      int label = va_arg(ap, int);      uint64_t tag = va_arg(ap, uint64_t);      uint32_t instruction = op | (upb_value_size(tag) << 16);      setofs(&instruction, labelref(c, label));      put32(c, instruction);      put32(c, tag);      put32(c, tag >> 32);      break;    }  }  va_end(ap);}#if defined(UPB_USE_JIT_X64) || defined(UPB_DUMP_BYTECODE)const char *upb_pbdecoder_getopname(unsigned int op) {#define OP(op) [OP_ ## op] = "OP_" #op#define T(op) OP(PARSE_##op)  static const char *names[] = {    "<no opcode>",    T(DOUBLE), T(FLOAT), T(INT64), T(UINT64), T(INT32), T(FIXED64), T(FIXED32),    T(BOOL), T(UINT32), T(SFIXED32), T(SFIXED64), T(SINT32), T(SINT64),    OP(STARTMSG), OP(ENDMSG), OP(STARTSEQ), OP(ENDSEQ), OP(STARTSUBMSG),    OP(ENDSUBMSG), OP(STARTSTR), OP(STRING), OP(ENDSTR), OP(CALL), OP(RET),    OP(PUSHLENDELIM), OP(PUSHTAGDELIM), OP(SETDELIM), OP(CHECKDELIM),    OP(BRANCH), OP(TAG1), OP(TAG2), OP(TAGN), OP(SETDISPATCH), OP(POP),    OP(SETBIGGROUPNUM), OP(HALT),  };  return op > OP_HALT ? names[0] : names[op];#undef OP#undef T}#endif#ifdef UPB_DUMP_BYTECODEstatic void dumpbc(uint32_t *p, uint32_t *end, FILE *f) {  uint32_t *begin = p;  while (p < end) {    fprintf(f, "%p  %8tx", p, p - begin);    uint32_t instr = *p++;    uint8_t op = getop(instr);    fprintf(f, " %s", upb_pbdecoder_getopname(op));    switch ((opcode)op) {      case OP_SETDISPATCH: {        const upb_inttable *dispatch;        memcpy(&dispatch, p, sizeof(void*));        p += ptr_words;        const upb_pbdecodermethod *method =            (void *)((char *)dispatch -                     offsetof(upb_pbdecodermethod, dispatch));        fprintf(f, " %s", upb_msgdef_fullname(                              upb_handlers_msgdef(method->dest_handlers_)));        break;      }      case OP_STARTMSG:      case OP_ENDMSG:      case OP_PUSHLENDELIM:      case OP_POP:      case OP_SETDELIM:      case OP_HALT:      case OP_RET:        break;      case OP_PARSE_DOUBLE:      case OP_PARSE_FLOAT:      case OP_PARSE_INT64:      case OP_PARSE_UINT64:      case OP_PARSE_INT32:      case OP_PARSE_FIXED64:      case OP_PARSE_FIXED32:      case OP_PARSE_BOOL:      case OP_PARSE_UINT32:      case OP_PARSE_SFIXED32:      case OP_PARSE_SFIXED64:      case OP_PARSE_SINT32:      case OP_PARSE_SINT64:      case OP_STARTSEQ:      case OP_ENDSEQ:      case OP_STARTSUBMSG:      case OP_ENDSUBMSG:      case OP_STARTSTR:      case OP_STRING:      case OP_ENDSTR:      case OP_PUSHTAGDELIM:        fprintf(f, " %d", instr >> 8);        break;      case OP_SETBIGGROUPNUM:        fprintf(f, " %d", *p++);        break;      case OP_CHECKDELIM:      case OP_CALL:      case OP_BRANCH:        fprintf(f, " =>0x%tx", p + getofs(instr) - begin);        break;      case OP_TAG1:      case OP_TAG2: {        fprintf(f, " tag:0x%x", instr >> 16);        if (getofs(instr)) {          fprintf(f, " =>0x%tx", p + getofs(instr) - begin);        }        break;      }      case OP_TAGN: {        uint64_t tag = *p++;        tag |= (uint64_t)*p++ << 32;        fprintf(f, " tag:0x%llx", (long long)tag);        fprintf(f, " n:%d", instr >> 16);        if (getofs(instr)) {          fprintf(f, " =>0x%tx", p + getofs(instr) - begin);        }        break;      }    }    fputs("\n", f);  }}#endifstatic uint64_t get_encoded_tag(const upb_fielddef *f, int wire_type) {  uint32_t tag = (upb_fielddef_number(f) << 3) | wire_type;  uint64_t encoded_tag = upb_vencode32(tag);  // No tag should be greater than 5 bytes.  assert(encoded_tag <= 0xffffffffff);  return encoded_tag;}static void putchecktag(compiler *c, const upb_fielddef *f,                        int wire_type, int dest) {  uint64_t tag = get_encoded_tag(f, wire_type);  switch (upb_value_size(tag)) {    case 1:      putop(c, OP_TAG1, dest, tag);      break;    case 2:      putop(c, OP_TAG2, dest, tag);      break;    default:      putop(c, OP_TAGN, dest, tag);      break;  }}static upb_selector_t getsel(const upb_fielddef *f, upb_handlertype_t type) {  upb_selector_t selector;  bool ok = upb_handlers_getselector(f, type, &selector);  UPB_ASSERT_VAR(ok, ok);  return selector;}// Takes an existing, primary dispatch table entry and repacks it with a// different alternate wire type.  Called when we are inserting a secondary// dispatch table entry for an alternate wire type.static uint64_t repack(uint64_t dispatch, int new_wt2) {  uint64_t ofs;  uint8_t wt1;  uint8_t old_wt2;  upb_pbdecoder_unpackdispatch(dispatch, &ofs, &wt1, &old_wt2);  assert(old_wt2 == NO_WIRE_TYPE);  // wt2 should not be set yet.  return upb_pbdecoder_packdispatch(ofs, wt1, new_wt2);}// Marks the current bytecode position as the dispatch target for this message,// field, and wire type.static void dispatchtarget(compiler *c, upb_pbdecodermethod *method,                           const upb_fielddef *f, int wire_type) {  // Offset is relative to msg base.  uint64_t ofs = pcofs(c) - method->code_base.ofs;  uint32_t fn = upb_fielddef_number(f);  upb_inttable *d = &method->dispatch;  upb_value v;  if (upb_inttable_remove(d, fn, &v)) {    // TODO: prioritize based on packed setting in .proto file.    uint64_t repacked = repack(upb_value_getuint64(v), wire_type);    upb_inttable_insert(d, fn, upb_value_uint64(repacked));    upb_inttable_insert(d, fn + UPB_MAX_FIELDNUMBER, upb_value_uint64(ofs));  } else {    uint64_t val = upb_pbdecoder_packdispatch(ofs, wire_type, NO_WIRE_TYPE);    upb_inttable_insert(d, fn, upb_value_uint64(val));  }}static void putpush(compiler *c, const upb_fielddef *f) {  if (upb_fielddef_descriptortype(f) == UPB_DESCRIPTOR_TYPE_MESSAGE) {    putop(c, OP_PUSHLENDELIM);  } else {    uint32_t fn = upb_fielddef_number(f);    if (fn >= 1 << 24) {      putop(c, OP_PUSHTAGDELIM, 0);      putop(c, OP_SETBIGGROUPNUM, fn);    } else {      putop(c, OP_PUSHTAGDELIM, fn);    }  }}static upb_pbdecodermethod *find_submethod(const compiler *c,                                           const upb_pbdecodermethod *method,                                           const upb_fielddef *f) {  const upb_handlers *sub =      upb_handlers_getsubhandlers(method->dest_handlers_, f);  upb_value v;  return upb_inttable_lookupptr(&c->group->methods, sub, &v)             ? upb_value_getptr(v)             : NULL;}static void putsel(compiler *c, opcode op, upb_selector_t sel,                   const upb_handlers *h) {  if (upb_handlers_gethandler(h, sel)) {    putop(c, op, sel);  }}// Puts an opcode to call a callback, but only if a callback actually exists for// this field and handler type.static void maybeput(compiler *c, opcode op, const upb_handlers *h,                     const upb_fielddef *f, upb_handlertype_t type) {  putsel(c, op, getsel(f, type), h);}static bool haslazyhandlers(const upb_handlers *h, const upb_fielddef *f) {  if (!upb_fielddef_lazy(f))    return false;  return upb_handlers_gethandler(h, getsel(f, UPB_HANDLER_STARTSTR)) ||         upb_handlers_gethandler(h, getsel(f, UPB_HANDLER_STRING)) ||         upb_handlers_gethandler(h, getsel(f, UPB_HANDLER_ENDSTR));}/* bytecode compiler code generation ******************************************/// Symbolic names for our local labels.#define LABEL_LOOPSTART 1  // Top of a repeated field loop.#define LABEL_LOOPBREAK 2  // To jump out of a repeated loop#define LABEL_FIELD     3  // Jump backward to find the most recent field.#define LABEL_ENDMSG    4  // To reach the OP_ENDMSG instr for this msg.// Generates bytecode to parse a single non-lazy message field.static void generate_msgfield(compiler *c, const upb_fielddef *f,                              upb_pbdecodermethod *method) {  const upb_handlers *h = upb_pbdecodermethod_desthandlers(method);  const upb_pbdecodermethod *sub_m = find_submethod(c, method, f);  if (!sub_m) {    // Don't emit any code for this field at all; it will be parsed as an    // unknown field.    return;  }  label(c, LABEL_FIELD);  int wire_type =      (upb_fielddef_descriptortype(f) == UPB_DESCRIPTOR_TYPE_MESSAGE)          ? UPB_WIRE_TYPE_DELIMITED          : UPB_WIRE_TYPE_START_GROUP;  if (upb_fielddef_isseq(f)) {    putop(c, OP_CHECKDELIM, LABEL_ENDMSG);    putchecktag(c, f, wire_type, LABEL_DISPATCH);   dispatchtarget(c, method, f, wire_type);    putop(c, OP_PUSHTAGDELIM, 0);    putop(c, OP_STARTSEQ, getsel(f, UPB_HANDLER_STARTSEQ));   label(c, LABEL_LOOPSTART);    putpush(c, f);    putop(c, OP_STARTSUBMSG, getsel(f, UPB_HANDLER_STARTSUBMSG));    putop(c, OP_CALL, sub_m);    putop(c, OP_POP);    maybeput(c, OP_ENDSUBMSG, h, f, UPB_HANDLER_ENDSUBMSG);    if (wire_type == UPB_WIRE_TYPE_DELIMITED) {      putop(c, OP_SETDELIM);    }    putop(c, OP_CHECKDELIM, LABEL_LOOPBREAK);    putchecktag(c, f, wire_type, LABEL_LOOPBREAK);    putop(c, OP_BRANCH, -LABEL_LOOPSTART);   label(c, LABEL_LOOPBREAK);    putop(c, OP_POP);    maybeput(c, OP_ENDSEQ, h, f, UPB_HANDLER_ENDSEQ);  } else {    putop(c, OP_CHECKDELIM, LABEL_ENDMSG);    putchecktag(c, f, wire_type, LABEL_DISPATCH);   dispatchtarget(c, method, f, wire_type);    putpush(c, f);    putop(c, OP_STARTSUBMSG, getsel(f, UPB_HANDLER_STARTSUBMSG));    putop(c, OP_CALL, sub_m);    putop(c, OP_POP);    maybeput(c, OP_ENDSUBMSG, h, f, UPB_HANDLER_ENDSUBMSG);    if (wire_type == UPB_WIRE_TYPE_DELIMITED) {      putop(c, OP_SETDELIM);    }  }}// Generates bytecode to parse a single string or lazy submessage field.static void generate_delimfield(compiler *c, const upb_fielddef *f,                                upb_pbdecodermethod *method) {  const upb_handlers *h = upb_pbdecodermethod_desthandlers(method);  label(c, LABEL_FIELD);  if (upb_fielddef_isseq(f)) {    putop(c, OP_CHECKDELIM, LABEL_ENDMSG);    putchecktag(c, f, UPB_WIRE_TYPE_DELIMITED, LABEL_DISPATCH);   dispatchtarget(c, method, f, UPB_WIRE_TYPE_DELIMITED);    putop(c, OP_PUSHTAGDELIM, 0);    putop(c, OP_STARTSEQ, getsel(f, UPB_HANDLER_STARTSEQ));   label(c, LABEL_LOOPSTART);    putop(c, OP_PUSHLENDELIM);    putop(c, OP_STARTSTR, getsel(f, UPB_HANDLER_STARTSTR));    // Need to emit even if no handler to skip past the string.    putop(c, OP_STRING, getsel(f, UPB_HANDLER_STRING));    putop(c, OP_POP);    maybeput(c, OP_ENDSTR, h, f, UPB_HANDLER_ENDSTR);    putop(c, OP_SETDELIM);    putop(c, OP_CHECKDELIM, LABEL_LOOPBREAK);    putchecktag(c, f, UPB_WIRE_TYPE_DELIMITED, LABEL_LOOPBREAK);    putop(c, OP_BRANCH, -LABEL_LOOPSTART);   label(c, LABEL_LOOPBREAK);    putop(c, OP_POP);    maybeput(c, OP_ENDSEQ, h, f, UPB_HANDLER_ENDSEQ);  } else {    putop(c, OP_CHECKDELIM, LABEL_ENDMSG);    putchecktag(c, f, UPB_WIRE_TYPE_DELIMITED, LABEL_DISPATCH);   dispatchtarget(c, method, f, UPB_WIRE_TYPE_DELIMITED);    putop(c, OP_PUSHLENDELIM);    putop(c, OP_STARTSTR, getsel(f, UPB_HANDLER_STARTSTR));    putop(c, OP_STRING, getsel(f, UPB_HANDLER_STRING));    putop(c, OP_POP);    maybeput(c, OP_ENDSTR, h, f, UPB_HANDLER_ENDSTR);    putop(c, OP_SETDELIM);  }}// Generates bytecode to parse a single primitive field.static void generate_primitivefield(compiler *c, const upb_fielddef *f,                                    upb_pbdecodermethod *method) {  label(c, LABEL_FIELD);  const upb_handlers *h = upb_pbdecodermethod_desthandlers(method);  upb_descriptortype_t descriptor_type = upb_fielddef_descriptortype(f);  // From a decoding perspective, ENUM is the same as INT32.  if (descriptor_type == UPB_DESCRIPTOR_TYPE_ENUM)    descriptor_type = UPB_DESCRIPTOR_TYPE_INT32;  opcode parse_type = (opcode)descriptor_type;  // TODO(haberman): generate packed or non-packed first depending on "packed"  // setting in the fielddef.  This will favor (in speed) whichever was  // specified.  assert((int)parse_type >= 0 && parse_type <= OP_MAX);  upb_selector_t sel = getsel(f, upb_handlers_getprimitivehandlertype(f));  int wire_type = upb_pb_native_wire_types[upb_fielddef_descriptortype(f)];  if (upb_fielddef_isseq(f)) {    putop(c, OP_CHECKDELIM, LABEL_ENDMSG);    putchecktag(c, f, UPB_WIRE_TYPE_DELIMITED, LABEL_DISPATCH);   dispatchtarget(c, method, f, UPB_WIRE_TYPE_DELIMITED);    putop(c, OP_PUSHLENDELIM);    putop(c, OP_STARTSEQ, getsel(f, UPB_HANDLER_STARTSEQ));  // Packed   label(c, LABEL_LOOPSTART);    putop(c, parse_type, sel);    putop(c, OP_CHECKDELIM, LABEL_LOOPBREAK);    putop(c, OP_BRANCH, -LABEL_LOOPSTART);   dispatchtarget(c, method, f, wire_type);    putop(c, OP_PUSHTAGDELIM, 0);    putop(c, OP_STARTSEQ, getsel(f, UPB_HANDLER_STARTSEQ));  // Non-packed   label(c, LABEL_LOOPSTART);    putop(c, parse_type, sel);    putop(c, OP_CHECKDELIM, LABEL_LOOPBREAK);    putchecktag(c, f, wire_type, LABEL_LOOPBREAK);    putop(c, OP_BRANCH, -LABEL_LOOPSTART);   label(c, LABEL_LOOPBREAK);    putop(c, OP_POP);  // Packed and non-packed join.    maybeput(c, OP_ENDSEQ, h, f, UPB_HANDLER_ENDSEQ);    putop(c, OP_SETDELIM);  // Could remove for non-packed by dup ENDSEQ.  } else {    putop(c, OP_CHECKDELIM, LABEL_ENDMSG);    putchecktag(c, f, wire_type, LABEL_DISPATCH);   dispatchtarget(c, method, f, wire_type);    putop(c, parse_type, sel);  }}// Adds bytecode for parsing the given message to the given decoderplan,// while adding all dispatch targets to this message's dispatch table.static void compile_method(compiler *c, upb_pbdecodermethod *method) {  assert(method);  // Clear all entries in the dispatch table.  upb_inttable_uninit(&method->dispatch);  upb_inttable_init(&method->dispatch, UPB_CTYPE_UINT64);  const upb_handlers *h = upb_pbdecodermethod_desthandlers(method);  const upb_msgdef *md = upb_handlers_msgdef(h); method->code_base.ofs = pcofs(c);  putop(c, OP_SETDISPATCH, &method->dispatch);  putsel(c, OP_STARTMSG, UPB_STARTMSG_SELECTOR, h); label(c, LABEL_FIELD);  upb_msg_iter i;  for(upb_msg_begin(&i, md); !upb_msg_done(&i); upb_msg_next(&i)) {    const upb_fielddef *f = upb_msg_iter_field(&i);    upb_fieldtype_t type = upb_fielddef_type(f);    if (type == UPB_TYPE_MESSAGE && !(haslazyhandlers(h, f) && c->lazy)) {      generate_msgfield(c, f, method);    } else if (type == UPB_TYPE_STRING || type == UPB_TYPE_BYTES ||               type == UPB_TYPE_MESSAGE) {      generate_delimfield(c, f, method);    } else {      generate_primitivefield(c, f, method);    }  }  // For now we just loop back to the last field of the message (or if none,  // the DISPATCH opcode for the message.  putop(c, OP_BRANCH, -LABEL_FIELD);  // Insert both a label and a dispatch table entry for this end-of-msg. label(c, LABEL_ENDMSG);  upb_value val = upb_value_uint64(pcofs(c) - method->code_base.ofs);  upb_inttable_insert(&method->dispatch, DISPATCH_ENDMSG, val);  putsel(c, OP_ENDMSG, UPB_ENDMSG_SELECTOR, h);  putop(c, OP_RET);  upb_inttable_compact(&method->dispatch);}// Populate "methods" with new upb_pbdecodermethod objects reachable from "h".// Returns the method for these handlers.//// Generates a new method for every destination handlers reachable from "h".static void find_methods(compiler *c, const upb_handlers *h) {  upb_value v;  if (upb_inttable_lookupptr(&c->group->methods, h, &v))    return;  newmethod(h, c->group);  // Find submethods.  upb_msg_iter i;  const upb_msgdef *md = upb_handlers_msgdef(h);  for(upb_msg_begin(&i, md); !upb_msg_done(&i); upb_msg_next(&i)) {    const upb_fielddef *f = upb_msg_iter_field(&i);    const upb_handlers *sub_h;    if (upb_fielddef_type(f) == UPB_TYPE_MESSAGE &&        (sub_h = upb_handlers_getsubhandlers(h, f)) != NULL) {      // We only generate a decoder method for submessages with handlers.      // Others will be parsed as unknown fields.      find_methods(c, sub_h);    }  }}// (Re-)compile bytecode for all messages in "msgs."// Overwrites any existing bytecode in "c".static void compile_methods(compiler *c) {  // Start over at the beginning of the bytecode.  c->pc = c->group->bytecode;  upb_inttable_iter i;  upb_inttable_begin(&i, &c->group->methods);  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {    upb_pbdecodermethod *method = upb_value_getptr(upb_inttable_iter_value(&i));    compile_method(c, method);  }}static void set_bytecode_handlers(mgroup *g) {  upb_inttable_iter i;  upb_inttable_begin(&i, &g->methods);  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {    upb_pbdecodermethod *m = upb_value_getptr(upb_inttable_iter_value(&i));    m->code_base.ptr = g->bytecode + m->code_base.ofs;    upb_byteshandler *h = &m->input_handler_;    upb_byteshandler_setstartstr(h, upb_pbdecoder_startbc, m->code_base.ptr);    upb_byteshandler_setstring(h, upb_pbdecoder_decode, g);    upb_byteshandler_setendstr(h, upb_pbdecoder_end, m);  }}/* JIT setup. ******************************************************************/#ifdef UPB_USE_JIT_X64static void sethandlers(mgroup *g, bool allowjit) {  g->jit_code = NULL;  if (allowjit) {    // Compile byte-code into machine code, create handlers.    upb_pbdecoder_jit(g);  } else {    set_bytecode_handlers(g);  }}#else  // UPB_USE_JIT_X64static void sethandlers(mgroup *g, bool allowjit) {  // No JIT compiled in; use bytecode handlers unconditionally.  UPB_UNUSED(allowjit);  set_bytecode_handlers(g);}#endif  // UPB_USE_JIT_X64// TODO(haberman): allow this to be constructed for an arbitrary set of dest// handlers and other mgroups (but verify we have a transitive closure).const mgroup *mgroup_new(const upb_handlers *dest, bool allowjit, bool lazy,                         const void *owner) {  UPB_UNUSED(allowjit);  assert(upb_handlers_isfrozen(dest));  mgroup *g = newgroup(owner);  compiler *c = newcompiler(g, lazy);  find_methods(c, dest);  // We compile in two passes:  // 1. all messages are assigned relative offsets from the beginning of the  //    bytecode (saved in method->code_base).  // 2. forwards OP_CALL instructions can be correctly linked since message  //    offsets have been previously assigned.  //  // Could avoid the second pass by linking OP_CALL instructions somehow.  compile_methods(c);  compile_methods(c);  g->bytecode_end = c->pc;  freecompiler(c);#ifdef UPB_DUMP_BYTECODE  FILE *f = fopen("/tmp/upb-bytecode", "wb");  assert(f);  dumpbc(g->bytecode, g->bytecode_end, stderr);  dumpbc(g->bytecode, g->bytecode_end, f);  fclose(f);#endif  sethandlers(g, allowjit);  return g;}/* upb_pbcodecache ************************************************************/void upb_pbcodecache_init(upb_pbcodecache *c) {  upb_inttable_init(&c->groups, UPB_CTYPE_CONSTPTR);  c->allow_jit_ = true;}void upb_pbcodecache_uninit(upb_pbcodecache *c) {  upb_inttable_iter i;  upb_inttable_begin(&i, &c->groups);  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {    const mgroup *group = upb_value_getconstptr(upb_inttable_iter_value(&i));    upb_refcounted_unref(UPB_UPCAST(group), c);  }  upb_inttable_uninit(&c->groups);}bool upb_pbcodecache_allowjit(const upb_pbcodecache *c) {  return c->allow_jit_;}bool upb_pbcodecache_setallowjit(upb_pbcodecache *c, bool allow) {  if (upb_inttable_count(&c->groups) > 0)    return false;  c->allow_jit_ = allow;  return true;}const upb_pbdecodermethod *upb_pbcodecache_getdecodermethod(    upb_pbcodecache *c, const upb_pbdecodermethodopts *opts) {  // Right now we build a new DecoderMethod every time.  // TODO(haberman): properly cache methods by their true key.  const mgroup *g = mgroup_new(opts->handlers, c->allow_jit_, opts->lazy, c);  upb_inttable_push(&c->groups, upb_value_constptr(g));  upb_value v;  bool ok = upb_inttable_lookupptr(&g->methods, opts->handlers, &v);  UPB_ASSERT_VAR(ok, ok);  return upb_value_getptr(v);}/* upb_pbdecodermethodopts ****************************************************/void upb_pbdecodermethodopts_init(upb_pbdecodermethodopts *opts,                                  const upb_handlers *h) {  opts->handlers = h;  opts->lazy = false;}void upb_pbdecodermethodopts_setlazy(upb_pbdecodermethodopts *opts, bool lazy) {  opts->lazy = lazy;}/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2008-2013 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> * * This file implements a VM for the interpreted (bytecode) decoder. * * Bytecode must previously have been generated using the bytecode compiler in * compile_decoder.c.  This decoder then walks through the bytecode op-by-op to * parse the input. * * Decoding is fully resumable; we just keep a pointer to the current bytecode * instruction and resume from there.  A fair amount of the logic here is to * handle the fact that values can span buffer seams and we have to be able to * be capable of suspending/resuming from any byte in the stream.  This * sometimes requires keeping a few trailing bytes from the last buffer around * in the "residual" buffer. */#include <inttypes.h>#include <setjmp.h>#include <stdarg.h>#include <stddef.h>#include <stdlib.h>#ifdef UPB_DUMP_BYTECODE#include <stdio.h>#endif#define CHECK_SUSPEND(x) if (!(x)) return upb_pbdecoder_suspend(d);// Error messages that are shared between the bytecode and JIT decoders.const char *kPbDecoderStackOverflow = "Nesting too deep.";// Error messages shared within this file.static const char *kUnterminatedVarint = "Unterminated varint.";/* upb_pbdecoder **************************************************************/static opcode halt = OP_HALT;// Whether an op consumes any of the input buffer.static bool consumes_input(opcode op) {  switch (op) {    case OP_SETDISPATCH:    case OP_STARTMSG:    case OP_ENDMSG:    case OP_STARTSEQ:    case OP_ENDSEQ:    case OP_STARTSUBMSG:    case OP_ENDSUBMSG:    case OP_STARTSTR:    case OP_ENDSTR:    case OP_PUSHTAGDELIM:    case OP_POP:    case OP_SETDELIM:    case OP_SETBIGGROUPNUM:    case OP_CHECKDELIM:    case OP_CALL:    case OP_RET:    case OP_BRANCH:      return false;    default:      return true;  }}static bool in_residual_buf(const upb_pbdecoder *d, const char *p);// It's unfortunate that we have to micro-manage the compiler this way,// especially since this tuning is necessarily specific to one hardware// configuration.  But emperically on a Core i7, performance increases 30-50%// with these annotations.  Every instance where these appear, gcc 4.2.1 made// the wrong decision and degraded performance in benchmarks.#define FORCEINLINE static inline __attribute__((always_inline))#define NOINLINE __attribute__((noinline))static void seterr(upb_pbdecoder *d, const char *msg) {  // TODO(haberman): encapsulate this access to pipeline->status, but not sure  // exactly what that interface should look like.  upb_status_seterrmsg(d->status, msg);}void upb_pbdecoder_seterr(upb_pbdecoder *d, const char *msg) {  seterr(d, msg);}/* Buffering ******************************************************************/// We operate on one buffer at a time, which is either the user's buffer passed// to our "decode" callback or some residual bytes from the previous buffer.// How many bytes can be safely read from d->ptr without reading past end-of-buf// or past the current delimited end.static size_t curbufleft(const upb_pbdecoder *d) {  assert(d->data_end >= d->ptr);  return d->data_end - d->ptr;}// Overall stream offset of d->ptr.uint64_t offset(const upb_pbdecoder *d) {  return d->bufstart_ofs + (d->ptr - d->buf);}// Advances d->ptr.static void advance(upb_pbdecoder *d, size_t len) {  assert(curbufleft(d) >= len);  d->ptr += len;}static bool in_buf(const char *p, const char *buf, const char *end) {  return p >= buf && p <= end;}static bool in_residual_buf(const upb_pbdecoder *d, const char *p) {  return in_buf(p, d->residual, d->residual_end);}// Calculates the delim_end value, which is affected by both the current buffer// and the parsing stack, so must be called whenever either is updated.static void set_delim_end(upb_pbdecoder *d) {  size_t delim_ofs = d->top->end_ofs - d->bufstart_ofs;  if (delim_ofs <= (d->end - d->buf)) {    d->delim_end = d->buf + delim_ofs;    d->data_end = d->delim_end;  } else {    d->data_end = d->end;    d->delim_end = NULL;  }}static void switchtobuf(upb_pbdecoder *d, const char *buf, const char *end) {  d->ptr = buf;  d->buf = buf;  d->end = end;  set_delim_end(d);}static void advancetobuf(upb_pbdecoder *d, const char *buf, size_t len) {  assert(curbufleft(d) == 0);  d->bufstart_ofs += (d->end - d->buf);  switchtobuf(d, buf, buf + len);}static void checkpoint(upb_pbdecoder *d) {  // The assertion here is in the interests of efficiency, not correctness.  // We are trying to ensure that we don't checkpoint() more often than  // necessary.  assert(d->checkpoint != d->ptr);  d->checkpoint = d->ptr;}// Resumes the decoder from an initial state or from a previous suspend.int32_t upb_pbdecoder_resume(upb_pbdecoder *d, void *p, const char *buf,                             size_t size, const upb_bufhandle *handle) {  UPB_UNUSED(p);  // Useless; just for the benefit of the JIT.  d->buf_param = buf;  d->size_param = size;  d->handle = handle;  if (d->residual_end > d->residual) {    // We have residual bytes from the last buffer.    assert(d->ptr == d->residual);  } else {    switchtobuf(d, buf, buf + size);  }  d->checkpoint = d->ptr;  if (d->top->groupnum < 0) {    CHECK_RETURN(upb_pbdecoder_skipunknown(d, -1, 0));    d->checkpoint = d->ptr;  }  return DECODE_OK;}// Suspends the decoder at the last checkpoint, without saving any residual// bytes.  If there are any unconsumed bytes, returns a short byte count.size_t upb_pbdecoder_suspend(upb_pbdecoder *d) {  d->pc = d->last;  if (d->checkpoint == d->residual) {    // Checkpoint was in residual buf; no user bytes were consumed.    d->ptr = d->residual;    return 0;  } else {    assert(!in_residual_buf(d, d->checkpoint));    assert(d->buf == d->buf_param);    size_t consumed = d->checkpoint - d->buf;    d->bufstart_ofs += consumed;    d->residual_end = d->residual;    switchtobuf(d, d->residual, d->residual_end);    return consumed;  }}// Suspends the decoder at the last checkpoint, and saves any unconsumed// bytes in our residual buffer.  This is necessary if we need more user// bytes to form a complete value, which might not be contiguous in the// user's buffers.  Always consumes all user bytes.static size_t suspend_save(upb_pbdecoder *d) {  // We hit end-of-buffer before we could parse a full value.  // Save any unconsumed bytes (if any) to the residual buffer.  d->pc = d->last;  if (d->checkpoint == d->residual) {    // Checkpoint was in residual buf; append user byte(s) to residual buf.    assert((d->residual_end - d->residual) + d->size_param <=           sizeof(d->residual));    if (!in_residual_buf(d, d->ptr)) {      d->bufstart_ofs -= (d->residual_end - d->residual);    }    memcpy(d->residual_end, d->buf_param, d->size_param);    d->residual_end += d->size_param;  } else {    // Checkpoint was in user buf; old residual bytes not needed.    assert(!in_residual_buf(d, d->checkpoint));    d->ptr = d->checkpoint;    size_t save = curbufleft(d);    assert(save <= sizeof(d->residual));    memcpy(d->residual, d->ptr, save);    d->residual_end = d->residual + save;    d->bufstart_ofs = offset(d);  }  switchtobuf(d, d->residual, d->residual_end);  return d->size_param;}// Skips "bytes" bytes in the stream, which may be more than available.  If we// skip more bytes than are available, we return a long read count to the caller// indicating how many bytes the caller should skip before passing a new buffer.static int32_t skip(upb_pbdecoder *d, size_t bytes) {  assert(!in_residual_buf(d, d->ptr) || d->size_param == 0);  if (curbufleft(d) >= bytes) {    // Skipped data is all in current buffer.    advance(d, bytes);    return DECODE_OK;  } else {    // Skipped data extends beyond currently available buffers.    d->pc = d->last;    size_t skip = bytes - curbufleft(d);    d->bufstart_ofs += (d->end - d->buf) + skip;    d->residual_end = d->residual;    switchtobuf(d, d->residual, d->residual_end);    return d->size_param + skip;  }}// Copies the next "bytes" bytes into "buf" and advances the stream.// Requires that this many bytes are available in the current buffer.FORCEINLINE void consumebytes(upb_pbdecoder *d, void *buf, size_t bytes) {  assert(bytes <= curbufleft(d));  memcpy(buf, d->ptr, bytes);  advance(d, bytes);}// Slow path for getting the next "bytes" bytes, regardless of whether they are// available in the current buffer or not.  Returns a status code as described// in decoder.int.h.static NOINLINE int32_t getbytes_slow(upb_pbdecoder *d, void *buf,                                      size_t bytes) {  const size_t avail = curbufleft(d);  consumebytes(d, buf, avail);  bytes -= avail;  assert(bytes > 0);  if (in_residual_buf(d, d->ptr)) {    advancetobuf(d, d->buf_param, d->size_param);  }  if (curbufleft(d) >= bytes) {    consumebytes(d, buf + avail, bytes);    return DECODE_OK;  } else if (d->data_end == d->delim_end) {    seterr(d, "Submessage ended in the middle of a value or group");    return upb_pbdecoder_suspend(d);  } else {    return suspend_save(d);  }}// Gets the next "bytes" bytes, regardless of whether they are available in the// current buffer or not.  Returns a status code as described in decoder.int.h.FORCEINLINE int32_t getbytes(upb_pbdecoder *d, void *buf, size_t bytes) {  if (curbufleft(d) >= bytes) {    // Buffer has enough data to satisfy.    consumebytes(d, buf, bytes);    return DECODE_OK;  } else {    return getbytes_slow(d, buf, bytes);  }}static NOINLINE size_t peekbytes_slow(upb_pbdecoder *d, void *buf,                                      size_t bytes) {  size_t ret = curbufleft(d);  memcpy(buf, d->ptr, ret);  if (in_residual_buf(d, d->ptr)) {    size_t copy = UPB_MIN(bytes - ret, d->size_param);    memcpy(buf + ret, d->buf_param, copy);    ret += copy;  }  return ret;}FORCEINLINE size_t peekbytes(upb_pbdecoder *d, void *buf, size_t bytes) {  if (curbufleft(d) >= bytes) {    memcpy(buf, d->ptr, bytes);    return bytes;  } else {    return peekbytes_slow(d, buf, bytes);  }}/* Decoding of wire types *****************************************************/// Slow path for decoding a varint from the current buffer position.// Returns a status code as described in decoder.int.h.NOINLINE int32_t upb_pbdecoder_decode_varint_slow(upb_pbdecoder *d,                                                  uint64_t *u64) {  *u64 = 0;  uint8_t byte = 0x80;  int bitpos;  for(bitpos = 0; bitpos < 70 && (byte & 0x80); bitpos += 7) {    int32_t ret = getbytes(d, &byte, 1);    if (ret >= 0) return ret;    *u64 |= (uint64_t)(byte & 0x7F) << bitpos;  }  if(bitpos == 70 && (byte & 0x80)) {    seterr(d, kUnterminatedVarint);    return upb_pbdecoder_suspend(d);  }  return DECODE_OK;}// Decodes a varint from the current buffer position.// Returns a status code as described in decoder.int.h.FORCEINLINE int32_t decode_varint(upb_pbdecoder *d, uint64_t *u64) {  if (curbufleft(d) > 0 && !(*d->ptr & 0x80)) {    *u64 = *d->ptr;    advance(d, 1);    return DECODE_OK;  } else if (curbufleft(d) >= 10) {    // Fast case.    upb_decoderet r = upb_vdecode_fast(d->ptr);    if (r.p == NULL) {      seterr(d, kUnterminatedVarint);      return upb_pbdecoder_suspend(d);    }    advance(d, r.p - d->ptr);    *u64 = r.val;    return DECODE_OK;  } else {    // Slow case -- varint spans buffer seam.    return upb_pbdecoder_decode_varint_slow(d, u64);  }}// Decodes a 32-bit varint from the current buffer position.// Returns a status code as described in decoder.int.h.FORCEINLINE int32_t decode_v32(upb_pbdecoder *d, uint32_t *u32) {  uint64_t u64;  int32_t ret = decode_varint(d, &u64);  if (ret >= 0) return ret;  if (u64 > UINT32_MAX) {    seterr(d, "Unterminated 32-bit varint");    // TODO(haberman) guarantee that this function return is >= 0 somehow,    // so we know this path will always be treated as error by our caller.    // Right now the size_t -> int32_t can overflow and produce negative values.    *u32 = 0;    return upb_pbdecoder_suspend(d);  }  *u32 = u64;  return DECODE_OK;}// Decodes a fixed32 from the current buffer position.// Returns a status code as described in decoder.int.h.// TODO: proper byte swapping for big-endian machines.FORCEINLINE int32_t decode_fixed32(upb_pbdecoder *d, uint32_t *u32) {  return getbytes(d, u32, 4);}// Decodes a fixed64 from the current buffer position.// Returns a status code as described in decoder.int.h.// TODO: proper byte swapping for big-endian machines.FORCEINLINE int32_t decode_fixed64(upb_pbdecoder *d, uint64_t *u64) {  return getbytes(d, u64, 8);}// Non-static versions of the above functions.// These are called by the JIT for fallback paths.int32_t upb_pbdecoder_decode_f32(upb_pbdecoder *d, uint32_t *u32) {  return decode_fixed32(d, u32);}int32_t upb_pbdecoder_decode_f64(upb_pbdecoder *d, uint64_t *u64) {  return decode_fixed64(d, u64);}static double as_double(uint64_t n) { double d; memcpy(&d, &n, 8); return d; }static float  as_float(uint32_t n)  { float  f; memcpy(&f, &n, 4); return f; }// Pushes a frame onto the decoder stack.static bool decoder_push(upb_pbdecoder *d, uint64_t end) {  upb_pbdecoder_frame *fr = d->top;  if (end > fr->end_ofs) {    seterr(d, "Submessage end extends past enclosing submessage.");    return false;  } else if ((fr + 1) == d->limit) {    seterr(d, kPbDecoderStackOverflow);    return false;  }  fr++;  fr->end_ofs = end;  fr->dispatch = NULL;  fr->groupnum = 0;  d->top = fr;  return true;}static bool pushtagdelim(upb_pbdecoder *d, uint32_t arg) {  // While we expect to see an "end" tag (either ENDGROUP or a non-sequence  // field number) prior to hitting any enclosing submessage end, pushing our  // existing delim end prevents us from continuing to parse values from a  // corrupt proto that doesn't give us an END tag in time.  if (!decoder_push(d, d->top->end_ofs))    return false;  d->top->groupnum = arg;  return true;}// Pops a frame from the decoder stack.static void decoder_pop(upb_pbdecoder *d) { d->top--; }NOINLINE int32_t upb_pbdecoder_checktag_slow(upb_pbdecoder *d,                                             uint64_t expected) {  uint64_t data = 0;  size_t bytes = upb_value_size(expected);  size_t read = peekbytes(d, &data, bytes);  if (read == bytes && data == expected) {    // Advance past matched bytes.    int32_t ok = getbytes(d, &data, read);    UPB_ASSERT_VAR(ok, ok < 0);    return DECODE_OK;  } else if (read < bytes && memcmp(&data, &expected, read) == 0) {    return suspend_save(d);  } else {    return DECODE_MISMATCH;  }}int32_t upb_pbdecoder_skipunknown(upb_pbdecoder *d, int32_t fieldnum,                                  uint8_t wire_type) {  if (fieldnum >= 0)    goto have_tag;  while (true) {    uint32_t tag;    CHECK_RETURN(decode_v32(d, &tag));    wire_type = tag & 0x7;    fieldnum = tag >> 3;have_tag:    if (fieldnum == 0) {      seterr(d, "Saw invalid field number (0)");      return upb_pbdecoder_suspend(d);    }    // TODO: deliver to unknown field callback.    switch (wire_type) {      case UPB_WIRE_TYPE_32BIT:        CHECK_RETURN(skip(d, 4));        break;      case UPB_WIRE_TYPE_64BIT:        CHECK_RETURN(skip(d, 8));        break;      case UPB_WIRE_TYPE_VARINT: {        uint64_t u64;        CHECK_RETURN(decode_varint(d, &u64));        break;      }      case UPB_WIRE_TYPE_DELIMITED: {        uint32_t len;        CHECK_RETURN(decode_v32(d, &len));        CHECK_RETURN(skip(d, len));        break;      }      case UPB_WIRE_TYPE_START_GROUP:        CHECK_SUSPEND(pushtagdelim(d, -fieldnum));        break;      case UPB_WIRE_TYPE_END_GROUP:        if (fieldnum == -d->top->groupnum) {          decoder_pop(d);        } else if (fieldnum == d->top->groupnum) {          return DECODE_ENDGROUP;        } else {          seterr(d, "Unmatched ENDGROUP tag.");          return upb_pbdecoder_suspend(d);        }        break;      default:        seterr(d, "Invalid wire type");        return upb_pbdecoder_suspend(d);    }    if (d->top->groupnum >= 0) {      return DECODE_OK;    }    if (d->ptr == d->delim_end) {      seterr(d, "Enclosing submessage ended in the middle of value or group");      // Unlike most errors we notice during parsing, right now we have consumed      // all of the user's input.      //      // There are three different options for how to handle this case:      //      //   1. decode() = short count, error = set      //   2. decode() = full count, error = set      //   3. decode() = full count, error NOT set, short count and error will      //      be reported on next call to decode() (or end())      //      // (1) and (3) have the advantage that they preserve the invariant that an      // error occurs iff decode() returns a short count.      //      // (2) and (3) have the advantage of reflecting the fact that all of the      // bytes were in fact parsed (and possibly delivered to the unknown field      // handler, in the future when that is supported).      //      // (3) requires extra state in the decode (a place to store the "permanent      // error" that we should return for all subsequent attempts to decode).      // But we likely want this anyway.      //      // Right now we do (1), thanks to the fact that we checkpoint *after* this      // check.  (3) may be a better choice long term; unclear at the moment.      return upb_pbdecoder_suspend(d);    }    checkpoint(d);  }}static void goto_endmsg(upb_pbdecoder *d) {  upb_value v;  bool found = upb_inttable_lookup32(d->top->dispatch, DISPATCH_ENDMSG, &v);  UPB_ASSERT_VAR(found, found);  d->pc = d->top->base + upb_value_getuint64(v);}// Parses a tag and jumps to the corresponding bytecode instruction for this// field.//// If the tag is unknown (or the wire type doesn't match), parses the field as// unknown.  If the tag is a valid ENDGROUP tag, jumps to the bytecode// instruction for the end of message.static int32_t dispatch(upb_pbdecoder *d) {  upb_inttable *dispatch = d->top->dispatch;  // Decode tag.  uint32_t tag;  CHECK_RETURN(decode_v32(d, &tag));  uint8_t wire_type = tag & 0x7;  uint32_t fieldnum = tag >> 3;  // Lookup tag.  Because of packed/non-packed compatibility, we have to  // check the wire type against two possibilities.  upb_value val;  if (fieldnum != DISPATCH_ENDMSG &&      upb_inttable_lookup32(dispatch, fieldnum, &val)) {    uint64_t v = upb_value_getuint64(val);    if (wire_type == (v & 0xff)) {      d->pc = d->top->base + (v >> 16);      return DECODE_OK;    } else if (wire_type == ((v >> 8) & 0xff)) {      bool found =          upb_inttable_lookup(dispatch, fieldnum + UPB_MAX_FIELDNUMBER, &val);      UPB_ASSERT_VAR(found, found);      d->pc = d->top->base + upb_value_getuint64(val);      return DECODE_OK;    }  }  // Unknown field or ENDGROUP.  int32_t ret = upb_pbdecoder_skipunknown(d, fieldnum, wire_type);  if (ret == DECODE_ENDGROUP) {    goto_endmsg(d);    return DECODE_OK;  } else {    d->pc = d->last - 1;  // Rewind to CHECKDELIM.    return ret;  }}// Callers know that the stack is more than one deep because the opcodes that// call this only occur after PUSH operations.upb_pbdecoder_frame *outer_frame(upb_pbdecoder *d) {  assert(d->top != d->stack);  return d->top - 1;}/* The main decoding loop *****************************************************/// The main decoder VM function.  Uses traditional bytecode dispatch loop with a// switch() statement.size_t upb_pbdecoder_decode(void *closure, const void *hd, const char *buf,                            size_t size, const upb_bufhandle *handle) {  upb_pbdecoder *d = closure;  const mgroup *group = hd;  assert(buf);  int32_t result = upb_pbdecoder_resume(d, NULL, buf, size, handle);  if (result == DECODE_ENDGROUP) {    goto_endmsg(d);  }  CHECK_RETURN(result);  UPB_UNUSED(group);#define VMCASE(op, code) \  case op: { code; if (consumes_input(op)) checkpoint(d); break; }#define PRIMITIVE_OP(type, wt, name, convfunc, ctype) \  VMCASE(OP_PARSE_ ## type, { \    ctype val; \    CHECK_RETURN(decode_ ## wt(d, &val)); \    upb_sink_put ## name(&d->top->sink, arg, (convfunc)(val)); \  })  while(1) {    d->last = d->pc;    int32_t instruction = *d->pc++;    opcode op = getop(instruction);    uint32_t arg = instruction >> 8;    int32_t longofs = arg;    assert(d->ptr != d->residual_end);#ifdef UPB_DUMP_BYTECODE    fprintf(stderr, "s_ofs=%d buf_ofs=%d data_rem=%d buf_rem=%d delim_rem=%d "                    "%x %s (%d)\n",            (int)offset(d),            (int)(d->ptr - d->buf),            (int)(d->data_end - d->ptr),            (int)(d->end - d->ptr),            (int)((d->top->end_ofs - d->bufstart_ofs) - (d->ptr - d->buf)),            (int)(d->pc - 1 - group->bytecode),            upb_pbdecoder_getopname(op),            arg);#endif    switch (op) {      // Technically, we are losing data if we see a 32-bit varint that is not      // properly sign-extended.  We could detect this and error about the data      // loss, but proto2 does not do this, so we pass.      PRIMITIVE_OP(INT32,    varint,  int32,  int32_t,      uint64_t)      PRIMITIVE_OP(INT64,    varint,  int64,  int64_t,      uint64_t)      PRIMITIVE_OP(UINT32,   varint,  uint32, uint32_t,     uint64_t)      PRIMITIVE_OP(UINT64,   varint,  uint64, uint64_t,     uint64_t)      PRIMITIVE_OP(FIXED32,  fixed32, uint32, uint32_t,     uint32_t)      PRIMITIVE_OP(FIXED64,  fixed64, uint64, uint64_t,     uint64_t)      PRIMITIVE_OP(SFIXED32, fixed32, int32,  int32_t,      uint32_t)      PRIMITIVE_OP(SFIXED64, fixed64, int64,  int64_t,      uint64_t)      PRIMITIVE_OP(BOOL,     varint,  bool,   bool,         uint64_t)      PRIMITIVE_OP(DOUBLE,   fixed64, double, as_double,    uint64_t)      PRIMITIVE_OP(FLOAT,    fixed32, float,  as_float,     uint32_t)      PRIMITIVE_OP(SINT32,   varint,  int32,  upb_zzdec_32, uint64_t)      PRIMITIVE_OP(SINT64,   varint,  int64,  upb_zzdec_64, uint64_t)      VMCASE(OP_SETDISPATCH,        d->top->base = d->pc - 1;        memcpy(&d->top->dispatch, d->pc, sizeof(void*));        d->pc += sizeof(void*) / sizeof(uint32_t);      )      VMCASE(OP_STARTMSG,        CHECK_SUSPEND(upb_sink_startmsg(&d->top->sink));      )      VMCASE(OP_ENDMSG,        CHECK_SUSPEND(upb_sink_endmsg(&d->top->sink, d->status));      )      VMCASE(OP_STARTSEQ,        upb_pbdecoder_frame *outer = outer_frame(d);        CHECK_SUSPEND(upb_sink_startseq(&outer->sink, arg, &d->top->sink));      )      VMCASE(OP_ENDSEQ,        CHECK_SUSPEND(upb_sink_endseq(&d->top->sink, arg));      )      VMCASE(OP_STARTSUBMSG,        upb_pbdecoder_frame *outer = outer_frame(d);        CHECK_SUSPEND(upb_sink_startsubmsg(&outer->sink, arg, &d->top->sink));      )      VMCASE(OP_ENDSUBMSG,        CHECK_SUSPEND(upb_sink_endsubmsg(&d->top->sink, arg));      )      VMCASE(OP_STARTSTR,        uint32_t len = d->top->end_ofs - offset(d);        upb_pbdecoder_frame *outer = outer_frame(d);        CHECK_SUSPEND(upb_sink_startstr(&outer->sink, arg, len, &d->top->sink));        if (len == 0) {          d->pc++;  // Skip OP_STRING.        }      )      VMCASE(OP_STRING,        uint32_t len = curbufleft(d);        size_t n = upb_sink_putstring(&d->top->sink, arg, d->ptr, len, handle);        if (n > len) {          if (n > d->top->end_ofs - offset(d)) {            seterr(d, "Tried to skip past end of string.");            return upb_pbdecoder_suspend(d);          } else {            int32_t ret = skip(d, n);            // This shouldn't return DECODE_OK, because n > len.            assert(ret >= 0);            return ret;          }        }        advance(d, n);        if (n < len || d->delim_end == NULL) {          // We aren't finished with this string yet.          d->pc--;  // Repeat OP_STRING.          if (n > 0) checkpoint(d);          return upb_pbdecoder_suspend(d);        }      )      VMCASE(OP_ENDSTR,        CHECK_SUSPEND(upb_sink_endstr(&d->top->sink, arg));      )      VMCASE(OP_PUSHTAGDELIM,        CHECK_SUSPEND(pushtagdelim(d, arg));      )      VMCASE(OP_SETBIGGROUPNUM,        d->top->groupnum = *d->pc++;      )      VMCASE(OP_POP,        assert(d->top > d->stack);        decoder_pop(d);      )      VMCASE(OP_PUSHLENDELIM,        uint32_t len;        CHECK_RETURN(decode_v32(d, &len));        CHECK_SUSPEND(decoder_push(d, offset(d) + len));        set_delim_end(d);      )      VMCASE(OP_SETDELIM,        set_delim_end(d);      )      VMCASE(OP_CHECKDELIM,        // We are guaranteed of this assert because we never allow ourselves to        // consume bytes beyond data_end, which covers delim_end when non-NULL.        assert(!(d->delim_end && d->ptr > d->delim_end));        if (d->ptr == d->delim_end)          d->pc += longofs;      )      VMCASE(OP_CALL,        d->callstack[d->call_len++] = d->pc;        d->pc += longofs;      )      VMCASE(OP_RET,        assert(d->call_len > 0);        d->pc = d->callstack[--d->call_len];      )      VMCASE(OP_BRANCH,        d->pc += longofs;      )      VMCASE(OP_TAG1,        CHECK_SUSPEND(curbufleft(d) > 0);        uint8_t expected = (arg >> 8) & 0xff;        if (*d->ptr == expected) {          advance(d, 1);        } else {          int8_t shortofs;         badtag:          shortofs = arg;          if (shortofs == LABEL_DISPATCH) {            CHECK_RETURN(dispatch(d));          } else {            d->pc += shortofs;            break; // Avoid checkpoint().          }        }      )      VMCASE(OP_TAG2,        CHECK_SUSPEND(curbufleft(d) > 0);        uint16_t expected = (arg >> 8) & 0xffff;        if (curbufleft(d) >= 2) {          uint16_t actual;          memcpy(&actual, d->ptr, 2);          if (expected == actual) {            advance(d, 2);          } else {            goto badtag;          }        } else {          int32_t result = upb_pbdecoder_checktag_slow(d, expected);          if (result == DECODE_MISMATCH) goto badtag;          if (result >= 0) return result;        }      )      VMCASE(OP_TAGN, {        uint64_t expected;        memcpy(&expected, d->pc, 8);        d->pc += 2;        int32_t result = upb_pbdecoder_checktag_slow(d, expected);        if (result == DECODE_MISMATCH) goto badtag;        if (result >= 0) return result;      })      VMCASE(OP_HALT, {        return size;      })    }  }}void *upb_pbdecoder_startbc(void *closure, const void *pc, size_t size_hint) {  upb_pbdecoder *d = closure;  UPB_UNUSED(size_hint);  d->call_len = 1;  d->pc = pc;  return d;}void *upb_pbdecoder_startjit(void *closure, const void *hd, size_t size_hint) {  UPB_UNUSED(hd);  UPB_UNUSED(size_hint);  upb_pbdecoder *d = closure;  d->call_len = 0;  return d;}bool upb_pbdecoder_end(void *closure, const void *handler_data) {  upb_pbdecoder *d = closure;  const upb_pbdecodermethod *method = handler_data;  if (d->residual_end > d->residual) {    seterr(d, "Unexpected EOF");    return false;  }  if (d->top->end_ofs != UINT64_MAX) {    seterr(d, "Unexpected EOF inside delimited string");    return false;  }  // Message ends here.  uint64_t end = offset(d);  d->top->end_ofs = end;  char dummy;#ifdef UPB_USE_JIT_X64  const mgroup *group = (const mgroup*)method->group;  if (group->jit_code) {    if (d->top != d->stack)      d->stack->end_ofs = 0;    group->jit_code(closure, method->code_base.ptr, &dummy, 0, NULL);  } else {#endif    d->stack->end_ofs = end;    const uint32_t *p = d->pc;    // Check the previous bytecode, but guard against beginning.    if (p != method->code_base.ptr) p--;    if (getop(*p) == OP_CHECKDELIM) {      // Rewind from OP_TAG* to OP_CHECKDELIM.      assert(getop(*d->pc) == OP_TAG1 ||             getop(*d->pc) == OP_TAG2 ||             getop(*d->pc) == OP_TAGN);      d->pc = p;    }    upb_pbdecoder_decode(closure, handler_data, &dummy, 0, NULL);#ifdef UPB_USE_JIT_X64  }#endif  if (d->call_len != 0) {    seterr(d, "Unexpected EOF");    return false;  }  return true;}void upb_pbdecoder_init(upb_pbdecoder *d, const upb_pbdecodermethod *m,                        upb_status *s) {  d->limit = &d->stack[UPB_DECODER_MAX_NESTING];  upb_bytessink_reset(&d->input_, &m->input_handler_, d);  d->method_ = m;  d->callstack[0] = &halt;  d->status = s;  upb_pbdecoder_reset(d);}void upb_pbdecoder_reset(upb_pbdecoder *d) {  d->top = d->stack;  d->top->end_ofs = UINT64_MAX;  d->top->groupnum = 0;  d->bufstart_ofs = 0;  d->ptr = d->residual;  d->buf = d->residual;  d->end = d->residual;  d->residual_end = d->residual;  d->call_len = 1;}uint64_t upb_pbdecoder_bytesparsed(const upb_pbdecoder *d) {  return offset(d);}// Not currently required, but to support outgrowing the static stack we need// this.void upb_pbdecoder_uninit(upb_pbdecoder *d) {  UPB_UNUSED(d);}const upb_pbdecodermethod *upb_pbdecoder_method(const upb_pbdecoder *d) {  return d->method_;}bool upb_pbdecoder_resetoutput(upb_pbdecoder *d, upb_sink* sink) {  // TODO(haberman): do we need to test whether the decoder is already on the  // stack (like calling this from within a callback)?  Should we support  // rebinding the output at all?  assert(sink);  if (d->method_->dest_handlers_) {    if (sink->handlers != d->method_->dest_handlers_)      return false;  }  upb_sink_reset(&d->top->sink, sink->handlers, sink->closure);  return true;}upb_bytessink *upb_pbdecoder_input(upb_pbdecoder *d) {  return &d->input_;}/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2014 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> * * Since we are implementing pure handlers (ie. without any out-of-band access * to pre-computed lengths), we have to buffer all submessages before we can * emit even their first byte. * * Not knowing the size of submessages also means we can't write a perfect * zero-copy implementation, even with buffering.  Lengths are stored as * varints, which means that we don't know how many bytes to reserve for the * length until we know what the length is. * * This leaves us with three main choices: * * 1. buffer all submessage data in a temporary buffer, then copy it exactly *    once into the output buffer. * * 2. attempt to buffer data directly into the output buffer, estimating how *    many bytes each length will take.  When our guesses are wrong, use *    memmove() to grow or shrink the allotted space. * * 3. buffer directly into the output buffer, allocating a max length *    ahead-of-time for each submessage length.  If we overallocated, we waste *    space, but no memcpy() or memmove() is required.  This approach requires *    defining a maximum size for submessages and rejecting submessages that *    exceed that size. * * (2) and (3) have the potential to have better performance, but they are more * complicated and subtle to implement: * *   (3) requires making an arbitrary choice of the maximum message size; it *       wastes space when submessages are shorter than this and fails *       completely when they are longer.  This makes it more finicky and *       requires configuration based on the input.  It also makes it impossible *       to perfectly match the output of reference encoders that always use the *       optimal amount of space for each length. * *   (2) requires guessing the the size upfront, and if multiple lengths are *       guessed wrong the minimum required number of memmove() operations may *       be complicated to compute correctly.  Implemented properly, it may have *       a useful amortized or average cost, but more investigation is required *       to determine this and what the optimal algorithm is to achieve it. * *   (1) makes you always pay for exactly one copy, but its implementation is *       the simplest and its performance is predictable. * * So for now, we implement (1) only.  If we wish to optimize later, we should * be able to do it without affecting users. * * The strategy is to buffer the segments of data that do *not* depend on * unknown lengths in one buffer, and keep a separate buffer of segment pointers * and lengths.  When the top-level submessage ends, we can go beginning to end, * alternating the writing of lengths with memcpy() of the rest of the data. * At the top level though, no buffering is required. */#include <stdlib.h>/* low-level buffering ********************************************************/// Low-level functions for interacting with the output buffer.// TODO(haberman): handle pushbackstatic void putbuf(upb_pb_encoder *e, const char *buf, size_t len) {  size_t n = upb_bytessink_putbuf(e->output_, e->subc, buf, len, NULL);  UPB_ASSERT_VAR(n, n == len);}static upb_pb_encoder_segment *top(upb_pb_encoder *e) {  return &e->segbuf[*e->top];}// Call to ensure that at least "bytes" bytes are available for writing at// e->ptr.  Returns false if the bytes could not be allocated.static bool reserve(upb_pb_encoder *e, size_t bytes) {  if ((e->limit - e->ptr) < bytes) {    size_t needed = bytes + (e->ptr - e->buf);    size_t old_size = e->limit - e->buf;    size_t new_size = old_size;    while (new_size < needed) {      new_size *= 2;    }    char *realloc_from = (e->buf == e->initbuf) ? NULL : e->buf;    char *new_buf = realloc(realloc_from, new_size);    if (new_buf == NULL) {      return false;    }    if (realloc_from == NULL) {      memcpy(new_buf, e->initbuf, old_size);    }    e->ptr = new_buf + (e->ptr - e->buf);    e->runbegin = new_buf + (e->runbegin - e->buf);    e->limit = new_buf + new_size;    e->buf = new_buf;  }  return true;}// Call when "bytes" bytes have been writte at e->ptr.  The caller *must* have// previously called reserve() with at least this many bytes.static void encoder_advance(upb_pb_encoder *e, size_t bytes) {  assert((e->limit - e->ptr) >= bytes);  e->ptr += bytes;}// Call when all of the bytes for a handler have been written.  Flushes the// bytes if possible and necessary, returning false if this failed.static bool commit(upb_pb_encoder *e) {  if (!e->top) {    // We aren't inside a delimited region.  Flush our accumulated bytes to    // the output.    //    // TODO(haberman): in the future we may want to delay flushing for    // efficiency reasons.    putbuf(e, e->buf, e->ptr - e->buf);    e->ptr = e->buf;  }  return true;}// Writes the given bytes to the buffer, handling reserve/advance.static bool encode_bytes(upb_pb_encoder *e, const void *data, size_t len) {  if (!reserve(e, len)) {    return false;  }  memcpy(e->ptr, data, len);  encoder_advance(e, len);  return true;}// Finish the current run by adding the run totals to the segment and message// length.static void accumulate(upb_pb_encoder *e) {  assert(e->ptr >= e->runbegin);  size_t run_len = e->ptr - e->runbegin;  e->segptr->seglen += run_len;  top(e)->msglen += run_len;  e->runbegin = e->ptr;}// Call to indicate the start of delimited region for which the full length is// not yet known.  All data will be buffered until the length is known.// Delimited regions may be nested; their lengths will all be tracked properly.static bool start_delim(upb_pb_encoder *e) {  if (e->top) {    // We are already buffering, advance to the next segment and push it on the    // stack.    accumulate(e);    if (++e->top == e->stacklimit) {      // TODO(haberman): grow stack?      return false;    }    if (++e->segptr == e->seglimit) {      upb_pb_encoder_segment *realloc_from =          (e->segbuf == e->seginitbuf) ? NULL : e->segbuf;      size_t old_size =          (e->seglimit - e->segbuf) * sizeof(upb_pb_encoder_segment);      size_t new_size = old_size * 2;      upb_pb_encoder_segment *new_buf = realloc(realloc_from, new_size);      if (new_buf == NULL) {        return false;      }      if (realloc_from == NULL) {        memcpy(new_buf, e->seginitbuf, old_size);      }      e->segptr = new_buf + (e->segptr - e->segbuf);      e->seglimit = new_buf + (new_size / sizeof(upb_pb_encoder_segment));      e->segbuf = new_buf;    }  } else {    // We were previously at the top level, start buffering.    e->segptr = e->segbuf;    e->top = e->stack;    e->runbegin = e->ptr;  }  *e->top = e->segptr - e->segbuf;  e->segptr->seglen = 0;  e->segptr->msglen = 0;  return true;}// Call to indicate the end of a delimited region.  We now know the length of// the delimited region.  If we are not nested inside any other delimited// regions, we can now emit all of the buffered data we accumulated.static bool end_delim(upb_pb_encoder *e) {  accumulate(e);  size_t msglen = top(e)->msglen;  if (e->top == e->stack) {    // All lengths are now available, emit all buffered data.    char buf[UPB_PB_VARINT_MAX_LEN];    upb_pb_encoder_segment *s;    const char *ptr = e->buf;    for (s = e->segbuf; s <= e->segptr; s++) {      size_t lenbytes = upb_vencode64(s->msglen, buf);      putbuf(e, buf, lenbytes);      putbuf(e, ptr, s->seglen);      ptr += s->seglen;    }    e->ptr = e->buf;    e->top = NULL;  } else {    // Need to keep buffering; propagate length info into enclosing submessages.    --e->top;    top(e)->msglen += msglen + upb_varint_size(msglen);  }  return true;}/* tag_t **********************************************************************/// A precomputed (pre-encoded) tag and length.typedef struct {  uint8_t bytes;  char tag[7];} tag_t;// Allocates a new tag for this field, and sets it in these handlerattr.static void new_tag(upb_handlers *h, const upb_fielddef *f, upb_wiretype_t wt,                    upb_handlerattr *attr) {  uint32_t n = upb_fielddef_number(f);  tag_t *tag = malloc(sizeof(tag_t));  tag->bytes = upb_vencode64((n << 3) | wt, tag->tag);  upb_handlerattr_init(attr);  upb_handlerattr_sethandlerdata(attr, tag);  upb_handlers_addcleanup(h, tag, free);}static bool encode_tag(upb_pb_encoder *e, const tag_t *tag) {  return encode_bytes(e, tag->tag, tag->bytes);}/* encoding of wire types *****************************************************/static bool encode_fixed64(upb_pb_encoder *e, uint64_t val) {  // TODO(haberman): byte-swap for big endian.  return encode_bytes(e, &val, sizeof(uint64_t));}static bool encode_fixed32(upb_pb_encoder *e, uint32_t val) {  // TODO(haberman): byte-swap for big endian.  return encode_bytes(e, &val, sizeof(uint32_t));}static bool encode_varint(upb_pb_encoder *e, uint64_t val) {  if (!reserve(e, UPB_PB_VARINT_MAX_LEN)) {    return false;  }  encoder_advance(e, upb_vencode64(val, e->ptr));  return true;}static uint64_t dbl2uint64(double d) {  uint64_t ret;  memcpy(&ret, &d, sizeof(uint64_t));  return ret;}static uint32_t flt2uint32(float d) {  uint32_t ret;  memcpy(&ret, &d, sizeof(uint32_t));  return ret;}/* encoding of proto types ****************************************************/static bool startmsg(void *c, const void *hd) {  upb_pb_encoder *e = c;  UPB_UNUSED(hd);  if (e->depth++ == 0) {    upb_bytessink_start(e->output_, 0, &e->subc);  }  return true;}static bool endmsg(void *c, const void *hd, upb_status *status) {  upb_pb_encoder *e = c;  UPB_UNUSED(hd);  UPB_UNUSED(status);  if (--e->depth == 0) {    upb_bytessink_end(e->output_);  }  return true;}static void *encode_startdelimfield(void *c, const void *hd) {  bool ok = encode_tag(c, hd) && commit(c) && start_delim(c);  return ok ? c : UPB_BREAK;}static bool encode_enddelimfield(void *c, const void *hd) {  UPB_UNUSED(hd);  return end_delim(c);}static void *encode_startgroup(void *c, const void *hd) {  return (encode_tag(c, hd) && commit(c)) ? c : UPB_BREAK;}static bool encode_endgroup(void *c, const void *hd) {  return encode_tag(c, hd) && commit(c);}static void *encode_startstr(void *c, const void *hd, size_t size_hint) {  UPB_UNUSED(size_hint);  return encode_startdelimfield(c, hd);}static size_t encode_strbuf(void *c, const void *hd, const char *buf,                            size_t len, const upb_bufhandle *h) {  UPB_UNUSED(hd);  UPB_UNUSED(h);  return encode_bytes(c, buf, len) ? len : 0;}#define T(type, ctype, convert, encode)                                  \  static bool encode_scalar_##type(void *e, const void *hd, ctype val) { \    return encode_tag(e, hd) && encode(e, (convert)(val)) && commit(e);  \  }                                                                      \  static bool encode_packed_##type(void *e, const void *hd, ctype val) { \    UPB_UNUSED(hd);                                                      \    return encode(e, (convert)(val));                                    \  }T(double,   double,   dbl2uint64,   encode_fixed64)T(float,    float,    flt2uint32,   encode_fixed32);T(int64,    int64_t,  uint64_t,     encode_varint);T(int32,    int32_t,  uint32_t,     encode_varint);T(fixed64,  uint64_t, uint64_t,     encode_fixed64);T(fixed32,  uint32_t, uint32_t,     encode_fixed32);T(bool,     bool,     bool,         encode_varint);T(uint32,   uint32_t, uint32_t,     encode_varint);T(uint64,   uint64_t, uint64_t,     encode_varint);T(enum,     int32_t,  uint32_t,     encode_varint);T(sfixed32, int32_t,  uint32_t,     encode_fixed32);T(sfixed64, int64_t,  uint64_t,     encode_fixed64);T(sint32,   int32_t,  upb_zzenc_32, encode_varint);T(sint64,   int64_t,  upb_zzenc_64, encode_varint);#undef T/* code to build the handlers *************************************************/static void newhandlers_callback(const void *closure, upb_handlers *h) {  UPB_UNUSED(closure);  upb_handlers_setstartmsg(h, startmsg, NULL);  upb_handlers_setendmsg(h, endmsg, NULL);  const upb_msgdef *m = upb_handlers_msgdef(h);  upb_msg_iter i;  for(upb_msg_begin(&i, m); !upb_msg_done(&i); upb_msg_next(&i)) {    const upb_fielddef *f = upb_msg_iter_field(&i);    bool packed = upb_fielddef_isseq(f) && upb_fielddef_isprimitive(f) &&                  upb_fielddef_packed(f);    upb_handlerattr attr;    upb_wiretype_t wt =        packed ? UPB_WIRE_TYPE_DELIMITED               : upb_pb_native_wire_types[upb_fielddef_descriptortype(f)];    // Pre-encode the tag for this field.    new_tag(h, f, wt, &attr);    if (packed) {      upb_handlers_setstartseq(h, f, encode_startdelimfield, &attr);      upb_handlers_setendseq(h, f, encode_enddelimfield, &attr);    }#define T(upper, lower, upbtype)                                     \  case UPB_DESCRIPTOR_TYPE_##upper:                                  \    if (packed) {                                                    \      upb_handlers_set##upbtype(h, f, encode_packed_##lower, &attr); \    } else {                                                         \      upb_handlers_set##upbtype(h, f, encode_scalar_##lower, &attr); \    }                                                                \    break;    switch (upb_fielddef_descriptortype(f)) {      T(DOUBLE,   double,   double);      T(FLOAT,    float,    float);      T(INT64,    int64,    int64);      T(INT32,    int32,    int32);      T(FIXED64,  fixed64,  uint64);      T(FIXED32,  fixed32,  uint32);      T(BOOL,     bool,     bool);      T(UINT32,   uint32,   uint32);      T(UINT64,   uint64,   uint64);      T(ENUM,     enum,     int32);      T(SFIXED32, sfixed32, int32);      T(SFIXED64, sfixed64, int64);      T(SINT32,   sint32,   int32);      T(SINT64,   sint64,   int64);      case UPB_DESCRIPTOR_TYPE_STRING:      case UPB_DESCRIPTOR_TYPE_BYTES:        upb_handlers_setstartstr(h, f, encode_startstr, &attr);        upb_handlers_setendstr(h, f, encode_enddelimfield, &attr);        upb_handlers_setstring(h, f, encode_strbuf, &attr);        break;      case UPB_DESCRIPTOR_TYPE_MESSAGE:        upb_handlers_setstartsubmsg(h, f, encode_startdelimfield, &attr);        upb_handlers_setendsubmsg(h, f, encode_enddelimfield, &attr);        break;      case UPB_DESCRIPTOR_TYPE_GROUP: {        // Endgroup takes a different tag (wire_type = END_GROUP).        upb_handlerattr attr2;        new_tag(h, f, UPB_WIRE_TYPE_END_GROUP, &attr2);        upb_handlers_setstartsubmsg(h, f, encode_startgroup, &attr);        upb_handlers_setendsubmsg(h, f, encode_endgroup, &attr2);        upb_handlerattr_uninit(&attr2);        break;      }    }#undef T    upb_handlerattr_uninit(&attr);  }}/* public API *****************************************************************/const upb_handlers *upb_pb_encoder_newhandlers(const upb_msgdef *m,                                               const void *owner) {  return upb_handlers_newfrozen(m, owner, newhandlers_callback, NULL);}#define ARRAYSIZE(x) (sizeof(x) / sizeof(x[0]))void upb_pb_encoder_init(upb_pb_encoder *e, const upb_handlers *h) {  e->output_ = NULL;  e->subc = NULL;  e->buf = e->initbuf;  e->ptr = e->buf;  e->limit = e->buf + ARRAYSIZE(e->initbuf);  e->segbuf = e->seginitbuf;  e->seglimit = e->segbuf + ARRAYSIZE(e->seginitbuf);  e->stacklimit = e->stack + ARRAYSIZE(e->stack);  upb_sink_reset(&e->input_, h, e);}void upb_pb_encoder_uninit(upb_pb_encoder *e) {  if (e->buf != e->initbuf) {    free(e->buf);  }  if (e->segbuf != e->seginitbuf) {    free(e->segbuf);  }}void upb_pb_encoder_resetoutput(upb_pb_encoder *e, upb_bytessink *output) {  upb_pb_encoder_reset(e);  e->output_ = output;  e->subc = output->closure;}void upb_pb_encoder_reset(upb_pb_encoder *e) {  e->segptr = NULL;  e->top = NULL;  e->depth = 0;}upb_sink *upb_pb_encoder_input(upb_pb_encoder *e) { return &e->input_; }/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2010-2012 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> */#include <stdio.h>#include <stdlib.h>#include <string.h>upb_def **upb_load_defs_from_descriptor(const char *str, size_t len, int *n,                                        void *owner, upb_status *status) {  // Create handlers.  const upb_handlers *reader_h = upb_descreader_newhandlers(&reader_h);  upb_pbdecodermethodopts opts;  upb_pbdecodermethodopts_init(&opts, reader_h);  const upb_pbdecodermethod *decoder_m =      upb_pbdecodermethod_new(&opts, &decoder_m);  upb_pbdecoder decoder;  upb_descreader reader;  upb_pbdecoder_init(&decoder, decoder_m, status);  upb_descreader_init(&reader, reader_h, status);  upb_pbdecoder_resetoutput(&decoder, upb_descreader_input(&reader));  // Push input data.  bool ok = upb_bufsrc_putbuf(str, len, upb_pbdecoder_input(&decoder));  upb_def **ret = NULL;  if (!ok) goto cleanup;  upb_def **defs = upb_descreader_getdefs(&reader, owner, n);  ret = malloc(sizeof(upb_def*) * (*n));  memcpy(ret, defs, sizeof(upb_def*) * (*n));cleanup:  upb_pbdecoder_uninit(&decoder);  upb_descreader_uninit(&reader);  upb_handlers_unref(reader_h, &reader_h);  upb_pbdecodermethod_unref(decoder_m, &decoder_m);  return ret;}bool upb_load_descriptor_into_symtab(upb_symtab *s, const char *str, size_t len,                                     upb_status *status) {  int n;  upb_def **defs = upb_load_defs_from_descriptor(str, len, &n, &defs, status);  if (!defs) return false;  bool success = upb_symtab_add(s, defs, n, &defs, status);  free(defs);  return success;}char *upb_readfile(const char *filename, size_t *len) {  FILE *f = fopen(filename, "rb");  if(!f) return NULL;  if(fseek(f, 0, SEEK_END) != 0) goto error;  long size = ftell(f);  if(size < 0) goto error;  if(fseek(f, 0, SEEK_SET) != 0) goto error;  char *buf = malloc(size + 1);  if(size && fread(buf, size, 1, f) != 1) goto error;  fclose(f);  if (len) *len = size;  return buf;error:  fclose(f);  return NULL;}bool upb_load_descriptor_file_into_symtab(upb_symtab *symtab, const char *fname,                                          upb_status *status) {  size_t len;  char *data = upb_readfile(fname, &len);  if (!data) {    if (status) upb_status_seterrf(status, "Couldn't read file: %s", fname);    return false;  }  bool success = upb_load_descriptor_into_symtab(symtab, data, len, status);  free(data);  return success;}/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2009 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> * * OPT: This is not optimized at all.  It uses printf() which parses the format * string every time, and it allocates memory for every put. */#include <ctype.h>#include <float.h>#include <inttypes.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define CHECK(x) if ((x) < 0) goto err;static const char *shortname(const char *longname) {  const char *last = strrchr(longname, '.');  return last ? last + 1 : longname;}static int indent(upb_textprinter *p) {  int i;  if (!p->single_line_)    for (i = 0; i < p->indent_depth_; i++)      upb_bytessink_putbuf(p->output_, p->subc, "  ", 2, NULL);  return 0;}static int endfield(upb_textprinter *p) {  const char ch = (p->single_line_ ? ' ' : '\n');  upb_bytessink_putbuf(p->output_, p->subc, &ch, 1, NULL);  return 0;}static int putescaped(upb_textprinter *p, const char *buf, size_t len,                      bool preserve_utf8) {  // Based on CEscapeInternal() from Google's protobuf release.  char dstbuf[4096], *dst = dstbuf, *dstend = dstbuf + sizeof(dstbuf);  const char *end = buf + len;  // I think hex is prettier and more useful, but proto2 uses octal; should  // investigate whether it can parse hex also.  const bool use_hex = false;  bool last_hex_escape = false; // true if last output char was \xNN  for (; buf < end; buf++) {    if (dstend - dst < 4) {      upb_bytessink_putbuf(p->output_, p->subc, dstbuf, dst - dstbuf, NULL);      dst = dstbuf;    }    bool is_hex_escape = false;    switch (*buf) {      case '\n': *(dst++) = '\\'; *(dst++) = 'n';  break;      case '\r': *(dst++) = '\\'; *(dst++) = 'r';  break;      case '\t': *(dst++) = '\\'; *(dst++) = 't';  break;      case '\"': *(dst++) = '\\'; *(dst++) = '\"'; break;      case '\'': *(dst++) = '\\'; *(dst++) = '\''; break;      case '\\': *(dst++) = '\\'; *(dst++) = '\\'; break;      default:        // Note that if we emit \xNN and the buf character after that is a hex        // digit then that digit must be escaped too to prevent it being        // interpreted as part of the character code by C.        if ((!preserve_utf8 || (uint8_t)*buf < 0x80) &&            (!isprint(*buf) || (last_hex_escape && isxdigit(*buf)))) {          sprintf(dst, (use_hex ? "\\x%02x" : "\\%03o"), (uint8_t)*buf);          is_hex_escape = use_hex;          dst += 4;        } else {          *(dst++) = *buf; break;        }    }    last_hex_escape = is_hex_escape;  }  // Flush remaining data.  upb_bytessink_putbuf(p->output_, p->subc, dstbuf, dst - dstbuf, NULL);  return 0;}bool putf(upb_textprinter *p, const char *fmt, ...) {  va_list args;  va_start(args, fmt);  // Run once to get the length of the string.  va_list args_copy;  va_copy(args_copy, args);  int len = vsnprintf(NULL, 0, fmt, args_copy);  va_end(args_copy);  // + 1 for NULL terminator (vsnprintf() requires it even if we don't).  char *str = malloc(len + 1);  if (!str) return false;  int written = vsnprintf(str, len + 1, fmt, args);  va_end(args);  UPB_ASSERT_VAR(written, written == len);  bool ok = upb_bytessink_putbuf(p->output_, p->subc, str, len, NULL);  free(str);  return ok;}/* handlers *******************************************************************/static bool textprinter_startmsg(void *c, const void *hd) {  UPB_UNUSED(hd);  upb_textprinter *p = c;  if (p->indent_depth_ == 0) {    upb_bytessink_start(p->output_, 0, &p->subc);  }  return true;}static bool textprinter_endmsg(void *c, const void *hd, upb_status *s) {  UPB_UNUSED(hd);  UPB_UNUSED(s);  upb_textprinter *p = c;  if (p->indent_depth_ == 0) {    upb_bytessink_end(p->output_);  }  return true;}#define TYPE(name, ctype, fmt) \  static bool textprinter_put ## name(void *closure, const void *handler_data, \                                      ctype val) {                             \    upb_textprinter *p = closure;                                              \    const upb_fielddef *f = handler_data;                                      \    CHECK(indent(p));                                                          \    putf(p, "%s: " fmt, upb_fielddef_name(f), val);                            \    CHECK(endfield(p));                                                        \    return true;                                                               \  err:                                                                         \    return false;                                                              \}static bool textprinter_putbool(void *closure, const void *handler_data,                                bool val) {  upb_textprinter *p = closure;  const upb_fielddef *f = handler_data;  CHECK(indent(p));  putf(p, "%s: %s", upb_fielddef_name(f), val ? "true" : "false");  CHECK(endfield(p));  return true;err:  return false;}#define STRINGIFY_HELPER(x) #x#define STRINGIFY_MACROVAL(x) STRINGIFY_HELPER(x)TYPE(int32,  int32_t,  "%" PRId32)TYPE(int64,  int64_t,  "%" PRId64)TYPE(uint32, uint32_t, "%" PRIu32);TYPE(uint64, uint64_t, "%" PRIu64)TYPE(float,  float,    "%." STRINGIFY_MACROVAL(FLT_DIG) "g")TYPE(double, double,   "%." STRINGIFY_MACROVAL(DBL_DIG) "g")#undef TYPE// Output a symbolic value from the enum if found, else just print as int32.static bool textprinter_putenum(void *closure, const void *handler_data,                                int32_t val) {  upb_textprinter *p = closure;  const upb_fielddef *f = handler_data;  const upb_enumdef *enum_def = upb_downcast_enumdef(upb_fielddef_subdef(f));  const char *label = upb_enumdef_iton(enum_def, val);  if (label) {    indent(p);    putf(p, "%s: %s", upb_fielddef_name(f), label);    endfield(p);  } else {    if (!textprinter_putint32(closure, handler_data, val))      return false;  }  return true;}static void *textprinter_startstr(void *closure, const void *handler_data,                      size_t size_hint) {  const upb_fielddef *f = handler_data;  UPB_UNUSED(size_hint);  upb_textprinter *p = closure;  indent(p);  putf(p, "%s: \"", upb_fielddef_name(f));  return p;}static bool textprinter_endstr(void *closure, const void *handler_data) {  UPB_UNUSED(handler_data);  upb_textprinter *p = closure;  putf(p, "\"");  endfield(p);  return true;}static size_t textprinter_putstr(void *closure, const void *hd, const char *buf,                                 size_t len, const upb_bufhandle *handle) {  UPB_UNUSED(handle);  upb_textprinter *p = closure;  const upb_fielddef *f = hd;  CHECK(putescaped(p, buf, len, upb_fielddef_type(f) == UPB_TYPE_STRING));  return len;err:  return 0;}static void *textprinter_startsubmsg(void *closure, const void *handler_data) {  upb_textprinter *p = closure;  const char *name = handler_data;  CHECK(indent(p));  putf(p, "%s {%c", name, p->single_line_ ? ' ' : '\n');  p->indent_depth_++;  return p;err:  return UPB_BREAK;}static bool textprinter_endsubmsg(void *closure, const void *handler_data) {  UPB_UNUSED(handler_data);  upb_textprinter *p = closure;  p->indent_depth_--;  CHECK(indent(p));  upb_bytessink_putbuf(p->output_, p->subc, "}", 1, NULL);  CHECK(endfield(p));  return true;err:  return false;}/* Public API *****************************************************************/void upb_textprinter_init(upb_textprinter *p, const upb_handlers *h) {  p->single_line_ = false;  p->indent_depth_ = 0;  upb_sink_reset(&p->input_, h, p);}void upb_textprinter_uninit(upb_textprinter *p) {  UPB_UNUSED(p);}void upb_textprinter_reset(upb_textprinter *p, bool single_line) {  p->single_line_ = single_line;  p->indent_depth_ = 0;}static void onmreg(const void *c, upb_handlers *h) {  UPB_UNUSED(c);  const upb_msgdef *m = upb_handlers_msgdef(h);  upb_handlers_setstartmsg(h, textprinter_startmsg, NULL);  upb_handlers_setendmsg(h, textprinter_endmsg, NULL);  upb_msg_iter i;  for(upb_msg_begin(&i, m); !upb_msg_done(&i); upb_msg_next(&i)) {    upb_fielddef *f = upb_msg_iter_field(&i);    upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;    upb_handlerattr_sethandlerdata(&attr, f);    switch (upb_fielddef_type(f)) {      case UPB_TYPE_INT32:        upb_handlers_setint32(h, f, textprinter_putint32, &attr);        break;      case UPB_TYPE_INT64:        upb_handlers_setint64(h, f, textprinter_putint64, &attr);        break;      case UPB_TYPE_UINT32:        upb_handlers_setuint32(h, f, textprinter_putuint32, &attr);        break;      case UPB_TYPE_UINT64:        upb_handlers_setuint64(h, f, textprinter_putuint64, &attr);        break;      case UPB_TYPE_FLOAT:        upb_handlers_setfloat(h, f, textprinter_putfloat, &attr);        break;      case UPB_TYPE_DOUBLE:        upb_handlers_setdouble(h, f, textprinter_putdouble, &attr);        break;      case UPB_TYPE_BOOL:        upb_handlers_setbool(h, f, textprinter_putbool, &attr);        break;      case UPB_TYPE_STRING:      case UPB_TYPE_BYTES:        upb_handlers_setstartstr(h, f, textprinter_startstr, &attr);        upb_handlers_setstring(h, f, textprinter_putstr, &attr);        upb_handlers_setendstr(h, f, textprinter_endstr, &attr);        break;      case UPB_TYPE_MESSAGE: {        const char *name =            upb_fielddef_istagdelim(f)                ? shortname(upb_msgdef_fullname(upb_fielddef_msgsubdef(f)))                : upb_fielddef_name(f);        upb_handlerattr_sethandlerdata(&attr, name);        upb_handlers_setstartsubmsg(h, f, textprinter_startsubmsg, &attr);        upb_handlers_setendsubmsg(h, f, textprinter_endsubmsg, &attr);        break;      }      case UPB_TYPE_ENUM:        upb_handlers_setint32(h, f, textprinter_putenum, &attr);        break;    }  }}const upb_handlers *upb_textprinter_newhandlers(const upb_msgdef *m,                                                const void *owner) {  return upb_handlers_newfrozen(m, owner, &onmreg, NULL);}upb_sink *upb_textprinter_input(upb_textprinter *p) { return &p->input_; }bool upb_textprinter_resetoutput(upb_textprinter *p, upb_bytessink *output) {  p->output_ = output;  return true;}void upb_textprinter_setsingleline(upb_textprinter *p, bool single_line) {  p->single_line_ = single_line;}/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2011 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> */// Index is descriptor type.const uint8_t upb_pb_native_wire_types[] = {  UPB_WIRE_TYPE_END_GROUP,     // ENDGROUP  UPB_WIRE_TYPE_64BIT,         // DOUBLE  UPB_WIRE_TYPE_32BIT,         // FLOAT  UPB_WIRE_TYPE_VARINT,        // INT64  UPB_WIRE_TYPE_VARINT,        // UINT64  UPB_WIRE_TYPE_VARINT,        // INT32  UPB_WIRE_TYPE_64BIT,         // FIXED64  UPB_WIRE_TYPE_32BIT,         // FIXED32  UPB_WIRE_TYPE_VARINT,        // BOOL  UPB_WIRE_TYPE_DELIMITED,     // STRING  UPB_WIRE_TYPE_START_GROUP,   // GROUP  UPB_WIRE_TYPE_DELIMITED,     // MESSAGE  UPB_WIRE_TYPE_DELIMITED,     // BYTES  UPB_WIRE_TYPE_VARINT,        // UINT32  UPB_WIRE_TYPE_VARINT,        // ENUM  UPB_WIRE_TYPE_32BIT,         // SFIXED32  UPB_WIRE_TYPE_64BIT,         // SFIXED64  UPB_WIRE_TYPE_VARINT,        // SINT32  UPB_WIRE_TYPE_VARINT,        // SINT64};// A basic branch-based decoder, uses 32-bit values to get good performance// on 32-bit architectures (but performs well on 64-bits also).// This scheme comes from the original Google Protobuf implementation (proto2).upb_decoderet upb_vdecode_max8_branch32(upb_decoderet r) {  upb_decoderet err = {NULL, 0};  const char *p = r.p;  uint32_t low = (uint32_t)r.val;  uint32_t high = 0;  uint32_t b;  b = *(p++); low  |= (b & 0x7fU) << 14; if (!(b & 0x80)) goto done;  b = *(p++); low  |= (b & 0x7fU) << 21; if (!(b & 0x80)) goto done;  b = *(p++); low  |= (b & 0x7fU) << 28;              high  = (b & 0x7fU) >>  4; if (!(b & 0x80)) goto done;  b = *(p++); high |= (b & 0x7fU) <<  3; if (!(b & 0x80)) goto done;  b = *(p++); high |= (b & 0x7fU) << 10; if (!(b & 0x80)) goto done;  b = *(p++); high |= (b & 0x7fU) << 17; if (!(b & 0x80)) goto done;  b = *(p++); high |= (b & 0x7fU) << 24; if (!(b & 0x80)) goto done;  b = *(p++); high |= (b & 0x7fU) << 31; if (!(b & 0x80)) goto done;  return err;done:  r.val = ((uint64_t)high << 32) | low;  r.p = p;  return r;}// Like the previous, but uses 64-bit values.upb_decoderet upb_vdecode_max8_branch64(upb_decoderet r) {  const char *p = r.p;  uint64_t val = r.val;  uint64_t b;  upb_decoderet err = {NULL, 0};  b = *(p++); val |= (b & 0x7fU) << 14; if (!(b & 0x80)) goto done;  b = *(p++); val |= (b & 0x7fU) << 21; if (!(b & 0x80)) goto done;  b = *(p++); val |= (b & 0x7fU) << 28; if (!(b & 0x80)) goto done;  b = *(p++); val |= (b & 0x7fU) << 35; if (!(b & 0x80)) goto done;  b = *(p++); val |= (b & 0x7fU) << 42; if (!(b & 0x80)) goto done;  b = *(p++); val |= (b & 0x7fU) << 49; if (!(b & 0x80)) goto done;  b = *(p++); val |= (b & 0x7fU) << 56; if (!(b & 0x80)) goto done;  b = *(p++); val |= (b & 0x7fU) << 63; if (!(b & 0x80)) goto done;  return err;done:  r.val = val;  r.p = p;  return r;}// Given an encoded varint v, returns an integer with a single bit set that// indicates the end of the varint.  Subtracting one from this value will// yield a mask that leaves only bits that are part of the varint.  Returns// 0 if the varint is unterminated.static uint64_t upb_get_vstopbit(uint64_t v) {  uint64_t cbits = v | 0x7f7f7f7f7f7f7f7fULL;  return ~cbits & (cbits+1);}// A branchless decoder.  Credit to Pascal Massimino for the bit-twiddling.upb_decoderet upb_vdecode_max8_massimino(upb_decoderet r) {  uint64_t b;  memcpy(&b, r.p, sizeof(b));  uint64_t stop_bit = upb_get_vstopbit(b);  b =  (b & 0x7f7f7f7f7f7f7f7fULL) & (stop_bit - 1);  b +=       b & 0x007f007f007f007fULL;  b +=  3 * (b & 0x0000ffff0000ffffULL);  b += 15 * (b & 0x00000000ffffffffULL);  if (stop_bit == 0) {    // Error: unterminated varint.    upb_decoderet err_r = {(void*)0, 0};    return err_r;  }  upb_decoderet my_r = {r.p + ((__builtin_ctzll(stop_bit) + 1) / 8),                        r.val | (b << 7)};  return my_r;}// A branchless decoder.  Credit to Daniel Wright for the bit-twiddling.upb_decoderet upb_vdecode_max8_wright(upb_decoderet r) {  uint64_t b;  memcpy(&b, r.p, sizeof(b));  uint64_t stop_bit = upb_get_vstopbit(b);  b &= (stop_bit - 1);  b = ((b & 0x7f007f007f007f00ULL) >> 1) | (b & 0x007f007f007f007fULL);  b = ((b & 0xffff0000ffff0000ULL) >> 2) | (b & 0x0000ffff0000ffffULL);  b = ((b & 0xffffffff00000000ULL) >> 4) | (b & 0x00000000ffffffffULL);  if (stop_bit == 0) {    // Error: unterminated varint.    upb_decoderet err_r = {(void*)0, 0};    return err_r;  }  upb_decoderet my_r = {r.p + ((__builtin_ctzll(stop_bit) + 1) / 8),                        r.val | (b << 14)};  return my_r;}#line 1 "upb/json/parser.rl"/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2014 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> * * 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 <stdio.h>#include <stdint.h>#include <assert.h>#include <string.h>#include <stdlib.h>#include <errno.h>#define PARSER_CHECK_RETURN(x) if (!(x)) return falsestatic 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_VAR(ok, 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 void start_member(upb_json_parser *p) {  assert(!p->top->f);  assert(!p->accumulated);  p->accumulated_len = 0;}static bool end_member(upb_json_parser *p) {  // TODO(haberman): support keys that span buffers or have escape sequences.  assert(!p->top->f);  assert(p->accumulated);  const upb_fielddef *f =      upb_msgdef_ntof(p->top->m, p->accumulated, p->accumulated_len);  if (!f) {    // TODO(haberman): Ignore unknown fields if requested/configured to do so.    upb_status_seterrf(p->status, "No such field: %.*s\n",                       (int)p->accumulated_len, p->accumulated);    return false;  }  p->top->f = f;  p->accumulated = NULL;  return true;}static void start_object(upb_json_parser *p) {  upb_sink_startmsg(&p->top->sink);}static void end_object(upb_json_parser *p) {  upb_status status;  upb_sink_endmsg(&p->top->sink, &status);}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 bool start_subobject(upb_json_parser *p) {  assert(p->top->f);  if (!upb_fielddef_issubmsg(p->top->f)) {    upb_status_seterrf(p->status,                       "Object specified for non-message/group field: %s",                       upb_fielddef_name(p->top->f));    return false;  }  if (!check_stack(p)) return false;  upb_jsonparser_frame *inner = p->top + 1;  upb_selector_t 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);  inner->f = NULL;  p->top = inner;  return true;}static void end_subobject(upb_json_parser *p) {  p->top--;  upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSUBMSG);  upb_sink_endsubmsg(&p->top->sink, sel);}static bool start_array(upb_json_parser *p) {  assert(p->top->f);  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;  upb_jsonparser_frame *inner = p->top + 1;  upb_selector_t 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;  p->top = inner;  return true;}static void end_array(upb_json_parser *p) {  assert(p->top > p->stack);  p->top--;  upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSEQ);  upb_sink_endseq(&p->top->sink, sel);}static void clear_member(upb_json_parser *p) { p->top->f = NULL; }static bool parser_putbool(upb_json_parser *p, bool val) {  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;  }  bool ok = upb_sink_putbool(&p->top->sink, parser_getsel(p), val);  UPB_ASSERT_VAR(ok, ok);  return true;}static void start_text(upb_json_parser *p, const char *ptr) {  p->text_begin = ptr;}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) {    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;    }    uint32_t 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;    }    char output[3];    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] == '=') {    // Last group contains only two input bytes, one output byte.    if (ptr[0] == '=' || ptr[1] == '=' || ptr[3] != '=') {      goto badpadding;    }    uint32_t val = b64lookup(ptr[0]) << 18 |                   b64lookup(ptr[1]) << 12;    assert(!(val & 0x80000000));    char output = val >> 16;    upb_sink_putstring(&p->top->sink, sel, &output, 1, NULL);    return true;  } else {    // Last group contains only three input bytes, two output bytes.    if (ptr[0] == '=' || ptr[1] == '=' || ptr[2] == '=') {      goto badpadding;    }    uint32_t val = b64lookup(ptr[0]) << 18 |                   b64lookup(ptr[1]) << 12 |                   b64lookup(ptr[2]) << 6;    char output[2];    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;}static bool end_text(upb_json_parser *p, const char *ptr, bool is_num) {  assert(!p->accumulated);  // TODO: handle this case.  p->accumulated = p->text_begin;  p->accumulated_len = ptr - p->text_begin;  if (p->top->f && upb_fielddef_isstring(p->top->f)) {    // This is a string field (as opposed to a member name).    upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_STRING);    if (upb_fielddef_type(p->top->f) == UPB_TYPE_BYTES) {      PARSER_CHECK_RETURN(base64_push(p, sel, p->accumulated,                                      p->accumulated_len));    } else {      upb_sink_putstring(&p->top->sink, sel, p->accumulated, p->accumulated_len, NULL);    }    p->accumulated = NULL;  } else if (p->top->f &&             upb_fielddef_type(p->top->f) == UPB_TYPE_ENUM &&             !is_num) {    // Enum case: resolve enum symbolic name to integer value.    const upb_enumdef *enumdef =        (const upb_enumdef*)upb_fielddef_subdef(p->top->f);    int32_t int_val = 0;    if (upb_enumdef_ntoi(enumdef, p->accumulated, p->accumulated_len,                         &int_val)) {      upb_selector_t sel = parser_getsel(p);      upb_sink_putint32(&p->top->sink, sel, int_val);    } else {      upb_status_seterrmsg(p->status, "Enum value name unknown");      return false;    }    p->accumulated = NULL;  }  return true;}static bool start_stringval(upb_json_parser *p) {  assert(p->top->f);  if (upb_fielddef_isstring(p->top->f)) {    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.    upb_jsonparser_frame *inner = p->top + 1;    upb_selector_t 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;    return true;  } else if (upb_fielddef_type(p->top->f) == UPB_TYPE_ENUM) {    // Do nothing -- symbolic enum names in quotes remain in the    // current parser frame.    return true;  } else {    upb_status_seterrf(p->status,                       "String specified for non-string/non-enum field: %s",                       upb_fielddef_name(p->top->f));    return false;  }}static void end_stringval(upb_json_parser *p) {  if (upb_fielddef_isstring(p->top->f)) {    upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSTR);    upb_sink_endstr(&p->top->sink, sel);    p->top--;  }}static void start_number(upb_json_parser *p, const char *ptr) {  start_text(p, ptr);  assert(p->accumulated == NULL);}static void end_number(upb_json_parser *p, const char *ptr) {  end_text(p, ptr, true);  const char *myend = p->accumulated + p->accumulated_len;  char *end;  switch (upb_fielddef_type(p->top->f)) {    case UPB_TYPE_ENUM:    case UPB_TYPE_INT32: {      long val = strtol(p->accumulated, &end, 0);      if (val > INT32_MAX || val < INT32_MIN || errno == ERANGE || end != myend)        assert(false);      else        upb_sink_putint32(&p->top->sink, parser_getsel(p), val);      break;    }    case UPB_TYPE_INT64: {      long long val = strtoll(p->accumulated, &end, 0);      if (val > INT64_MAX || val < INT64_MIN || errno == ERANGE || end != myend)        assert(false);      else        upb_sink_putint64(&p->top->sink, parser_getsel(p), val);      break;    }    case UPB_TYPE_UINT32: {      unsigned long val = strtoul(p->accumulated, &end, 0);      if (val > UINT32_MAX || errno == ERANGE || end != myend)        assert(false);      else        upb_sink_putuint32(&p->top->sink, parser_getsel(p), val);      break;    }    case UPB_TYPE_UINT64: {      unsigned long long val = strtoull(p->accumulated, &end, 0);      if (val > UINT64_MAX || errno == ERANGE || end != myend)        assert(false);      else        upb_sink_putuint64(&p->top->sink, parser_getsel(p), val);      break;    }    case UPB_TYPE_DOUBLE: {      double val = strtod(p->accumulated, &end);      if (errno == ERANGE || end != myend)        assert(false);      else        upb_sink_putdouble(&p->top->sink, parser_getsel(p), val);      break;    }    case UPB_TYPE_FLOAT: {      float val = strtof(p->accumulated, &end);      if (errno == ERANGE || end != myend)        assert(false);      else        upb_sink_putfloat(&p->top->sink, parser_getsel(p), val);      break;    }    default:      assert(false);  }  p->accumulated = NULL;}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:      assert(0);      return 'x';  }}static void escape(upb_json_parser *p, const char *ptr) {  char ch = escape_char(*ptr);  upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_STRING);  upb_sink_putstring(&p->top->sink, sel, &ch, 1, NULL);}static uint8_t hexdigit(char ch) {  if (ch >= '0' && ch <= '9') {    return ch - '0';  } else if (ch >= 'a' && ch <= 'f') {    return ch - 'a' + 10;  } else {    assert(ch >= 'A' && ch <= 'F');    return ch - 'A' + 10;  }}static void start_hex(upb_json_parser *p, const char *ptr) {  start_text(p, ptr);}static void hex(upb_json_parser *p, const char *end) {  const char *start = p->text_begin;  UPB_ASSERT_VAR(end, end - start == 4);  uint16_t codepoint =      (hexdigit(start[0]) << 12) |      (hexdigit(start[1]) << 8) |      (hexdigit(start[2]) << 4) |      hexdigit(start[3]);  // 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).  upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_STRING);  upb_sink_putstring(&p->top->sink, sel, utf8, length, NULL);}#define CHECK_RETURN_TOP(x) if (!(x)) goto error// What follows is the Ragel parser itself.  The language is specified in Ragel// and the actions call our C functions above.#line 596 "upb/json/parser.rl"#line 514 "upb/json/parser.c"static const char _json_actions[] = {	0, 1, 0, 1, 2, 1, 3, 1, 	4, 1, 5, 1, 6, 1, 7, 1, 	9, 1, 11, 1, 12, 1, 13, 1, 	14, 1, 15, 1, 16, 1, 24, 1, 	26, 2, 3, 7, 2, 5, 2, 2, 	5, 7, 2, 10, 8, 2, 12, 14, 	2, 13, 14, 2, 17, 1, 2, 18, 	26, 2, 19, 8, 2, 20, 26, 2, 	21, 26, 2, 22, 26, 2, 23, 26, 	2, 25, 26, 3, 13, 10, 8};static const unsigned char _json_key_offsets[] = {	0, 0, 4, 9, 14, 18, 22, 27, 	32, 37, 41, 45, 48, 51, 53, 57, 	61, 63, 65, 70, 72, 74, 83, 89, 	95, 101, 107, 109, 118, 118, 118, 123, 	128, 133, 133, 134, 135, 136, 137, 137, 	138, 139, 140, 140, 141, 142, 143, 143, 	148, 153, 157, 161, 166, 171, 176, 180, 	180, 183, 183, 183};static const char _json_trans_keys[] = {	32, 123, 9, 13, 32, 34, 125, 9, 	13, 32, 34, 125, 9, 13, 32, 58, 	9, 13, 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, 34, 45, 91, 	102, 110, 116, 123, 48, 57, 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, 32, 34, 125, 9, 	13, 32, 58, 9, 13, 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, 0};static const char _json_single_lengths[] = {	0, 2, 3, 3, 2, 2, 3, 3, 	3, 2, 2, 1, 3, 0, 2, 2, 	0, 0, 3, 2, 2, 9, 0, 0, 	0, 0, 2, 7, 0, 0, 3, 3, 	3, 0, 1, 1, 1, 1, 0, 1, 	1, 1, 0, 1, 1, 1, 0, 3, 	3, 2, 2, 3, 3, 3, 2, 0, 	1, 0, 0, 0};static const char _json_range_lengths[] = {	0, 1, 1, 1, 1, 1, 1, 1, 	1, 1, 1, 1, 0, 1, 1, 1, 	1, 1, 1, 0, 0, 0, 3, 3, 	3, 3, 0, 1, 0, 0, 1, 1, 	1, 0, 0, 0, 0, 0, 0, 0, 	0, 0, 0, 0, 0, 0, 0, 1, 	1, 1, 1, 1, 1, 1, 1, 0, 	1, 0, 0, 0};static const short _json_index_offsets[] = {	0, 0, 4, 9, 14, 18, 22, 27, 	32, 37, 41, 45, 48, 52, 54, 58, 	62, 64, 66, 71, 74, 77, 87, 91, 	95, 99, 103, 106, 115, 116, 117, 122, 	127, 132, 133, 135, 137, 139, 141, 142, 	144, 146, 148, 149, 151, 153, 155, 156, 	161, 166, 170, 174, 179, 184, 189, 193, 	194, 197, 198, 199};static const char _json_indicies[] = {	0, 2, 0, 1, 3, 4, 5, 3, 	1, 6, 7, 8, 6, 1, 9, 10, 	9, 1, 11, 12, 11, 1, 12, 1, 	1, 12, 13, 14, 15, 16, 14, 1, 	17, 18, 8, 17, 1, 18, 7, 18, 	1, 19, 20, 21, 1, 20, 21, 1, 	23, 24, 24, 22, 25, 1, 24, 24, 	25, 22, 26, 26, 27, 1, 27, 1, 	27, 22, 23, 24, 24, 21, 22, 29, 	30, 28, 32, 33, 31, 34, 34, 34, 	34, 34, 34, 34, 34, 35, 1, 36, 	36, 36, 1, 37, 37, 37, 1, 38, 	38, 38, 1, 39, 39, 39, 1, 41, 	42, 40, 43, 44, 45, 46, 47, 48, 	49, 44, 1, 50, 51, 53, 54, 1, 	53, 52, 55, 56, 54, 55, 1, 56, 	1, 1, 56, 52, 57, 58, 1, 59, 	1, 60, 1, 61, 1, 62, 63, 1, 	64, 1, 65, 1, 66, 67, 1, 68, 	1, 69, 1, 70, 71, 72, 73, 71, 	1, 74, 75, 76, 74, 1, 77, 78, 	77, 1, 79, 80, 79, 1, 80, 1, 	1, 80, 81, 82, 83, 84, 82, 1, 	85, 86, 76, 85, 1, 86, 75, 86, 	1, 87, 88, 88, 1, 1, 1, 1, 	0};static const char _json_trans_targs[] = {	1, 0, 2, 3, 4, 56, 3, 4, 	56, 5, 6, 5, 6, 7, 8, 9, 	56, 8, 9, 11, 12, 18, 57, 13, 	15, 14, 16, 17, 20, 58, 21, 20, 	58, 21, 19, 22, 23, 24, 25, 26, 	20, 58, 21, 28, 29, 30, 34, 39, 	43, 47, 59, 59, 31, 30, 33, 31, 	32, 59, 35, 36, 37, 38, 59, 40, 	41, 42, 59, 44, 45, 46, 59, 48, 	49, 55, 48, 49, 55, 50, 51, 50, 	51, 52, 53, 54, 55, 53, 54, 59, 	56};static const char _json_trans_actions[] = {	0, 0, 0, 21, 75, 48, 0, 42, 	23, 17, 17, 0, 0, 15, 19, 19, 	45, 0, 0, 0, 0, 0, 1, 0, 	0, 0, 0, 0, 3, 13, 0, 0, 	33, 5, 11, 0, 7, 0, 0, 0, 	36, 39, 9, 57, 51, 25, 0, 0, 	0, 29, 60, 54, 15, 0, 27, 0, 	0, 31, 0, 0, 0, 0, 66, 0, 	0, 0, 69, 0, 0, 0, 63, 21, 	75, 48, 0, 42, 23, 17, 17, 0, 	0, 15, 19, 19, 45, 0, 0, 72, 	0};static const int json_start = 1;static const int json_first_final = 56;static const int json_error = 0;static const int json_en_number_machine = 10;static const int json_en_string_machine = 19;static const int json_en_value_machine = 27;static const int json_en_main = 1;#line 599 "upb/json/parser.rl"size_t parse(void *closure, const void *hd, const char *buf, size_t size,             const upb_bufhandle *handle) {  UPB_UNUSED(hd);  UPB_UNUSED(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;  #line 684 "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 0:#line 517 "upb/json/parser.rl"	{ p--; {cs = stack[--top]; goto _again;} }	break;	case 1:#line 518 "upb/json/parser.rl"	{ p--; {stack[top++] = cs; cs = 10; goto _again;} }	break;	case 2:#line 522 "upb/json/parser.rl"	{ start_text(parser, p); }	break;	case 3:#line 523 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_text(parser, p, false)); }	break;	case 4:#line 529 "upb/json/parser.rl"	{ start_hex(parser, p); }	break;	case 5:#line 530 "upb/json/parser.rl"	{ hex(parser, p); }	break;	case 6:#line 536 "upb/json/parser.rl"	{ escape(parser, p); }	break;	case 7:#line 539 "upb/json/parser.rl"	{ {cs = stack[--top]; goto _again;} }	break;	case 8:#line 540 "upb/json/parser.rl"	{ {stack[top++] = cs; cs = 19; goto _again;} }	break;	case 9:#line 542 "upb/json/parser.rl"	{ p--; {stack[top++] = cs; cs = 27; goto _again;} }	break;	case 10:#line 547 "upb/json/parser.rl"	{ start_member(parser); }	break;	case 11:#line 548 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(end_member(parser)); }	break;	case 12:#line 551 "upb/json/parser.rl"	{ clear_member(parser); }	break;	case 13:#line 557 "upb/json/parser.rl"	{ start_object(parser); }	break;	case 14:#line 560 "upb/json/parser.rl"	{ end_object(parser); }	break;	case 15:#line 566 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(start_array(parser)); }	break;	case 16:#line 570 "upb/json/parser.rl"	{ end_array(parser); }	break;	case 17:#line 575 "upb/json/parser.rl"	{ start_number(parser, p); }	break;	case 18:#line 576 "upb/json/parser.rl"	{ end_number(parser, p); }	break;	case 19:#line 578 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(start_stringval(parser)); }	break;	case 20:#line 579 "upb/json/parser.rl"	{ end_stringval(parser); }	break;	case 21:#line 581 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(parser_putbool(parser, true)); }	break;	case 22:#line 583 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(parser_putbool(parser, false)); }	break;	case 23:#line 585 "upb/json/parser.rl"	{ /* null value */ }	break;	case 24:#line 587 "upb/json/parser.rl"	{ CHECK_RETURN_TOP(start_subobject(parser)); }	break;	case 25:#line 588 "upb/json/parser.rl"	{ end_subobject(parser); }	break;	case 26:#line 593 "upb/json/parser.rl"	{ p--; {cs = stack[--top]; goto _again;} }	break;#line 866 "upb/json/parser.c"		}	}_again:	if ( cs == 0 )		goto _out;	if ( ++p != pe )		goto _resume;	_test_eof: {}	_out: {}	}#line 615 "upb/json/parser.rl"  if (p != pe) {    upb_status_seterrf(parser->status, "Parse error at %s\n", p);  }error:  // Save parsing state back to parser.  parser->current_state = cs;  parser->parser_top = top;  return p - buf;}bool end(void *closure, const void *hd) {  UPB_UNUSED(closure);  UPB_UNUSED(hd);  return true;}void upb_json_parser_init(upb_json_parser *p, upb_status *status) {  p->limit = p->stack + UPB_JSON_MAX_DEPTH;  upb_byteshandler_init(&p->input_handler_);  upb_byteshandler_setstring(&p->input_handler_, parse, NULL);  upb_byteshandler_setendstr(&p->input_handler_, end, NULL);  upb_bytessink_reset(&p->input_, &p->input_handler_, p);  p->status = status;}void upb_json_parser_uninit(upb_json_parser *p) {  upb_byteshandler_uninit(&p->input_handler_);}void upb_json_parser_reset(upb_json_parser *p) {  p->top = p->stack;  p->top->f = NULL;  int cs;  int top;  // Emit Ragel initialization of the parser.  #line 920 "upb/json/parser.c"	{	cs = json_start;	top = 0;	}#line 655 "upb/json/parser.rl"  p->current_state = cs;  p->parser_top = top;  p->text_begin = NULL;  p->accumulated = NULL;  p->accumulated_len = 0;}void upb_json_parser_resetoutput(upb_json_parser *p, upb_sink *sink) {  upb_json_parser_reset(p);  upb_sink_reset(&p->top->sink, sink->handlers, sink->closure);  p->top->m = upb_handlers_msgdef(sink->handlers);  p->accumulated = NULL;}upb_bytessink *upb_json_parser_input(upb_json_parser *p) {  return &p->input_;}/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2014 Google Inc.  See LICENSE for details. * Author: Josh Haberman <jhaberman@gmail.com> * * This currently uses snprintf() to format primitives, and could be optimized * further. */#include <stdlib.h>#include <stdio.h>#include <string.h>#include <stdint.h>// StringPiece; a pointer plus a length.typedef struct {  const char *ptr;  size_t len;} strpc;strpc *newstrpc(upb_handlers *h, const upb_fielddef *f) {  strpc *ret = malloc(sizeof(*ret));  ret->ptr = upb_fielddef_name(f);  ret->len = strlen(ret->ptr);  upb_handlers_addcleanup(h, ret, free);  return ret;}// ------------ JSON string printing: values, maps, arrays --------------------static void print_data(    upb_json_printer *p, const char *buf, unsigned int len) {  // TODO: Will need to change if we support pushback from the sink.  size_t n = upb_bytessink_putbuf(p->output_, p->subc_, buf, len, NULL);  UPB_ASSERT_VAR(n, n == len);}static void print_comma(upb_json_printer *p) {  if (!p->first_elem_[p->depth_]) {    print_data(p, ",", 1);  }  p->first_elem_[p->depth_] = false;}// Helpers that print properly formatted elements to the JSON output stream.// Used for escaping control chars in strings.static const char kControlCharLimit = 0x20;static inline bool is_json_escaped(char c) {  // See RFC 4627.  unsigned char uc = (unsigned char)c;  return uc < kControlCharLimit || uc == '"' || uc == '\\';}static inline char* json_nice_escape(char c) {  switch (c) {    case '"':  return "\\\"";    case '\\': return "\\\\";    case '\b': return "\\b";    case '\f': return "\\f";    case '\n': return "\\n";    case '\r': return "\\r";    case '\t': return "\\t";    default:   return NULL;  }}// Write a properly escaped string chunk. The surrounding quotes are *not*// printed; this is so that the caller has the option of emitting the string// content in chunks.static void putstring(upb_json_printer *p, const char *buf, unsigned int len) {  const char* unescaped_run = NULL;  for (unsigned int i = 0; i < len; i++) {    char c = buf[i];    // Handle escaping.    if (is_json_escaped(c)) {      // Use a "nice" escape, like \n, if one exists for this character.      const char* escape = json_nice_escape(c);      // If we don't have a specific 'nice' escape code, use a \uXXXX-style      // escape.      char escape_buf[8];      if (!escape) {        unsigned char byte = (unsigned char)c;        snprintf(escape_buf, sizeof(escape_buf), "\\u%04x", (int)byte);        escape = escape_buf;      }      // N.B. that we assume that the input encoding is equal to the output      // encoding (both UTF-8 for  now), so for chars >= 0x20 and != \, ", we      // can simply pass the bytes through.      // If there's a current run of unescaped chars, print that run first.      if (unescaped_run) {        print_data(p, unescaped_run, &buf[i] - unescaped_run);        unescaped_run = NULL;      }      // Then print the escape code.      print_data(p, escape, strlen(escape));    } else {      // Add to the current unescaped run of characters.      if (unescaped_run == NULL) {        unescaped_run = &buf[i];      }    }  }  // If the string ended in a run of unescaped characters, print that last run.  if (unescaped_run) {    print_data(p, unescaped_run, &buf[len] - unescaped_run);  }}#define CHKLENGTH(x) if (!(x)) return -1;// Helpers that format floating point values according to our custom formats.// Right now we use %.8g and %.17g for float/double, respectively, to match// proto2::util::JsonFormat's defaults.  May want to change this later.static size_t fmt_double(double val, char* buf, size_t length) {  size_t n = snprintf(buf, length, "%.17g", val);  CHKLENGTH(n > 0 && n < length);  return n;}static size_t fmt_float(float val, char* buf, size_t length) {  size_t n = snprintf(buf, length, "%.8g", val);  CHKLENGTH(n > 0 && n < length);  return n;}static size_t fmt_bool(bool val, char* buf, size_t length) {  size_t n = snprintf(buf, length, "%s", (val ? "true" : "false"));  CHKLENGTH(n > 0 && n < length);  return n;}static size_t fmt_int64(long val, char* buf, size_t length) {  size_t n = snprintf(buf, length, "%ld", val);  CHKLENGTH(n > 0 && n < length);  return n;}static size_t fmt_uint64(unsigned long long val, char* buf, size_t length) {  size_t n = snprintf(buf, length, "%llu", val);  CHKLENGTH(n > 0 && n < length);  return n;}// Print a map key given a field name. Called by scalar field handlers and by// startseq for repeated fields.static bool putkey(void *closure, const void *handler_data) {  upb_json_printer *p = closure;  const strpc *key = handler_data;  print_comma(p);  print_data(p, "\"", 1);  putstring(p, key->ptr, key->len);  print_data(p, "\":", 2);  return true;}#define CHKFMT(val) if ((val) == -1) return false;#define CHK(val)    if (!(val)) return false;#define TYPE_HANDLERS(type, fmt_func)                                        \  static bool put##type(void *closure, const void *handler_data, type val) { \    upb_json_printer *p = closure;                                           \    UPB_UNUSED(handler_data);                                                \    char data[64];                                                           \    size_t length = fmt_func(val, data, sizeof(data));                       \    CHKFMT(length);                                                          \    print_data(p, data, length);                                             \    return true;                                                             \  }                                                                          \  static bool scalar_##type(void *closure, const void *handler_data,         \                            type val) {                                      \    CHK(putkey(closure, handler_data));                                      \    CHK(put##type(closure, handler_data, val));                              \    return true;                                                             \  }                                                                          \  static bool repeated_##type(void *closure, const void *handler_data,       \                            type val) {                                      \    upb_json_printer *p = closure;                                           \    print_comma(p);                                                          \    CHK(put##type(closure, handler_data, val));                              \    return true;                                                             \  }TYPE_HANDLERS(double,   fmt_double);TYPE_HANDLERS(float,    fmt_float);TYPE_HANDLERS(bool,     fmt_bool);TYPE_HANDLERS(int32_t,  fmt_int64);TYPE_HANDLERS(uint32_t, fmt_int64);TYPE_HANDLERS(int64_t,  fmt_int64);TYPE_HANDLERS(uint64_t, fmt_uint64);#undef TYPE_HANDLERStypedef struct {  void *keyname;  const upb_enumdef *enumdef;} EnumHandlerData;static bool scalar_enum(void *closure, const void *handler_data,                        int32_t val) {  const EnumHandlerData *hd = handler_data;  upb_json_printer *p = closure;  CHK(putkey(closure, hd->keyname));  const char *symbolic_name = upb_enumdef_iton(hd->enumdef, val);  if (symbolic_name) {    print_data(p, "\"", 1);    putstring(p, symbolic_name, strlen(symbolic_name));    print_data(p, "\"", 1);  } else {    putint32_t(closure, NULL, val);  }  return true;}static bool repeated_enum(void *closure, const void *handler_data,                          int32_t val) {  const EnumHandlerData *hd = handler_data;  upb_json_printer *p = closure;  print_comma(p);  const char *symbolic_name = upb_enumdef_iton(hd->enumdef, val);  if (symbolic_name) {    print_data(p, "\"", 1);    putstring(p, symbolic_name, strlen(symbolic_name));    print_data(p, "\"", 1);  } else {    putint32_t(closure, NULL, val);  }  return true;}static void *scalar_startsubmsg(void *closure, const void *handler_data) {  return putkey(closure, handler_data) ? closure : UPB_BREAK;}static void *repeated_startsubmsg(void *closure, const void *handler_data) {  UPB_UNUSED(handler_data);  upb_json_printer *p = closure;  print_comma(p);  return closure;}static bool startmap(void *closure, const void *handler_data) {  UPB_UNUSED(handler_data);  upb_json_printer *p = closure;  if (p->depth_++ == 0) {    upb_bytessink_start(p->output_, 0, &p->subc_);  }  p->first_elem_[p->depth_] = true;  print_data(p, "{", 1);  return true;}static bool endmap(void *closure, const void *handler_data, upb_status *s) {  UPB_UNUSED(handler_data);  UPB_UNUSED(s);  upb_json_printer *p = closure;  if (--p->depth_ == 0) {    upb_bytessink_end(p->output_);  }  print_data(p, "}", 1);  return true;}static void *startseq(void *closure, const void *handler_data) {  upb_json_printer *p = closure;  CHK(putkey(closure, handler_data));  p->depth_++;  p->first_elem_[p->depth_] = true;  print_data(p, "[", 1);  return closure;}static bool endseq(void *closure, const void *handler_data) {  UPB_UNUSED(handler_data);  upb_json_printer *p = closure;  print_data(p, "]", 1);  p->depth_--;  return true;}static size_t putstr(void *closure, const void *handler_data, const char *str,                     size_t len, const upb_bufhandle *handle) {  UPB_UNUSED(handler_data);  UPB_UNUSED(handle);  upb_json_printer *p = closure;  putstring(p, str, len);  return len;}// This has to Base64 encode the bytes, because JSON has no "bytes" type.static size_t putbytes(void *closure, const void *handler_data, const char *str,                       size_t len, const upb_bufhandle *handle) {  UPB_UNUSED(handler_data);  UPB_UNUSED(handle);  upb_json_printer *p = closure;  // This is the regular base64, not the "web-safe" version.  static const char base64[] =      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  // Base64-encode.  char data[16000];  const char *limit = data + sizeof(data);  const unsigned char *from = (const unsigned char*)str;  char *to = data;  size_t remaining = len;  while (remaining > 2) {    // TODO(haberman): handle encoded lengths > sizeof(data)    UPB_ASSERT_VAR(limit, (limit - to) >= 4);    to[0] = base64[from[0] >> 2];    to[1] = base64[((from[0] & 0x3) << 4) | (from[1] >> 4)];    to[2] = base64[((from[1] & 0xf) << 2) | (from[2] >> 6)];    to[3] = base64[from[2] & 0x3f];    remaining -= 3;    to += 4;    from += 3;  }  switch (remaining) {    case 2:      to[0] = base64[from[0] >> 2];      to[1] = base64[((from[0] & 0x3) << 4) | (from[1] >> 4)];      to[2] = base64[(from[1] & 0xf) << 2];      to[3] = '=';      to += 4;      from += 2;      break;    case 1:      to[0] = base64[from[0] >> 2];      to[1] = base64[((from[0] & 0x3) << 4)];      to[2] = '=';      to[3] = '=';      to += 4;      from += 1;      break;  }  size_t bytes = to - data;  print_data(p, "\"", 1);  putstring(p, data, bytes);  print_data(p, "\"", 1);  return len;}static void *scalar_startstr(void *closure, const void *handler_data,                             size_t size_hint) {  UPB_UNUSED(handler_data);  UPB_UNUSED(size_hint);  upb_json_printer *p = closure;  CHK(putkey(closure, handler_data));  print_data(p, "\"", 1);  return p;}static size_t scalar_str(void *closure, const void *handler_data,                         const char *str, size_t len,                         const upb_bufhandle *handle) {  CHK(putstr(closure, handler_data, str, len, handle));  return len;}static bool scalar_endstr(void *closure, const void *handler_data) {  UPB_UNUSED(handler_data);  upb_json_printer *p = closure;  print_data(p, "\"", 1);  return true;}static void *repeated_startstr(void *closure, const void *handler_data,                               size_t size_hint) {  UPB_UNUSED(handler_data);  UPB_UNUSED(size_hint);  upb_json_printer *p = closure;  print_comma(p);  print_data(p, "\"", 1);  return p;}static size_t repeated_str(void *closure, const void *handler_data,                           const char *str, size_t len,                           const upb_bufhandle *handle) {  CHK(putstr(closure, handler_data, str, len, handle));  return len;}static bool repeated_endstr(void *closure, const void *handler_data) {  UPB_UNUSED(handler_data);  upb_json_printer *p = closure;  print_data(p, "\"", 1);  return true;}static size_t scalar_bytes(void *closure, const void *handler_data,                           const char *str, size_t len,                           const upb_bufhandle *handle) {  CHK(putkey(closure, handler_data));  CHK(putbytes(closure, handler_data, str, len, handle));  return len;}static size_t repeated_bytes(void *closure, const void *handler_data,                             const char *str, size_t len,                             const upb_bufhandle *handle) {  upb_json_printer *p = closure;  print_comma(p);  CHK(putbytes(closure, handler_data, str, len, handle));  return len;}void printer_sethandlers(const void *closure, upb_handlers *h) {  UPB_UNUSED(closure);  upb_handlerattr empty_attr = UPB_HANDLERATTR_INITIALIZER;  upb_handlers_setstartmsg(h, startmap, &empty_attr);  upb_handlers_setendmsg(h, endmap, &empty_attr);#define TYPE(type, name, ctype)                                    \  case type:                                                       \    if (upb_fielddef_isseq(f)) {                                   \      upb_handlers_set##name(h, f, repeated_##ctype, &empty_attr); \    } else {                                                       \      upb_handlers_set##name(h, f, scalar_##ctype, &name_attr);    \    }                                                              \    break;  upb_msg_iter i;  upb_msg_begin(&i, upb_handlers_msgdef(h));  for(; !upb_msg_done(&i); upb_msg_next(&i)) {    const upb_fielddef *f = upb_msg_iter_field(&i);    upb_handlerattr name_attr = UPB_HANDLERATTR_INITIALIZER;    upb_handlerattr_sethandlerdata(&name_attr, newstrpc(h, f));    if (upb_fielddef_isseq(f)) {      upb_handlers_setstartseq(h, f, startseq, &name_attr);      upb_handlers_setendseq(h, f, endseq, &empty_attr);    }    switch (upb_fielddef_type(f)) {      TYPE(UPB_TYPE_FLOAT,  float,  float);      TYPE(UPB_TYPE_DOUBLE, double, double);      TYPE(UPB_TYPE_BOOL,   bool,   bool);      TYPE(UPB_TYPE_INT32,  int32,  int32_t);      TYPE(UPB_TYPE_UINT32, uint32, uint32_t);      TYPE(UPB_TYPE_INT64,  int64,  int64_t);      TYPE(UPB_TYPE_UINT64, uint64, uint64_t);      case UPB_TYPE_ENUM: {        // For now, we always emit symbolic names for enums. We may want an        // option later to control this behavior, but we will wait for a real        // need first.        EnumHandlerData *hd = malloc(sizeof(EnumHandlerData));        hd->enumdef = (const upb_enumdef *)upb_fielddef_subdef(f);        hd->keyname = newstrpc(h, f);        upb_handlers_addcleanup(h, hd, free);        upb_handlerattr enum_attr = UPB_HANDLERATTR_INITIALIZER;        upb_handlerattr_sethandlerdata(&enum_attr, hd);        if (upb_fielddef_isseq(f)) {          upb_handlers_setint32(h, f, repeated_enum, &enum_attr);        } else {          upb_handlers_setint32(h, f, scalar_enum, &enum_attr);        }        upb_handlerattr_uninit(&enum_attr);        break;      }      case UPB_TYPE_STRING:        if (upb_fielddef_isseq(f)) {          upb_handlers_setstartstr(h, f, repeated_startstr, &empty_attr);          upb_handlers_setstring(h, f, repeated_str, &empty_attr);          upb_handlers_setendstr(h, f, repeated_endstr, &empty_attr);        } else {          upb_handlers_setstartstr(h, f, scalar_startstr, &name_attr);          upb_handlers_setstring(h, f, scalar_str, &empty_attr);          upb_handlers_setendstr(h, f, scalar_endstr, &empty_attr);        }        break;      case UPB_TYPE_BYTES:        // XXX: this doesn't support strings that span buffers yet. The base64        // encoder will need to be made resumable for this to work properly.        if (upb_fielddef_isseq(f)) {          upb_handlers_setstring(h, f, repeated_bytes, &empty_attr);        } else {          upb_handlers_setstring(h, f, scalar_bytes, &name_attr);        }        break;      case UPB_TYPE_MESSAGE:        if (upb_fielddef_isseq(f)) {          upb_handlers_setstartsubmsg(h, f, repeated_startsubmsg, &name_attr);        } else {          upb_handlers_setstartsubmsg(h, f, scalar_startsubmsg, &name_attr);        }        break;    }    upb_handlerattr_uninit(&name_attr);  }  upb_handlerattr_uninit(&empty_attr);#undef TYPE}/* Public API *****************************************************************/void upb_json_printer_init(upb_json_printer *p, const upb_handlers *h) {  p->output_ = NULL;  p->depth_ = 0;  upb_sink_reset(&p->input_, h, p);}void upb_json_printer_uninit(upb_json_printer *p) {  UPB_UNUSED(p);}void upb_json_printer_reset(upb_json_printer *p) {  p->depth_ = 0;}void upb_json_printer_resetoutput(upb_json_printer *p, upb_bytessink *output) {  upb_json_printer_reset(p);  p->output_ = output;}upb_sink *upb_json_printer_input(upb_json_printer *p) {  return &p->input_;}const upb_handlers *upb_json_printer_newhandlers(const upb_msgdef *md,                                                 const void *owner) {  return upb_handlers_newfrozen(md, owner, printer_sethandlers, NULL);}
 |