123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883 |
- /*
- +----------------------------------------------------------------------+
- | Zend Engine |
- +----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.00 of the Zend license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | http://www.zend.com/license/2_00.txt. |
- | If you did not receive a copy of the Zend license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@zend.com so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@php.net> |
- | Zeev Suraski <zeev@php.net> |
- | Dmitry Stogov <dmitry@php.net> |
- +----------------------------------------------------------------------+
- */
- /* If you change this file, please regenerate the zend_vm_execute.h and
- * zend_vm_opcodes.h files by running:
- * php zend_vm_gen.php
- */
- ZEND_VM_COLD_CONSTCONST_HANDLER(1, ZEND_ADD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- fast_long_add_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
- }
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- add_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(2, ZEND_SUB, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- fast_long_sub_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
- }
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- sub_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(3, ZEND_MUL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- zend_long overflow;
- result = EX_VAR(opline->result.var);
- ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
- Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
- }
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- mul_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(4, ZEND_DIV, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
- fast_div_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_HELPER(zend_mod_by_zero_helper, ANY, ANY)
- {
- USE_OPLINE
- SAVE_OPLINE();
- zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_mod_by_zero_helper);
- } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
- /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
- ZVAL_LONG(result, 0);
- } else {
- ZVAL_LONG(result, Z_LVAL_P(op1) % Z_LVAL_P(op2));
- }
- ZEND_VM_NEXT_OPCODE();
- }
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- mod_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(6, ZEND_SL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
- && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- shift_left_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(7, ZEND_SR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
- && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) >> Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- shift_right_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(166, ZEND_POW, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
- pow_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(NO_CONST_CONST))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if ((OP1_TYPE == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- (OP2_TYPE == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
- zend_string *op1_str = Z_STR_P(op1);
- zend_string *op2_str = Z_STR_P(op2);
- zend_string *str;
- if (OP1_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_CV) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
- } else {
- ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- }
- FREE_OP1();
- } else if (OP2_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_CV) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
- } else {
- ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- }
- FREE_OP2();
- } else if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- FREE_OP2();
- } else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- FREE_OP1();
- FREE_OP2();
- }
- ZEND_VM_NEXT_OPCODE();
- } else {
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- concat_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(15, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- int result;
- SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
- result = fast_is_identical_function(op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(16, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- int result;
- SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
- result = fast_is_not_identical_function(op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- do {
- int result;
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
- FREE_OP1();
- FREE_OP2();
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- do {
- int result;
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
- FREE_OP1();
- FREE_OP2();
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(19, ZEND_IS_SMALLER, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- do {
- int result;
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- do {
- int result;
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(170, ZEND_SPACESHIP, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
- compare_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(9, ZEND_BW_OR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(10, ZEND_BW_AND, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(11, ZEND_BW_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(14, ZEND_BOOL_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
- boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONST_HANDLER(12, ZEND_BW_NOT, CONST|TMPVAR|CV, ANY)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), ~Z_LVAL_P(op1));
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- bitwise_not_function(EX_VAR(opline->result.var),
- GET_OP1_ZVAL_PTR(BP_VAR_R));
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONST_HANDLER(13, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
- {
- USE_OPLINE
- zval *val;
- zend_free_op free_op1;
- val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- /* The result and op1 can be the same cv zval */
- const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
- ZVAL_TRUE(EX_VAR(opline->result.var));
- if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- } else {
- SAVE_OPLINE();
- ZVAL_BOOL(EX_VAR(opline->result.var), !i_zend_is_true(val));
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_HELPER(zend_this_not_in_object_context_helper, ANY, ANY)
- {
- USE_OPLINE
- SAVE_OPLINE();
- zend_throw_error(NULL, "Using $this when not in object context");
- if ((opline+1)->opcode == ZEND_OP_DATA) {
- FREE_UNFETCHED_OP_DATA();
- }
- FREE_UNFETCHED_OP2();
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- ZEND_VM_COLD_HELPER(zend_abstract_method_helper, ANY, ANY, zend_function *fbc)
- {
- USE_OPLINE
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY, zval *function_name)
- {
- SAVE_OPLINE();
- zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
- HANDLE_EXCEPTION();
- }
- ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, binary_op_type binary_op)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2, free_op_data1;
- zval *object;
- zval *property;
- zval *value;
- zval *zptr;
- SAVE_OPLINE();
- object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- property = GET_OP2_ZVAL_PTR(BP_VAR_R);
- do {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- ZEND_VM_C_GOTO(assign_op_object);
- }
- }
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- break;
- }
- }
- /* here we are sure we are dealing with an object */
- ZEND_VM_C_LABEL(assign_op_object):
- if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) {
- if (UNEXPECTED(Z_ISERROR_P(zptr))) {
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- ZVAL_DEREF(zptr);
- binary_op(zptr, zptr, value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- }
- }
- } else {
- zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC);
- }
- } while (0);
- FREE_OP(free_op_data1);
- FREE_OP2();
- FREE_OP1_VAR_PTR();
- /* assign_obj has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
- }
- ZEND_VM_HELPER(zend_binary_assign_op_dim_helper, VAR|CV, CONST|TMPVAR|UNUSED|CV, binary_op_type binary_op)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2, free_op_data1;
- zval *var_ptr;
- zval *value, *container, *dim;
- SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- ZEND_VM_C_LABEL(assign_dim_op_array):
- SEPARATE_ARRAY(container);
- ZEND_VM_C_LABEL(assign_dim_op_new_array):
- dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP2_TYPE == IS_UNUSED) {
- var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
- if (UNEXPECTED(!var_ptr)) {
- zend_cannot_add_element();
- ZEND_VM_C_GOTO(assign_dim_op_ret_null);
- }
- } else {
- if (OP2_TYPE == IS_CONST) {
- var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
- } else {
- var_ptr = zend_fetch_dimension_address_inner_RW(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
- }
- if (UNEXPECTED(!var_ptr)) {
- ZEND_VM_C_GOTO(assign_dim_op_ret_null);
- }
- ZVAL_DEREF(var_ptr);
- }
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- binary_op(var_ptr, var_ptr, value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
- } else {
- if (EXPECTED(Z_ISREF_P(container))) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- ZEND_VM_C_GOTO(assign_dim_op_array);
- }
- } else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
- container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
- ZEND_VM_C_LABEL(assign_dim_op_convert_to_array):
- ZVAL_ARR(container, zend_new_array(8));
- ZEND_VM_C_GOTO(assign_dim_op_new_array);
- }
- dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
- dim++;
- }
- zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
- } else {
- if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if (OP2_TYPE == IS_UNUSED) {
- zend_use_new_element_for_string();
- } else {
- zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
- zend_wrong_string_offset(EXECUTE_DATA_C);
- }
- UNDEF_RESULT();
- } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
- ZEND_VM_C_GOTO(assign_dim_op_convert_to_array);
- } else {
- if (UNEXPECTED(OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_use_scalar_as_array();
- }
- ZEND_VM_C_LABEL(assign_dim_op_ret_null):
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- }
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- }
- }
- FREE_OP2();
- FREE_OP(free_op_data1);
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
- }
- ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, binary_op_type binary_op)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *var_ptr;
- zval *value;
- SAVE_OPLINE();
- value = GET_OP2_ZVAL_PTR(BP_VAR_R);
- var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
- if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- ZVAL_DEREF(var_ptr);
- binary_op(var_ptr, var_ptr, value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
- }
- FREE_OP2();
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(DIM_OBJ), binary_op_type binary_op)
- {
- #if defined(ZEND_VM_SPEC) && OP2_TYPE == IS_UNUSED
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op);
- #else
- # if !defined(ZEND_VM_SPEC) || OP1_TYPE != IS_UNUSED
- # if !defined(ZEND_VM_SPEC)
- /* opline->extended_value checks are specialized, don't need opline */
- USE_OPLINE
- # endif
- if (EXPECTED(opline->extended_value == 0)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_simple_helper, binary_op, binary_op);
- }
- if (EXPECTED(opline->extended_value == ZEND_ASSIGN_DIM)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op);
- }
- # endif
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_obj_helper, binary_op, binary_op);
- #endif
- }
- ZEND_VM_HANDLER(23, ZEND_ASSIGN_ADD, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, add_function);
- }
- ZEND_VM_HANDLER(24, ZEND_ASSIGN_SUB, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, sub_function);
- }
- ZEND_VM_HANDLER(25, ZEND_ASSIGN_MUL, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, mul_function);
- }
- ZEND_VM_HANDLER(26, ZEND_ASSIGN_DIV, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, div_function);
- }
- ZEND_VM_HANDLER(27, ZEND_ASSIGN_MOD, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, mod_function);
- }
- ZEND_VM_HANDLER(28, ZEND_ASSIGN_SL, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, shift_left_function);
- }
- ZEND_VM_HANDLER(29, ZEND_ASSIGN_SR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, shift_right_function);
- }
- ZEND_VM_HANDLER(30, ZEND_ASSIGN_CONCAT, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, concat_function);
- }
- ZEND_VM_HANDLER(31, ZEND_ASSIGN_BW_OR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_or_function);
- }
- ZEND_VM_HANDLER(32, ZEND_ASSIGN_BW_AND, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_and_function);
- }
- ZEND_VM_HANDLER(33, ZEND_ASSIGN_BW_XOR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_xor_function);
- }
- ZEND_VM_HANDLER(167, ZEND_ASSIGN_POW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, pow_function);
- }
- ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, int inc)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *object;
- zval *property;
- zval *zptr;
- SAVE_OPLINE();
- object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- property = GET_OP2_ZVAL_PTR(BP_VAR_R);
- do {
- if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- ZEND_VM_C_GOTO(pre_incdec_object);
- }
- }
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- break;
- }
- }
- /* here we are sure we are dealing with an object */
- ZEND_VM_C_LABEL(pre_incdec_object):
- if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
- if (UNEXPECTED(Z_ISERROR_P(zptr))) {
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
- } else {
- ZVAL_DEREF(zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- }
- }
- } else {
- zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
- }
- } while (0);
- FREE_OP2();
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_pre_incdec_property_helper, inc, 1);
- }
- ZEND_VM_HANDLER(133, ZEND_PRE_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_pre_incdec_property_helper, inc, 0);
- }
- ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, int inc)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *object;
- zval *property;
- zval *zptr;
- SAVE_OPLINE();
- object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- property = GET_OP2_ZVAL_PTR(BP_VAR_R);
- do {
- if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- ZEND_VM_C_GOTO(post_incdec_object);
- }
- }
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- break;
- }
- }
- /* here we are sure we are dealing with an object */
- ZEND_VM_C_LABEL(post_incdec_object):
- if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
- if (UNEXPECTED(Z_ISERROR_P(zptr))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
- } else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- }
- } else {
- zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
- }
- } while (0);
- FREE_OP2();
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_property_helper, inc, 1);
- }
- ZEND_VM_HANDLER(135, ZEND_POST_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_property_helper, inc, 0);
- }
- ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_increment_function(var_ptr);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
- }
- ZVAL_DEREF(var_ptr);
- increment_function(var_ptr);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_decrement_function(var_ptr);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
- }
- ZVAL_DEREF(var_ptr);
- decrement_function(var_ptr);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
- fast_long_increment_function(var_ptr);
- ZEND_VM_NEXT_OPCODE();
- }
- if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
- }
- ZVAL_DEREF(var_ptr);
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- increment_function(var_ptr);
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
- fast_long_decrement_function(var_ptr);
- ZEND_VM_NEXT_OPCODE();
- }
- if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
- }
- ZVAL_DEREF(var_ptr);
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- decrement_function(var_ptr);
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMPVAR|CV, ANY)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *z;
- SAVE_OPLINE();
- z = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (Z_TYPE_P(z) == IS_STRING) {
- zend_string *str = Z_STR_P(z);
- if (ZSTR_LEN(str) != 0) {
- zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
- }
- } else {
- zend_string *str = zval_get_string_func(z);
- if (ZSTR_LEN(str) != 0) {
- zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
- } else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(z) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(z, BP_VAR_R);
- }
- zend_string_release_ex(str, 0);
- }
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HELPER(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED, int type)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *varname;
- zval *retval;
- zend_string *name, *tmp_name;
- HashTable *target_symbol_table;
- SAVE_OPLINE();
- varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_CONST) {
- name = Z_STR_P(varname);
- } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
- name = Z_STR_P(varname);
- tmp_name = NULL;
- } else {
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- name = zval_get_tmp_string(varname, &tmp_name);
- }
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
- retval = zend_hash_find_ex(target_symbol_table, name, OP1_TYPE == IS_CONST);
- if (retval == NULL) {
- if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
- ZEND_VM_C_LABEL(fetch_this):
- zend_fetch_this_var(type OPLINE_CC EXECUTE_DATA_CC);
- if (OP1_TYPE != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- if (type == BP_VAR_W) {
- retval = zend_hash_add_new(target_symbol_table, name, &EG(uninitialized_zval));
- } else if (type == BP_VAR_IS) {
- retval = &EG(uninitialized_zval);
- } else {
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- if (type == BP_VAR_RW) {
- retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
- } else {
- retval = &EG(uninitialized_zval);
- }
- }
- /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
- } else if (Z_TYPE_P(retval) == IS_INDIRECT) {
- retval = Z_INDIRECT_P(retval);
- if (Z_TYPE_P(retval) == IS_UNDEF) {
- if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
- ZEND_VM_C_GOTO(fetch_this);
- }
- if (type == BP_VAR_W) {
- ZVAL_NULL(retval);
- } else if (type == BP_VAR_IS) {
- retval = &EG(uninitialized_zval);
- } else {
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- if (type == BP_VAR_RW) {
- ZVAL_NULL(retval);
- } else {
- retval = &EG(uninitialized_zval);
- }
- }
- }
- }
- if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
- FREE_OP1();
- }
- if (OP1_TYPE != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
- ZEND_ASSERT(retval != NULL);
- if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
- } else {
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(80, ZEND_FETCH_R, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_R);
- }
- ZEND_VM_HANDLER(83, ZEND_FETCH_W, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_W);
- }
- ZEND_VM_HANDLER(86, ZEND_FETCH_RW, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_RW);
- }
- ZEND_VM_HANDLER(92, ZEND_FETCH_FUNC_ARG, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
- {
- int fetch_type =
- (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
- BP_VAR_W : BP_VAR_R;
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, fetch_type);
- }
- ZEND_VM_HANDLER(95, ZEND_FETCH_UNSET, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_UNSET);
- }
- ZEND_VM_HANDLER(89, ZEND_FETCH_IS, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_IS);
- }
- ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, int type)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *varname;
- zval *retval;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
- SAVE_OPLINE();
- do {
- if (OP2_TYPE == IS_CONST) {
- if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) {
- retval = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- } else {
- zval *class_name = RT_CONSTANT(opline, opline->op2);
- if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- FREE_UNFETCHED_OP1();
- retval = NULL;
- break;
- }
- if (OP1_TYPE != IS_CONST) {
- CACHE_PTR(opline->extended_value, ce);
- }
- }
- }
- } else {
- if (OP2_TYPE == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- FREE_UNFETCHED_OP1();
- retval = NULL;
- break;
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- if (OP1_TYPE == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
- retval = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- }
- }
- varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_CONST) {
- name = Z_STR_P(varname);
- } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
- name = Z_STR_P(varname);
- tmp_name = NULL;
- } else {
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC);
- }
- name = zval_get_tmp_string(varname, &tmp_name);
- }
- retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
- if (OP1_TYPE != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
- if (OP1_TYPE == IS_CONST && EXPECTED(retval)) {
- CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval);
- }
- FREE_OP1();
- } while (0);
- if (UNEXPECTED(retval == NULL)) {
- if (EG(exception)) {
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- } else {
- ZEND_ASSERT(type == BP_VAR_IS);
- retval = &EG(uninitialized_zval);
- }
- }
- if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
- } else {
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(173, ZEND_FETCH_STATIC_PROP_R, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_R);
- }
- ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_W);
- }
- ZEND_VM_HANDLER(175, ZEND_FETCH_STATIC_PROP_RW, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_RW);
- }
- ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
- {
- int fetch_type =
- (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
- BP_VAR_W : BP_VAR_R;
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, fetch_type);
- }
- ZEND_VM_HANDLER(178, ZEND_FETCH_STATIC_PROP_UNSET, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_UNSET);
- }
- ZEND_VM_HANDLER(176, ZEND_FETCH_STATIC_PROP_IS, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
- {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_IS);
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container, *dim, *value, *result;
- SAVE_OPLINE();
- container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE != IS_CONST) {
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- ZEND_VM_C_LABEL(fetch_dim_r_array):
- value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, OP2_TYPE, BP_VAR_R EXECUTE_DATA_CC);
- result = EX_VAR(opline->result.var);
- ZVAL_COPY_DEREF(result, value);
- } else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- ZEND_VM_C_GOTO(fetch_dim_r_array);
- } else {
- ZEND_VM_C_GOTO(fetch_dim_r_slow);
- }
- } else {
- ZEND_VM_C_LABEL(fetch_dim_r_slow):
- if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
- dim++;
- }
- zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
- }
- } else {
- zend_fetch_dimension_address_read_R(container, dim, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
- }
- FREE_OP2();
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- SAVE_OPLINE();
- container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- zend_fetch_dimension_address_W(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
- FREE_OP2();
- if (OP1_TYPE == IS_VAR) {
- zval *result = EX_VAR(opline->result.var);
- FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- SAVE_OPLINE();
- container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- zend_fetch_dimension_address_RW(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
- FREE_OP2();
- if (OP1_TYPE == IS_VAR) {
- zval *result = EX_VAR(opline->result.var);
- FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(90, ZEND_FETCH_DIM_IS, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- SAVE_OPLINE();
- container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_IS);
- zend_fetch_dimension_address_read_IS(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
- FREE_OP2();
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_HELPER(zend_use_tmp_in_write_context_helper, ANY, ANY)
- {
- USE_OPLINE
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- FREE_UNFETCHED_OP2();
- FREE_UNFETCHED_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- ZEND_VM_COLD_HELPER(zend_use_undef_in_read_context_helper, ANY, ANY)
- {
- USE_OPLINE
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot use [] for reading");
- FREE_UNFETCHED_OP2();
- FREE_UNFETCHED_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV)
- {
- if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
- if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_use_tmp_in_write_context_helper);
- }
- ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_DIM_W);
- } else {
- if (OP2_TYPE == IS_UNUSED) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_use_undef_in_read_context_helper);
- }
- ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_DIM_R);
- }
- }
- ZEND_VM_HANDLER(96, ZEND_FETCH_DIM_UNSET, VAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- SAVE_OPLINE();
- container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
- zend_fetch_dimension_address_UNSET(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
- FREE_OP2();
- if (OP1_TYPE == IS_VAR) {
- zval *result = EX_VAR(opline->result.var);
- FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
- zend_free_op free_op2;
- zval *offset;
- void **cache_slot = NULL;
- SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_CONST ||
- (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- do {
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- break;
- }
- }
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- }
- ZEND_VM_C_GOTO(fetch_obj_r_no_object);
- } while (0);
- }
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
- if (OP2_TYPE == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
- uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
- if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
- Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
- if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
- (EXPECTED(p->key == Z_STR_P(offset)) ||
- (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
- EXPECTED(p->key != NULL) &&
- EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
- ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
- break;
- }
- }
- CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
- }
- retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
- if (EXPECTED(retval)) {
- uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
- CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
- ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
- break;
- }
- }
- }
- } else if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- }
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- ZEND_VM_C_LABEL(fetch_obj_r_no_object):
- zend_wrong_property_read(offset);
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
- } else if (UNEXPECTED(Z_ISREF_P(retval))) {
- zend_unwrap_reference(retval);
- }
- }
- } while (0);
- FREE_OP2();
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *property, *container, *result;
- SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- property = GET_OP2_ZVAL_PTR(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC);
- FREE_OP2();
- if (OP1_TYPE == IS_VAR) {
- FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *property, *container, *result;
- SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- property = GET_OP2_ZVAL_PTR(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC);
- FREE_OP2();
- if (OP1_TYPE == IS_VAR) {
- FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
- zend_free_op free_op2;
- zval *offset;
- void **cache_slot = NULL;
- SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
- if (OP1_TYPE == IS_CONST ||
- (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- do {
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- break;
- }
- }
- ZEND_VM_C_GOTO(fetch_obj_is_no_object);
- } while (0);
- }
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
- if (OP2_TYPE == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
- uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
- if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
- Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
- if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
- (EXPECTED(p->key == Z_STR_P(offset)) ||
- (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
- EXPECTED(p->key != NULL) &&
- EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
- ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
- break;
- }
- }
- CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
- }
- retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
- if (EXPECTED(retval)) {
- uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
- CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- }
- }
- }
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- ZEND_VM_C_LABEL(fetch_obj_is_no_object):
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- }
- }
- } while (0);
- FREE_OP2();
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
- {
- if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
- /* Behave like FETCH_OBJ_W */
- if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_use_tmp_in_write_context_helper);
- }
- ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_W);
- } else {
- ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_R);
- }
- }
- ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container, *property, *result;
- SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- property = GET_OP2_ZVAL_PTR(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC);
- FREE_OP2();
- if (OP1_TYPE == IS_VAR) {
- FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(98, ZEND_FETCH_LIST_R, CONST|TMPVARCV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- SAVE_OPLINE();
- container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- zend_fetch_dimension_address_LIST_r(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(198, ZEND_FETCH_LIST_W, VAR, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container, *dim;
- SAVE_OPLINE();
- container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_VAR
- && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
- && UNEXPECTED(!Z_ISREF_P(container))
- ) {
- zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
- zend_fetch_dimension_address_LIST_r(container, dim, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
- } else {
- zend_fetch_dimension_address_W(container, dim, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
- }
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT, SPEC(OP_DATA=CONST|TMP|VAR|CV))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2, free_op_data;
- zval *object, *property, *value, tmp;
- SAVE_OPLINE();
- object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- property = GET_OP2_ZVAL_PTR(BP_VAR_R);
- value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
- if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- ZEND_VM_C_GOTO(assign_object);
- }
- }
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- FREE_OP_DATA();
- ZEND_VM_C_GOTO(exit_assign_obj);
- }
- }
- ZEND_VM_C_LABEL(assign_object):
- if (OP2_TYPE == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
- zend_object *zobj = Z_OBJ_P(object);
- zval *property_val;
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- property_val = OBJ_PROP(zobj, prop_offset);
- if (Z_TYPE_P(property_val) != IS_UNDEF) {
- ZEND_VM_C_LABEL(fast_assign_obj):
- value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- ZEND_VM_C_GOTO(exit_assign_obj);
- }
- } else {
- if (EXPECTED(zobj->properties != NULL)) {
- if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_DELREF(zobj->properties);
- }
- zobj->properties = zend_array_dup(zobj->properties);
- }
- property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
- if (property_val) {
- ZEND_VM_C_GOTO(fast_assign_obj);
- }
- }
- if (!zobj->ce->__set) {
- if (EXPECTED(zobj->properties == NULL)) {
- rebuild_object_properties(zobj);
- }
- if (OP_DATA_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
- Z_ADDREF_P(value);
- }
- } else if (OP_DATA_TYPE != IS_TMP_VAR) {
- if (Z_ISREF_P(value)) {
- if (OP_DATA_TYPE == IS_VAR) {
- zend_reference *ref = Z_REF_P(value);
- if (GC_DELREF(ref) == 0) {
- ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
- efree_size(ref, sizeof(zend_reference));
- value = &tmp;
- } else {
- value = Z_REFVAL_P(value);
- Z_TRY_ADDREF_P(value);
- }
- } else {
- value = Z_REFVAL_P(value);
- Z_TRY_ADDREF_P(value);
- }
- } else if (OP_DATA_TYPE == IS_CV) {
- Z_TRY_ADDREF_P(value);
- }
- }
- zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- ZEND_VM_C_GOTO(exit_assign_obj);
- }
- }
- }
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
- FREE_OP_DATA();
- ZEND_VM_C_GOTO(exit_assign_obj);
- }
- if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR) {
- ZVAL_DEREF(value);
- }
- Z_OBJ_HT_P(object)->write_property(object, property, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- FREE_OP_DATA();
- ZEND_VM_C_LABEL(exit_assign_obj):
- FREE_OP2();
- FREE_OP1_VAR_PTR();
- /* assign_obj has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
- }
- ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(OP_DATA=CONST|TMP|VAR|CV))
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *object_ptr;
- zend_free_op free_op2, free_op_data;
- zval *value;
- zval *variable_ptr;
- zval *dim;
- SAVE_OPLINE();
- object_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
- ZEND_VM_C_LABEL(try_assign_dim_array):
- SEPARATE_ARRAY(object_ptr);
- if (OP2_TYPE == IS_UNUSED) {
- value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
- if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR) {
- ZVAL_DEREF(value);
- }
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
- if (UNEXPECTED(variable_ptr == NULL)) {
- FREE_OP_DATA();
- zend_cannot_add_element();
- ZEND_VM_C_GOTO(assign_dim_error);
- } else if (OP_DATA_TYPE == IS_CV) {
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- } else if (OP_DATA_TYPE == IS_VAR) {
- if (value != free_op_data) {
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- FREE_OP_DATA();
- }
- } else if (OP_DATA_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
- Z_ADDREF_P(value);
- }
- }
- } else {
- dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP2_TYPE == IS_CONST) {
- variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- } else {
- variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- }
- if (UNEXPECTED(variable_ptr == NULL)) {
- ZEND_VM_C_GOTO(assign_dim_error);
- }
- value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
- value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- } else {
- if (EXPECTED(Z_ISREF_P(object_ptr))) {
- object_ptr = Z_REFVAL_P(object_ptr);
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
- ZEND_VM_C_GOTO(try_assign_dim_array);
- }
- }
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
- value = GET_OP_DATA_ZVAL_PTR_DEREF(BP_VAR_R);
- if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
- dim++;
- }
- zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
- FREE_OP_DATA();
- } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if (OP2_TYPE == IS_UNUSED) {
- zend_use_new_element_for_string();
- FREE_UNFETCHED_OP_DATA();
- FREE_OP1_VAR_PTR();
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else {
- dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
- value = GET_OP_DATA_ZVAL_PTR_DEREF(BP_VAR_R);
- zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
- FREE_OP_DATA();
- }
- } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- ZEND_VM_C_GOTO(try_assign_dim_array);
- } else {
- if (OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_use_scalar_as_array();
- }
- dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
- ZEND_VM_C_LABEL(assign_dim_error):
- FREE_UNFETCHED_OP_DATA();
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- }
- }
- if (OP2_TYPE != IS_UNUSED) {
- FREE_OP2();
- }
- FREE_OP1_VAR_PTR();
- /* assign_dim has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
- }
- ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *value;
- zval *variable_ptr;
- SAVE_OPLINE();
- value = GET_OP2_ZVAL_PTR(BP_VAR_R);
- variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
- FREE_OP2();
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- FREE_OP1_VAR_PTR();
- /* zend_assign_to_variable() always takes care of op2, never free it! */
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *variable_ptr;
- zval *value_ptr;
- SAVE_OPLINE();
- value_ptr = GET_OP2_ZVAL_PTR_PTR(BP_VAR_W);
- variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
- variable_ptr = &EG(uninitialized_zval);
- } else if (OP1_TYPE == IS_VAR &&
- UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- FREE_OP1_VAR_PTR();
- FREE_OP2_VAR_PTR();
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else if (OP2_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) {
- variable_ptr = &EG(uninitialized_zval);
- } else if (OP2_TYPE == IS_VAR &&
- opline->extended_value == ZEND_RETURNS_FUNCTION &&
- UNEXPECTED(!Z_ISREF_P(value_ptr))) {
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC))) {
- FREE_OP2_VAR_PTR();
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- /* op2 freed by assign_to_variable */
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE();
- } else {
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
- }
- FREE_OP2_VAR_PTR();
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
- {
- zend_execute_data *old_execute_data;
- uint32_t call_info = EX_CALL_INFO();
- if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED)) == 0)) {
- EG(current_execute_data) = EX(prev_execute_data);
- i_free_compiled_variables(execute_data);
- if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
- zend_object *object = Z_OBJ(execute_data->This);
- #if 0
- if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) {
- #else
- if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) {
- #endif
- GC_DELREF(object);
- zend_object_store_ctor_failed(object);
- }
- OBJ_RELEASE(object);
- } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
- OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
- }
- EG(vm_stack_top) = (zval*)execute_data;
- execute_data = EX(prev_execute_data);
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_rethrow_exception(execute_data);
- HANDLE_EXCEPTION_LEAVE();
- }
- LOAD_NEXT_OPLINE();
- ZEND_VM_LEAVE();
- } else if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP)) == 0)) {
- EG(current_execute_data) = EX(prev_execute_data);
- i_free_compiled_variables(execute_data);
- if (UNEXPECTED(call_info & ZEND_CALL_HAS_SYMBOL_TABLE)) {
- zend_clean_and_cache_symbol_table(EX(symbol_table));
- }
- /* Free extra args before releasing the closure,
- * as that may free the op_array. */
- zend_vm_stack_free_extra_args_ex(call_info, execute_data);
- if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
- zend_object *object = Z_OBJ(execute_data->This);
- #if 0
- if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) {
- #else
- if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) {
- #endif
- GC_DELREF(object);
- zend_object_store_ctor_failed(object);
- }
- OBJ_RELEASE(object);
- } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
- OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
- }
- old_execute_data = execute_data;
- execute_data = EX(prev_execute_data);
- zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_rethrow_exception(execute_data);
- HANDLE_EXCEPTION_LEAVE();
- }
- LOAD_NEXT_OPLINE();
- ZEND_VM_LEAVE();
- } else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) {
- zend_detach_symbol_table(execute_data);
- destroy_op_array(&EX(func)->op_array);
- efree_size(EX(func), sizeof(zend_op_array));
- old_execute_data = execute_data;
- execute_data = EG(current_execute_data) = EX(prev_execute_data);
- zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
- zend_attach_symbol_table(execute_data);
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_rethrow_exception(execute_data);
- HANDLE_EXCEPTION_LEAVE();
- }
- LOAD_NEXT_OPLINE();
- ZEND_VM_LEAVE();
- } else {
- if (EXPECTED((call_info & ZEND_CALL_CODE) == 0)) {
- EG(current_execute_data) = EX(prev_execute_data);
- i_free_compiled_variables(execute_data);
- if (UNEXPECTED(call_info & (ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS))) {
- if (UNEXPECTED(call_info & ZEND_CALL_HAS_SYMBOL_TABLE)) {
- zend_clean_and_cache_symbol_table(EX(symbol_table));
- }
- zend_vm_stack_free_extra_args_ex(call_info, execute_data);
- }
- if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
- OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
- }
- ZEND_VM_RETURN();
- } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
- zend_array *symbol_table = EX(symbol_table);
- zend_detach_symbol_table(execute_data);
- old_execute_data = EX(prev_execute_data);
- while (old_execute_data) {
- if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) {
- if (old_execute_data->symbol_table == symbol_table) {
- zend_attach_symbol_table(old_execute_data);
- }
- break;
- }
- old_execute_data = old_execute_data->prev_execute_data;
- }
- EG(current_execute_data) = EX(prev_execute_data);
- ZEND_VM_RETURN();
- }
- }
- }
- ZEND_VM_HOT_HANDLER(42, ZEND_JMP, JMP_ADDR, ANY)
- {
- USE_OPLINE
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op1), 0);
- }
- ZEND_VM_HOT_NOCONST_HANDLER(43, ZEND_JMPZ, CONST|TMPVAR|CV, JMP_ADDR)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *val;
- val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
- }
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- }
- SAVE_OPLINE();
- if (i_zend_is_true(val)) {
- opline++;
- } else {
- opline = OP_JMP_ADDR(opline, opline->op2);
- }
- FREE_OP1();
- ZEND_VM_JMP(opline);
- }
- ZEND_VM_HOT_NOCONST_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, JMP_ADDR)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *val;
- val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if (i_zend_is_true(val)) {
- opline = OP_JMP_ADDR(opline, opline->op2);
- } else {
- opline++;
- }
- FREE_OP1();
- ZEND_VM_JMP(opline);
- }
- ZEND_VM_HOT_NOCONST_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, JMP_ADDR, JMP_ADDR)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *val;
- val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
- }
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- }
- SAVE_OPLINE();
- if (i_zend_is_true(val)) {
- opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
- } else {
- opline = OP_JMP_ADDR(opline, opline->op2);
- }
- FREE_OP1();
- ZEND_VM_JMP(opline);
- }
- ZEND_VM_COLD_CONST_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *val;
- int ret;
- val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
- }
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- }
- SAVE_OPLINE();
- ret = i_zend_is_true(val);
- FREE_OP1();
- if (ret) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- opline++;
- } else {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- opline = OP_JMP_ADDR(opline, opline->op2);
- }
- ZEND_VM_JMP(opline);
- }
- ZEND_VM_COLD_CONST_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *val;
- int ret;
- val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_NEXT_OPCODE();
- }
- }
- SAVE_OPLINE();
- ret = i_zend_is_true(val);
- FREE_OP1();
- if (ret) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- opline = OP_JMP_ADDR(opline, opline->op2);
- } else {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- opline++;
- }
- ZEND_VM_JMP(opline);
- }
- ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, ANY)
- {
- USE_OPLINE
- SAVE_OPLINE();
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_HANDLER(127, ZEND_FE_FREE, TMPVAR, ANY)
- {
- zval *var;
- USE_OPLINE
- SAVE_OPLINE();
- var = EX_VAR(opline->op1.var);
- if (Z_TYPE_P(var) != IS_ARRAY && Z_FE_ITER_P(var) != (uint32_t)-1) {
- zend_hash_iterator_del(Z_FE_ITER_P(var));
- }
- zval_ptr_dtor_nogc(var);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- zend_string *op1_str, *op2_str, *str;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if ((OP1_TYPE == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- (OP2_TYPE == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
- zend_string *op1_str = Z_STR_P(op1);
- zend_string *op2_str = Z_STR_P(op2);
- zend_string *str;
- if (OP1_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_CV) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
- } else {
- ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- }
- FREE_OP1();
- } else if (OP2_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_CV) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
- } else {
- ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- }
- FREE_OP2();
- } else if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- FREE_OP2();
- } else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- FREE_OP1();
- FREE_OP2();
- }
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CONST) {
- op1_str = Z_STR_P(op1);
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- op1_str = zend_string_copy(Z_STR_P(op1));
- } else {
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- op1_str = zval_get_string_func(op1);
- }
- if (OP2_TYPE == IS_CONST) {
- op2_str = Z_STR_P(op2);
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- op2_str = zend_string_copy(Z_STR_P(op2));
- } else {
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- op2_str = zval_get_string_func(op2);
- }
- do {
- if (OP1_TYPE != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- if (OP2_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_REFCOUNTED_P(op2))) {
- GC_ADDREF(op2_str);
- }
- }
- ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- zend_string_release_ex(op1_str, 0);
- break;
- }
- }
- if (OP2_TYPE != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_REFCOUNTED_P(op1))) {
- GC_ADDREF(op1_str);
- }
- }
- ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- zend_string_release_ex(op2_str, 0);
- break;
- }
- }
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- if (OP1_TYPE != IS_CONST) {
- zend_string_release_ex(op1_str, 0);
- }
- if (OP2_TYPE != IS_CONST) {
- zend_string_release_ex(op2_str, 0);
- }
- } while (0);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(54, ZEND_ROPE_INIT, UNUSED, CONST|TMPVAR|CV, NUM)
- {
- USE_OPLINE
- zend_free_op free_op2;
- zend_string **rope;
- zval *var;
- /* Compiler allocates the necessary number of zval slots to keep the rope */
- rope = (zend_string**)EX_VAR(opline->result.var);
- if (OP2_TYPE == IS_CONST) {
- var = GET_OP2_ZVAL_PTR(BP_VAR_R);
- rope[0] = Z_STR_P(var);
- if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
- Z_ADDREF_P(var);
- }
- } else {
- var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
- if (OP2_TYPE == IS_CV) {
- rope[0] = zend_string_copy(Z_STR_P(var));
- } else {
- rope[0] = Z_STR_P(var);
- }
- } else {
- SAVE_OPLINE();
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
- }
- rope[0] = zval_get_string_func(var);
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(55, ZEND_ROPE_ADD, TMP, CONST|TMPVAR|CV, NUM)
- {
- USE_OPLINE
- zend_free_op free_op2;
- zend_string **rope;
- zval *var;
- /* op1 and result are the same */
- rope = (zend_string**)EX_VAR(opline->op1.var);
- if (OP2_TYPE == IS_CONST) {
- var = GET_OP2_ZVAL_PTR(BP_VAR_R);
- rope[opline->extended_value] = Z_STR_P(var);
- if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
- Z_ADDREF_P(var);
- }
- } else {
- var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
- if (OP2_TYPE == IS_CV) {
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
- } else {
- rope[opline->extended_value] = Z_STR_P(var);
- }
- } else {
- SAVE_OPLINE();
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
- }
- rope[opline->extended_value] = zval_get_string_func(var);
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(56, ZEND_ROPE_END, TMP, CONST|TMPVAR|CV, NUM)
- {
- USE_OPLINE
- zend_free_op free_op2;
- zend_string **rope;
- zval *var, *ret;
- uint32_t i;
- size_t len = 0;
- char *target;
- rope = (zend_string**)EX_VAR(opline->op1.var);
- if (OP2_TYPE == IS_CONST) {
- var = GET_OP2_ZVAL_PTR(BP_VAR_R);
- rope[opline->extended_value] = Z_STR_P(var);
- if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
- Z_ADDREF_P(var);
- }
- } else {
- var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
- if (OP2_TYPE == IS_CV) {
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
- } else {
- rope[opline->extended_value] = Z_STR_P(var);
- }
- } else {
- SAVE_OPLINE();
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
- }
- rope[opline->extended_value] = zval_get_string_func(var);
- FREE_OP2();
- if (UNEXPECTED(EG(exception))) {
- for (i = 0; i <= opline->extended_value; i++) {
- zend_string_release_ex(rope[i], 0);
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
- }
- for (i = 0; i <= opline->extended_value; i++) {
- len += ZSTR_LEN(rope[i]);
- }
- ret = EX_VAR(opline->result.var);
- ZVAL_STR(ret, zend_string_alloc(len, 0));
- target = Z_STRVAL_P(ret);
- for (i = 0; i <= opline->extended_value; i++) {
- memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
- target += ZSTR_LEN(rope[i]);
- zend_string_release_ex(rope[i], 0);
- }
- *target = '\0';
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, UNUSED|CLASS_FETCH, CONST|TMPVAR|UNUSED|CV, CACHE_SLOT)
- {
- zend_free_op free_op2;
- zval *class_name;
- USE_OPLINE
- SAVE_OPLINE();
- if (OP2_TYPE == IS_UNUSED) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->op1.num);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else if (OP2_TYPE == IS_CONST) {
- zend_class_entry *ce = CACHED_PTR(opline->extended_value);
- if (UNEXPECTED(ce == NULL)) {
- class_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, opline->op1.num);
- CACHE_PTR(opline->extended_value, ce);
- }
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- } else {
- class_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- ZEND_VM_C_LABEL(try_class_name):
- if (Z_TYPE_P(class_name) == IS_OBJECT) {
- Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
- } else if (Z_TYPE_P(class_name) == IS_STRING) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->op1.num);
- } else if ((OP2_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
- class_name = Z_REFVAL_P(class_name);
- ZEND_VM_C_GOTO(try_class_name);
- } else {
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Class name must be a valid object or a string");
- }
- }
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, NUM|CACHE_SLOT)
- {
- USE_OPLINE
- zval *function_name;
- zend_free_op free_op1, free_op2;
- zval *object;
- zend_function *fbc;
- zend_class_entry *called_scope;
- zend_object *obj;
- zend_execute_data *call;
- uint32_t call_info;
- SAVE_OPLINE();
- object = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- if (OP2_TYPE != IS_CONST) {
- function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- }
- if (OP2_TYPE != IS_CONST &&
- UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
- do {
- if ((OP2_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
- function_name = Z_REFVAL_P(function_name);
- if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
- break;
- }
- } else if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- FREE_OP1();
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Method name must be a string");
- FREE_OP2();
- FREE_OP1();
- HANDLE_EXCEPTION();
- } while (0);
- }
- if (OP1_TYPE != IS_UNUSED) {
- do {
- if (OP1_TYPE == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- if (OP2_TYPE != IS_CONST) {
- FREE_OP2();
- }
- HANDLE_EXCEPTION();
- }
- }
- if (OP2_TYPE == IS_CONST) {
- function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- }
- zend_invalid_method_call(object, function_name);
- FREE_OP2();
- FREE_OP1();
- HANDLE_EXCEPTION();
- }
- } while (0);
- }
- obj = Z_OBJ_P(object);
- called_scope = obj->ce;
- if (OP2_TYPE == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
- fbc = CACHED_PTR(opline->result.num + sizeof(void*));
- } else {
- zend_object *orig_obj = obj;
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
- FREE_OP2();
- FREE_OP1();
- HANDLE_EXCEPTION();
- }
- if (OP2_TYPE == IS_CONST) {
- function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- }
- /* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((OP2_TYPE == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
- if (UNEXPECTED(fbc == NULL)) {
- if (EXPECTED(!EG(exception))) {
- zend_undefined_method(obj->ce, Z_STR_P(function_name));
- }
- FREE_OP2();
- FREE_OP1();
- HANDLE_EXCEPTION();
- }
- if (OP2_TYPE == IS_CONST &&
- EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
- EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
- EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
- }
- if ((OP1_TYPE & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
- }
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
- }
- }
- if (OP2_TYPE != IS_CONST) {
- FREE_OP2();
- }
- call_info = ZEND_CALL_NESTED_FUNCTION;
- if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
- obj = NULL;
- FREE_OP1();
- if ((OP1_TYPE & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
- } else if (OP1_TYPE & (IS_VAR|IS_TMP_VAR|IS_CV)) {
- /* CV may be changed indirectly (e.g. when it's a reference) */
- call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- if (OP1_TYPE == IS_CV) {
- GC_ADDREF(obj); /* For $this pointer */
- } else if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- FREE_OP1();
- }
- }
- call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
- call->prev_execute_data = EX(call);
- EX(call) = call;
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR, CONST|TMPVAR|UNUSED|CONSTRUCTOR|CV, NUM|CACHE_SLOT)
- {
- USE_OPLINE
- zval *function_name;
- zend_class_entry *ce;
- zend_object *object;
- zend_function *fbc;
- zend_execute_data *call;
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CONST) {
- /* no function found. try a static method in class */
- ce = CACHED_PTR(opline->result.num);
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- FREE_UNFETCHED_OP2();
- HANDLE_EXCEPTION();
- }
- if (OP2_TYPE != IS_CONST) {
- CACHE_PTR(opline->result.num, ce);
- }
- }
- } else if (OP1_TYPE == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op1.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- FREE_UNFETCHED_OP2();
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op1.var));
- }
- if (OP1_TYPE == IS_CONST &&
- OP2_TYPE == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
- /* nothing to do */
- } else if (OP1_TYPE != IS_CONST &&
- OP2_TYPE == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
- fbc = CACHED_PTR(opline->result.num + sizeof(void*));
- } else if (OP2_TYPE != IS_UNUSED) {
- zend_free_op free_op2;
- function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP2_TYPE != IS_CONST) {
- if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
- do {
- if (OP2_TYPE & (IS_VAR|IS_CV) && Z_ISREF_P(function_name)) {
- function_name = Z_REFVAL_P(function_name);
- if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
- break;
- }
- } else if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Function name must be a string");
- FREE_OP2();
- HANDLE_EXCEPTION();
- } while (0);
- }
- }
- if (ce->get_static_method) {
- fbc = ce->get_static_method(ce, Z_STR_P(function_name));
- } else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((OP2_TYPE == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
- }
- if (UNEXPECTED(fbc == NULL)) {
- if (EXPECTED(!EG(exception))) {
- zend_undefined_method(ce, Z_STR_P(function_name));
- }
- FREE_OP2();
- HANDLE_EXCEPTION();
- }
- if (OP2_TYPE == IS_CONST &&
- EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
- EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
- }
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
- }
- if (OP2_TYPE != IS_CONST) {
- FREE_OP2();
- }
- } else {
- if (UNEXPECTED(ce->constructor == NULL)) {
- zend_throw_error(NULL, "Cannot call constructor");
- HANDLE_EXCEPTION();
- }
- if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
- zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
- HANDLE_EXCEPTION();
- }
- fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
- }
- }
- object = NULL;
- if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
- object = Z_OBJ(EX(This));
- ce = object->ce;
- } else {
- zend_non_static_method_call(fbc);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- }
- if (OP1_TYPE == IS_UNUSED) {
- /* previous opcode is ZEND_FETCH_CLASS */
- if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
- (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
- if (Z_TYPE(EX(This)) == IS_OBJECT) {
- ce = Z_OBJCE(EX(This));
- } else {
- ce = Z_CE(EX(This));
- }
- }
- }
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
- call->prev_execute_data = EX(call);
- EX(call) = call;
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
- {
- USE_OPLINE
- zend_function *fbc;
- zval *function_name, *func;
- zend_execute_data *call;
- fbc = CACHED_PTR(opline->result.num);
- if (UNEXPECTED(fbc == NULL)) {
- function_name = (zval*)RT_CONSTANT(opline, opline->op2);
- func = zend_hash_find_ex(EG(function_table), Z_STR_P(function_name+1), 1);
- if (UNEXPECTED(func == NULL)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, function_name);
- }
- fbc = Z_FUNC_P(func);
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- fbc = init_func_run_time_cache_ex(func);
- }
- CACHE_PTR(opline->result.num, fbc);
- }
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL);
- call->prev_execute_data = EX(call);
- EX(call) = call;
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(128, ZEND_INIT_DYNAMIC_CALL, ANY, CONST|TMPVAR|CV, NUM)
- {
- USE_OPLINE
- zend_free_op free_op2;
- zval *function_name;
- zend_execute_data *call;
- SAVE_OPLINE();
- function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- ZEND_VM_C_LABEL(try_function_name):
- if (OP2_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
- call = zend_init_dynamic_call_string(Z_STR_P(function_name), opline->extended_value);
- } else if (OP2_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT)) {
- call = zend_init_dynamic_call_object(function_name, opline->extended_value);
- } else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY)) {
- call = zend_init_dynamic_call_array(Z_ARRVAL_P(function_name), opline->extended_value);
- } else if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(function_name) == IS_REFERENCE)) {
- function_name = Z_REFVAL_P(function_name);
- ZEND_VM_C_GOTO(try_function_name);
- } else {
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Function name must be a string");
- call = NULL;
- }
- FREE_OP2();
- if (UNEXPECTED(!call)) {
- HANDLE_EXCEPTION();
- }
- if (OP2_TYPE & (IS_VAR|IS_TMP_VAR)) {
- if (UNEXPECTED(EG(exception))) {
- if (call) {
- if (call->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
- zend_string_release_ex(call->func->common.function_name, 0);
- zend_free_trampoline(call->func);
- }
- zend_vm_stack_free_call_frame(call);
- }
- HANDLE_EXCEPTION();
- }
- }
- call->prev_execute_data = EX(call);
- EX(call) = call;
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
- {
- USE_OPLINE
- zend_free_op free_op2;
- zval *function_name;
- zend_fcall_info_cache fcc;
- char *error = NULL;
- zend_function *func;
- zend_class_entry *called_scope;
- zend_object *object;
- zend_execute_data *call;
- uint32_t call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC;
- SAVE_OPLINE();
- function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
- if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
- func = fcc.function_handler;
- called_scope = fcc.called_scope;
- object = fcc.object;
- if (error) {
- efree(error);
- /* This is the only soft error is_callable() can generate */
- zend_non_static_method_call(func);
- if (UNEXPECTED(EG(exception) != NULL)) {
- FREE_OP2();
- HANDLE_EXCEPTION();
- }
- }
- if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
- /* Delay closure destruction until its invocation */
- GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
- call_info |= ZEND_CALL_CLOSURE;
- if (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) {
- call_info |= ZEND_CALL_FAKE_CLOSURE;
- }
- } else if (object) {
- call_info |= ZEND_CALL_RELEASE_THIS;
- GC_ADDREF(object); /* For $this pointer */
- }
- FREE_OP2();
- if ((OP2_TYPE & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
- if (call_info & ZEND_CALL_CLOSURE) {
- zend_object_release(ZEND_CLOSURE_OBJECT(func));
- }
- if (call_info & ZEND_CALL_RELEASE_THIS) {
- zend_object_release(object);
- }
- HANDLE_EXCEPTION();
- }
- if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!func->op_array.run_time_cache)) {
- init_func_run_time_cache(&func->op_array);
- }
- } else {
- zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(RT_CONSTANT(opline, opline->op1)), error);
- efree(error);
- FREE_OP2();
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
- func = (zend_function*)&zend_pass_function;
- called_scope = NULL;
- object = NULL;
- }
- call = zend_vm_stack_push_call_frame(call_info,
- func, opline->extended_value, called_scope, object);
- call->prev_execute_data = EX(call);
- EX(call) = call;
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
- {
- USE_OPLINE
- zval *func_name;
- zval *func;
- zend_function *fbc;
- zend_execute_data *call;
- fbc = CACHED_PTR(opline->result.num);
- if (UNEXPECTED(fbc == NULL)) {
- func_name = (zval *)RT_CONSTANT(opline, opline->op2);
- func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 1), 1);
- if (func == NULL) {
- func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 2), 1);
- if (UNEXPECTED(func == NULL)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, func_name);
- }
- }
- fbc = Z_FUNC_P(func);
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- fbc = init_func_run_time_cache_ex(func);
- }
- CACHE_PTR(opline->result.num, fbc);
- }
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL);
- call->prev_execute_data = EX(call);
- EX(call) = call;
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT)
- {
- USE_OPLINE
- zend_free_op free_op2;
- zval *fname;
- zval *func;
- zend_function *fbc;
- zend_execute_data *call;
- fbc = CACHED_PTR(opline->result.num);
- if (UNEXPECTED(fbc == NULL)) {
- fname = GET_OP2_ZVAL_PTR(BP_VAR_R);
- func = zend_hash_find_ex(EG(function_table), Z_STR_P(fname), 1);
- if (UNEXPECTED(func == NULL)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, fname);
- }
- fbc = Z_FUNC_P(func);
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- fbc = init_func_run_time_cache_ex(func);
- }
- CACHE_PTR(opline->result.num, fbc);
- }
- call = zend_vm_stack_push_call_frame_ex(
- opline->op1.num, ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL);
- call->prev_execute_data = EX(call);
- EX(call) = call;
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zend_execute_data *call = EX(call);
- zend_function *fbc = call->func;
- zval *ret;
- zval retval;
- SAVE_OPLINE();
- EX(call) = call->prev_execute_data;
- call->prev_execute_data = execute_data;
- EG(current_execute_data) = call;
- ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
- ZVAL_NULL(ret);
- fbc->internal_function.handler(call, ret);
- #if ZEND_DEBUG
- if (!EG(exception) && call->func) {
- ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
- ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
- }
- #endif
- EG(current_execute_data) = execute_data;
- zend_vm_stack_free_args(call);
- zend_vm_stack_free_call_frame(call);
- if (!RETURN_VALUE_USED(opline)) {
- zval_ptr_dtor(ret);
- }
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_rethrow_exception(execute_data);
- HANDLE_EXCEPTION();
- }
- ZEND_VM_SET_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
- }
- ZEND_VM_HOT_HANDLER(130, ZEND_DO_UCALL, ANY, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zend_execute_data *call = EX(call);
- zend_function *fbc = call->func;
- zval *ret;
- SAVE_OPLINE();
- EX(call) = call->prev_execute_data;
- ret = NULL;
- if (RETURN_VALUE_USED(opline)) {
- ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
- }
- call->prev_execute_data = execute_data;
- execute_data = call;
- i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- LOAD_OPLINE();
- ZEND_VM_ENTER_EX();
- }
- ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zend_execute_data *call = EX(call);
- zend_function *fbc = call->func;
- zval *ret;
- SAVE_OPLINE();
- EX(call) = call->prev_execute_data;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
- ret = NULL;
- if (RETURN_VALUE_USED(opline)) {
- ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
- }
- call->prev_execute_data = execute_data;
- execute_data = call;
- i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- LOAD_OPLINE();
- ZEND_VM_ENTER_EX();
- } else {
- zval retval;
- ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
- if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
- zend_deprecated_function(fbc);
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- }
- call->prev_execute_data = execute_data;
- EG(current_execute_data) = call;
- if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
- && UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
- zend_vm_stack_free_call_frame(call);
- zend_rethrow_exception(execute_data);
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
- ZVAL_NULL(ret);
- fbc->internal_function.handler(call, ret);
- #if ZEND_DEBUG
- if (!EG(exception) && call->func) {
- ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
- ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
- }
- #endif
- EG(current_execute_data) = execute_data;
- zend_vm_stack_free_args(call);
- zend_vm_stack_free_call_frame(call);
- if (!RETURN_VALUE_USED(opline)) {
- zval_ptr_dtor(ret);
- }
- }
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_rethrow_exception(execute_data);
- HANDLE_EXCEPTION();
- }
- ZEND_VM_SET_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
- }
- ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zend_execute_data *call = EX(call);
- zend_function *fbc = call->func;
- zend_object *object;
- zval *ret;
- SAVE_OPLINE();
- EX(call) = call->prev_execute_data;
- if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
- if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_abstract_method_helper, fbc, fbc);
- }
- if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
- zend_deprecated_function(fbc);
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- }
- }
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
- ret = NULL;
- if (RETURN_VALUE_USED(opline)) {
- ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
- }
- call->prev_execute_data = execute_data;
- execute_data = call;
- i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
- if (EXPECTED(zend_execute_ex == execute_ex)) {
- LOAD_OPLINE();
- ZEND_VM_ENTER_EX();
- } else {
- execute_data = EX(prev_execute_data);
- LOAD_OPLINE();
- ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
- zend_execute_ex(call);
- }
- } else if (EXPECTED(fbc->type < ZEND_USER_FUNCTION)) {
- zval retval;
- call->prev_execute_data = execute_data;
- EG(current_execute_data) = call;
- if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
- && UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
- UNDEF_RESULT();
- ZEND_VM_C_GOTO(fcall_end);
- }
- ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
- ZVAL_NULL(ret);
- if (!zend_execute_internal) {
- /* saves one function call if zend_execute_internal is not used */
- fbc->internal_function.handler(call, ret);
- } else {
- zend_execute_internal(call, ret);
- }
- #if ZEND_DEBUG
- if (!EG(exception) && call->func) {
- ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
- ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
- }
- #endif
- EG(current_execute_data) = execute_data;
- zend_vm_stack_free_args(call);
- if (!RETURN_VALUE_USED(opline)) {
- zval_ptr_dtor(ret);
- }
- } else { /* ZEND_OVERLOADED_FUNCTION */
- zval retval;
- ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
- call->prev_execute_data = execute_data;
- if (UNEXPECTED(!zend_do_fcall_overloaded(call, ret))) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- if (!RETURN_VALUE_USED(opline)) {
- zval_ptr_dtor(ret);
- }
- }
- ZEND_VM_C_LABEL(fcall_end):
- if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) {
- object = Z_OBJ(call->This);
- #if 0
- if (UNEXPECTED(EG(exception) != NULL) && (opline->op1.num & ZEND_CALL_CTOR)) {
- #else
- if (UNEXPECTED(EG(exception) != NULL) && (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR)) {
- #endif
- GC_DELREF(object);
- zend_object_store_ctor_failed(object);
- }
- OBJ_RELEASE(object);
- }
- zend_vm_stack_free_call_frame(call);
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_rethrow_exception(execute_data);
- HANDLE_EXCEPTION();
- }
- ZEND_VM_SET_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
- }
- ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV, UNUSED|CACHE_SLOT)
- {
- USE_OPLINE
- SAVE_OPLINE();
- if (OP1_TYPE == IS_UNUSED) {
- zend_verify_missing_return_type(EX(func), CACHE_ADDR(opline->op2.num));
- } else {
- /* prevents "undefined variable opline" errors */
- #if !defined(ZEND_VM_SPEC) || (OP1_TYPE != IS_UNUSED)
- zval *retval_ref, *retval_ptr;
- zend_free_op free_op1;
- zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
- retval_ref = retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
- if (OP1_TYPE == IS_CONST) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval_ptr);
- retval_ref = retval_ptr = EX_VAR(opline->result.var);
- } else if (OP1_TYPE == IS_VAR) {
- if (UNEXPECTED(Z_TYPE_P(retval_ptr) == IS_INDIRECT)) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- ZVAL_DEREF(retval_ptr);
- } else if (OP1_TYPE == IS_CV) {
- ZVAL_DEREF(retval_ptr);
- }
- if (UNEXPECTED(!ZEND_TYPE_IS_CLASS(ret_info->type)
- && ZEND_TYPE_CODE(ret_info->type) != IS_CALLABLE
- && ZEND_TYPE_CODE(ret_info->type) != IS_ITERABLE
- && !ZEND_SAME_FAKE_TYPE(ZEND_TYPE_CODE(ret_info->type), Z_TYPE_P(retval_ptr))
- && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- && retval_ref != retval_ptr)
- ) {
- /* A cast might happen - unwrap the reference if this is a by-value return */
- if (Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
- } else {
- Z_DELREF_P(retval_ref);
- ZVAL_COPY(retval_ref, retval_ptr);
- }
- retval_ptr = retval_ref;
- }
- zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
- #endif
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
- {
- USE_OPLINE
- zval *retval_ptr;
- zval *return_value;
- zend_free_op free_op1;
- retval_ptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- return_value = EX(return_value);
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
- SAVE_OPLINE();
- retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R);
- if (return_value) {
- ZVAL_NULL(return_value);
- }
- } else if (!return_value) {
- if (OP1_TYPE & (IS_VAR|IS_TMP_VAR)) {
- if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
- SAVE_OPLINE();
- rc_dtor_func(Z_COUNTED_P(free_op1));
- }
- }
- } else {
- if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
- ZVAL_COPY_VALUE(return_value, retval_ptr);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
- Z_ADDREF_P(return_value);
- }
- }
- } else if (OP1_TYPE == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
- if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- ZVAL_COPY_VALUE(return_value, retval_ptr);
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
- zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
- if (GC_MAY_LEAK(ref)) {
- gc_possible_root(ref);
- }
- ZVAL_NULL(retval_ptr);
- } else {
- Z_ADDREF_P(return_value);
- }
- } else {
- retval_ptr = Z_REFVAL_P(retval_ptr);
- ZVAL_COPY(return_value, retval_ptr);
- }
- } else {
- ZVAL_COPY_VALUE(return_value, retval_ptr);
- }
- } else /* if (OP1_TYPE == IS_VAR) */ {
- if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
- zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
- retval_ptr = Z_REFVAL_P(retval_ptr);
- ZVAL_COPY_VALUE(return_value, retval_ptr);
- if (UNEXPECTED(GC_DELREF(ref) == 0)) {
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
- Z_ADDREF_P(retval_ptr);
- }
- } else {
- ZVAL_COPY_VALUE(return_value, retval_ptr);
- }
- }
- }
- ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
- }
- ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC)
- {
- USE_OPLINE
- zval *retval_ptr;
- zend_free_op free_op1;
- SAVE_OPLINE();
- do {
- if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR)) ||
- (OP1_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) {
- /* Not supposed to happen, but we'll allow it */
- zend_error(E_NOTICE, "Only variable references should be returned by reference");
- retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
- if (!EX(return_value)) {
- FREE_OP1();
- } else {
- if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) {
- ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
- break;
- }
- ZVAL_NEW_REF(EX(return_value), retval_ptr);
- if (OP1_TYPE == IS_CONST) {
- Z_TRY_ADDREF_P(retval_ptr);
- }
- }
- break;
- }
- retval_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
- if (OP1_TYPE == IS_VAR) {
- if (retval_ptr == &EG(uninitialized_zval) ||
- (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr))) {
- zend_error(E_NOTICE, "Only variable references should be returned by reference");
- if (EX(return_value)) {
- ZVAL_NEW_REF(EX(return_value), retval_ptr);
- } else {
- FREE_OP1_VAR_PTR();
- }
- break;
- }
- }
- if (EX(return_value)) {
- if (Z_ISREF_P(retval_ptr)) {
- Z_ADDREF_P(retval_ptr);
- } else {
- ZVAL_MAKE_REF_EX(retval_ptr, 2);
- }
- ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
- }
- FREE_OP1_VAR_PTR();
- } while (0);
- ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
- }
- ZEND_VM_HANDLER(41, ZEND_GENERATOR_CREATE, ANY, ANY)
- {
- zval *return_value = EX(return_value);
- if (EXPECTED(return_value)) {
- USE_OPLINE
- zend_generator *generator;
- zend_execute_data *gen_execute_data;
- uint32_t num_args, used_stack, call_info;
- object_init_ex(return_value, zend_ce_generator);
- /*
- * Normally the execute_data is allocated on the VM stack (because it does
- * not actually do any allocation and thus is faster). For generators
- * though this behavior would be suboptimal, because the (rather large)
- * structure would have to be copied back and forth every time execution is
- * suspended or resumed. That's why for generators the execution context
- * is allocated on heap.
- */
- num_args = EX_NUM_ARGS();
- if (EXPECTED(num_args <= EX(func)->op_array.num_args)) {
- used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var + EX(func)->op_array.T) * sizeof(zval);
- gen_execute_data = (zend_execute_data*)emalloc(used_stack);
- used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var) * sizeof(zval);
- } else {
- used_stack = (ZEND_CALL_FRAME_SLOT + num_args + EX(func)->op_array.last_var + EX(func)->op_array.T - EX(func)->op_array.num_args) * sizeof(zval);
- gen_execute_data = (zend_execute_data*)emalloc(used_stack);
- }
- memcpy(gen_execute_data, execute_data, used_stack);
- /* Save execution context in generator object. */
- generator = (zend_generator *) Z_OBJ_P(EX(return_value));
- generator->execute_data = gen_execute_data;
- generator->frozen_call_stack = NULL;
- generator->execute_fake.opline = NULL;
- generator->execute_fake.func = NULL;
- generator->execute_fake.prev_execute_data = NULL;
- ZVAL_OBJ(&generator->execute_fake.This, (zend_object *) generator);
- gen_execute_data->opline = opline + 1;
- /* EX(return_value) keeps pointer to zend_object (not a real zval) */
- gen_execute_data->return_value = (zval*)generator;
- call_info = Z_TYPE_INFO(EX(This));
- if ((call_info & Z_TYPE_MASK) == IS_OBJECT
- && (!(call_info & ((ZEND_CALL_CLOSURE|ZEND_CALL_RELEASE_THIS) << ZEND_CALL_INFO_SHIFT))
- /* Bug #72523 */
- || UNEXPECTED(zend_execute_ex != execute_ex))) {
- ZEND_ADD_CALL_FLAG_EX(call_info, ZEND_CALL_RELEASE_THIS);
- Z_ADDREF(gen_execute_data->This);
- }
- ZEND_ADD_CALL_FLAG_EX(call_info, (ZEND_CALL_TOP_FUNCTION | ZEND_CALL_ALLOCATED | ZEND_CALL_GENERATOR));
- Z_TYPE_INFO(gen_execute_data->This) = call_info;
- gen_execute_data->prev_execute_data = NULL;
- call_info = EX_CALL_INFO();
- EG(current_execute_data) = EX(prev_execute_data);
- if (EXPECTED(!(call_info & (ZEND_CALL_TOP|ZEND_CALL_ALLOCATED)))) {
- EG(vm_stack_top) = (zval*)execute_data;
- execute_data = EX(prev_execute_data);
- LOAD_NEXT_OPLINE();
- ZEND_VM_LEAVE();
- } else if (EXPECTED(!(call_info & ZEND_CALL_TOP))) {
- zend_execute_data *old_execute_data = execute_data;
- execute_data = EX(prev_execute_data);
- zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
- LOAD_NEXT_OPLINE();
- ZEND_VM_LEAVE();
- } else {
- ZEND_VM_RETURN();
- }
- } else {
- ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
- }
- }
- ZEND_VM_HANDLER(161, ZEND_GENERATOR_RETURN, CONST|TMP|VAR|CV, ANY)
- {
- USE_OPLINE
- zval *retval;
- zend_free_op free_op1;
- zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
- SAVE_OPLINE();
- retval = GET_OP1_ZVAL_PTR(BP_VAR_R);
- /* Copy return value into generator->retval */
- if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
- ZVAL_COPY_VALUE(&generator->retval, retval);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->retval))) {
- Z_ADDREF(generator->retval);
- }
- }
- } else if (OP1_TYPE == IS_CV) {
- ZVAL_COPY_DEREF(&generator->retval, retval);
- } else /* if (OP1_TYPE == IS_VAR) */ {
- if (UNEXPECTED(Z_ISREF_P(retval))) {
- zend_refcounted *ref = Z_COUNTED_P(retval);
- retval = Z_REFVAL_P(retval);
- ZVAL_COPY_VALUE(&generator->retval, retval);
- if (UNEXPECTED(GC_DELREF(ref) == 0)) {
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(retval)) {
- Z_ADDREF_P(retval);
- }
- } else {
- ZVAL_COPY_VALUE(&generator->retval, retval);
- }
- }
- /* Close the generator to free up resources */
- zend_generator_close(generator, 1);
- /* Pass execution back to handling code */
- ZEND_VM_RETURN();
- }
- ZEND_VM_COLD_CONST_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
- {
- USE_OPLINE
- zval *value;
- zend_free_op free_op1;
- SAVE_OPLINE();
- value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- do {
- if (OP1_TYPE == IS_CONST || UNEXPECTED(Z_TYPE_P(value) != IS_OBJECT)) {
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
- value = Z_REFVAL_P(value);
- if (EXPECTED(Z_TYPE_P(value) == IS_OBJECT)) {
- break;
- }
- }
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(value, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Can only throw objects");
- FREE_OP1();
- HANDLE_EXCEPTION();
- }
- } while (0);
- zend_exception_save();
- if (OP1_TYPE != IS_TMP_VAR) {
- Z_TRY_ADDREF_P(value);
- }
- zend_throw_exception_object(value);
- zend_exception_restore();
- FREE_OP1_IF_VAR();
- HANDLE_EXCEPTION();
- }
- ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, JMP_ADDR, LAST_CATCH|CACHE_SLOT)
- {
- USE_OPLINE
- zend_class_entry *ce, *catch_ce;
- zend_object *exception;
- zval *ex;
- SAVE_OPLINE();
- /* Check whether an exception has been thrown, if not, jump over code */
- zend_exception_restore();
- if (EG(exception) == NULL) {
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- }
- catch_ce = CACHED_PTR(opline->extended_value & ~ZEND_LAST_CATCH);
- if (UNEXPECTED(catch_ce == NULL)) {
- catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
- CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
- }
- ce = EG(exception)->ce;
- #ifdef HAVE_DTRACE
- if (DTRACE_EXCEPTION_CAUGHT_ENABLED()) {
- DTRACE_EXCEPTION_CAUGHT((char *)ce->name);
- }
- #endif /* HAVE_DTRACE */
- if (ce != catch_ce) {
- if (!catch_ce || !instanceof_function(ce, catch_ce)) {
- if (opline->extended_value & ZEND_LAST_CATCH) {
- zend_rethrow_exception(execute_data);
- HANDLE_EXCEPTION();
- }
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- }
- }
- exception = EG(exception);
- ex = EX_VAR(opline->result.var);
- if (UNEXPECTED(Z_ISREF_P(ex))) {
- ex = Z_REFVAL_P(ex);
- }
- zval_ptr_dtor(ex);
- ZVAL_OBJ(ex, EG(exception));
- if (UNEXPECTED(EG(exception) != exception)) {
- GC_ADDREF(EG(exception));
- HANDLE_EXCEPTION();
- } else {
- EG(exception) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
- }
- ZEND_VM_HOT_HANDLER(65, ZEND_SEND_VAL, CONST|TMPVAR, NUM)
- {
- USE_OPLINE
- zval *value, *arg;
- zend_free_op free_op1;
- value = GET_OP1_ZVAL_PTR(BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_COPY_VALUE(arg, value);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(arg))) {
- Z_ADDREF_P(arg);
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_HELPER(zend_cannot_pass_by_ref_helper, ANY, ANY)
- {
- USE_OPLINE
- zval *arg;
- uint32_t arg_num = opline->op2.num;
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot pass parameter %d by reference", arg_num);
- FREE_UNFETCHED_OP1();
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_UNDEF(arg);
- HANDLE_EXCEPTION();
- }
- ZEND_VM_HOT_SEND_HANDLER(116, ZEND_SEND_VAL_EX, CONST|TMP, NUM, SPEC(QUICK_ARG))
- {
- USE_OPLINE
- zval *value, *arg;
- zend_free_op free_op1;
- uint32_t arg_num = opline->op2.num;
- if (EXPECTED(arg_num <= MAX_ARG_FLAG_NUM)) {
- if (QUICK_ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_VM_C_GOTO(send_val_by_ref);
- }
- } else if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_VM_C_LABEL(send_val_by_ref):
- ZEND_VM_DISPATCH_TO_HELPER(zend_cannot_pass_by_ref_helper);
- }
- value = GET_OP1_ZVAL_PTR(BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_COPY_VALUE(arg, value);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(arg))) {
- Z_ADDREF_P(arg);
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_HANDLER(117, ZEND_SEND_VAR, VAR|CV, NUM)
- {
- USE_OPLINE
- zval *varptr, *arg;
- zend_free_op free_op1;
- varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(varptr, BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_NULL(arg);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- if (OP1_TYPE == IS_CV) {
- ZVAL_COPY_DEREF(arg, varptr);
- } else /* if (OP1_TYPE == IS_VAR) */ {
- if (UNEXPECTED(Z_ISREF_P(varptr))) {
- zend_refcounted *ref = Z_COUNTED_P(varptr);
- varptr = Z_REFVAL_P(varptr);
- ZVAL_COPY_VALUE(arg, varptr);
- if (UNEXPECTED(GC_DELREF(ref) == 0)) {
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(arg)) {
- Z_ADDREF_P(arg);
- }
- } else {
- ZVAL_COPY_VALUE(arg, varptr);
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR, NUM)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *varptr, *arg;
- varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_COPY_VALUE(arg, varptr);
- if (EXPECTED(Z_ISREF_P(varptr))) {
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- zend_error(E_NOTICE, "Only variables should be passed by reference");
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_SEND_HANDLER(50, ZEND_SEND_VAR_NO_REF_EX, VAR, NUM, SPEC(QUICK_ARG))
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *varptr, *arg;
- uint32_t arg_num = opline->op2.num;
- if (EXPECTED(arg_num <= MAX_ARG_FLAG_NUM)) {
- if (!QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_VAR);
- }
- varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_COPY_VALUE(arg, varptr);
- if (EXPECTED(Z_ISREF_P(varptr) ||
- QUICK_ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num))) {
- ZEND_VM_NEXT_OPCODE();
- }
- } else {
- if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_VAR);
- }
- varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_COPY_VALUE(arg, varptr);
- if (EXPECTED(Z_ISREF_P(varptr) ||
- ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num))) {
- ZEND_VM_NEXT_OPCODE();
- }
- }
- SAVE_OPLINE();
- zend_error(E_NOTICE, "Only variables should be passed by reference");
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, NUM)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *varptr, *arg;
- SAVE_OPLINE();
- varptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(varptr))) {
- ZVAL_NEW_EMPTY_REF(arg);
- ZVAL_NULL(Z_REFVAL_P(arg));
- ZEND_VM_NEXT_OPCODE();
- }
- if (Z_ISREF_P(varptr)) {
- Z_ADDREF_P(varptr);
- } else {
- ZVAL_MAKE_REF_EX(varptr, 2);
- }
- ZVAL_REF(arg, Z_REF_P(varptr));
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_SEND_HANDLER(66, ZEND_SEND_VAR_EX, VAR|CV, NUM, SPEC(QUICK_ARG))
- {
- USE_OPLINE
- zval *varptr, *arg;
- zend_free_op free_op1;
- uint32_t arg_num = opline->op2.num;
- if (EXPECTED(arg_num <= MAX_ARG_FLAG_NUM)) {
- if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_VM_C_GOTO(send_var_by_ref);
- }
- } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_VM_C_LABEL(send_var_by_ref):
- ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_REF);
- }
- varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(varptr, BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_NULL(arg);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- if (OP1_TYPE == IS_CV) {
- ZVAL_COPY_DEREF(arg, varptr);
- } else /* if (OP1_TYPE == IS_VAR) */ {
- if (UNEXPECTED(Z_ISREF_P(varptr))) {
- zend_refcounted *ref = Z_COUNTED_P(varptr);
- varptr = Z_REFVAL_P(varptr);
- ZVAL_COPY_VALUE(arg, varptr);
- if (UNEXPECTED(GC_DELREF(ref) == 0)) {
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(arg)) {
- Z_ADDREF_P(arg);
- }
- } else {
- ZVAL_COPY_VALUE(arg, varptr);
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_SEND_HANDLER(100, ZEND_CHECK_FUNC_ARG, UNUSED, NUM, SPEC(QUICK_ARG))
- {
- USE_OPLINE
- uint32_t arg_num = opline->op2.num;
- if (EXPECTED(arg_num <= MAX_ARG_FLAG_NUM)) {
- if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
- } else {
- ZEND_DEL_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
- }
- } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
- } else {
- ZEND_DEL_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_HANDLER(185, ZEND_SEND_FUNC_ARG, VAR, NUM)
- {
- USE_OPLINE
- zval *varptr, *arg;
- zend_free_op free_op1;
- if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
- ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_REF);
- }
- varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- if (UNEXPECTED(Z_ISREF_P(varptr))) {
- zend_refcounted *ref = Z_COUNTED_P(varptr);
- varptr = Z_REFVAL_P(varptr);
- ZVAL_COPY_VALUE(arg, varptr);
- if (UNEXPECTED(GC_DELREF(ref) == 0)) {
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(arg)) {
- Z_ADDREF_P(arg);
- }
- } else {
- ZVAL_COPY_VALUE(arg, varptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *args;
- int arg_num;
- SAVE_OPLINE();
- args = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- arg_num = ZEND_CALL_NUM_ARGS(EX(call)) + 1;
- ZEND_VM_C_LABEL(send_again):
- if (EXPECTED(Z_TYPE_P(args) == IS_ARRAY)) {
- HashTable *ht = Z_ARRVAL_P(args);
- zval *arg, *top;
- zend_string *name;
- zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, zend_hash_num_elements(ht));
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_REFCOUNT_P(args) > 1) {
- uint32_t i;
- int separate = 0;
- /* check if any of arguments are going to be passed by reference */
- for (i = 0; i < zend_hash_num_elements(ht); i++) {
- if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num + i)) {
- separate = 1;
- break;
- }
- }
- if (separate) {
- SEPARATE_ARRAY(args);
- ht = Z_ARRVAL_P(args);
- }
- }
- ZEND_HASH_FOREACH_STR_KEY_VAL(ht, name, arg) {
- if (name) {
- zend_throw_error(NULL, "Cannot unpack array with string keys");
- FREE_OP1();
- HANDLE_EXCEPTION();
- }
- top = ZEND_CALL_ARG(EX(call), arg_num);
- if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- if (Z_ISREF_P(arg)) {
- Z_ADDREF_P(arg);
- ZVAL_REF(top, Z_REF_P(arg));
- } else if (OP1_TYPE & (IS_VAR|IS_CV)) {
- /* array is already separated above */
- ZVAL_MAKE_REF_EX(arg, 2);
- ZVAL_REF(top, Z_REF_P(arg));
- } else {
- Z_TRY_ADDREF_P(arg);
- ZVAL_NEW_REF(top, arg);
- }
- } else {
- ZVAL_COPY_DEREF(top, arg);
- }
- ZEND_CALL_NUM_ARGS(EX(call))++;
- arg_num++;
- } ZEND_HASH_FOREACH_END();
- } else if (EXPECTED(Z_TYPE_P(args) == IS_OBJECT)) {
- zend_class_entry *ce = Z_OBJCE_P(args);
- zend_object_iterator *iter;
- if (!ce || !ce->get_iterator) {
- zend_error(E_WARNING, "Only arrays and Traversables can be unpacked");
- } else {
- iter = ce->get_iterator(ce, args, 0);
- if (UNEXPECTED(!iter)) {
- FREE_OP1();
- if (!EG(exception)) {
- zend_throw_exception_ex(
- NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name)
- );
- }
- HANDLE_EXCEPTION();
- }
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- }
- for (; iter->funcs->valid(iter) == SUCCESS; ++arg_num) {
- zval *arg, *top;
- if (UNEXPECTED(EG(exception) != NULL)) {
- break;
- }
- arg = iter->funcs->get_current_data(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- break;
- }
- if (iter->funcs->get_current_key) {
- zval key;
- iter->funcs->get_current_key(iter, &key);
- if (UNEXPECTED(EG(exception) != NULL)) {
- break;
- }
- if (UNEXPECTED(Z_TYPE(key) != IS_LONG)) {
- zend_throw_error(NULL,
- (Z_TYPE(key) == IS_STRING) ?
- "Cannot unpack Traversable with string keys" :
- "Cannot unpack Traversable with non-integer keys");
- zval_ptr_dtor(&key);
- break;
- }
- }
- if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- zend_error(
- E_WARNING, "Cannot pass by-reference argument %d of %s%s%s()"
- " by unpacking a Traversable, passing by-value instead", arg_num,
- EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
- EX(call)->func->common.scope ? "::" : "",
- ZSTR_VAL(EX(call)->func->common.function_name)
- );
- }
- ZVAL_DEREF(arg);
- Z_TRY_ADDREF_P(arg);
- zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1);
- top = ZEND_CALL_ARG(EX(call), arg_num);
- ZVAL_COPY_VALUE(top, arg);
- ZEND_CALL_NUM_ARGS(EX(call))++;
- iter->funcs->move_forward(iter);
- }
- zend_iterator_dtor(iter);
- }
- } else if (EXPECTED(Z_ISREF_P(args))) {
- args = Z_REFVAL_P(args);
- ZEND_VM_C_GOTO(send_again);
- } else {
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(args, BP_VAR_R);
- }
- zend_error(E_WARNING, "Only arrays and Traversables can be unpacked");
- }
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(119, ZEND_SEND_ARRAY, ANY, ANY, NUM)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *args;
- SAVE_OPLINE();
- args = GET_OP1_ZVAL_PTR(BP_VAR_R);
- if (UNEXPECTED(Z_TYPE_P(args) != IS_ARRAY)) {
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(args)) {
- args = Z_REFVAL_P(args);
- if (EXPECTED(Z_TYPE_P(args) == IS_ARRAY)) {
- ZEND_VM_C_GOTO(send_array);
- }
- }
- zend_internal_type_error(EX_USES_STRICT_TYPES(), "call_user_func_array() expects parameter 2 to be array, %s given", zend_get_type_by_const(Z_TYPE_P(args)));
- if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
- OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(call)->func));
- }
- if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
- OBJ_RELEASE(Z_OBJ(EX(call)->This));
- }
- EX(call)->func = (zend_function*)&zend_pass_function;
- Z_OBJ(EX(call)->This) = NULL;
- ZEND_SET_CALL_INFO(EX(call), 0, ZEND_CALL_INFO(EX(call)) & ~ZEND_CALL_RELEASE_THIS);
- FREE_UNFETCHED_OP2();
- } else {
- uint32_t arg_num;
- HashTable *ht;
- zval *arg, *param;
- ZEND_VM_C_LABEL(send_array):
- ht = Z_ARRVAL_P(args);
- if (OP2_TYPE != IS_UNUSED) {
- zend_free_op free_op2;
- zval *op2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
- uint32_t skip = opline->extended_value;
- uint32_t count = zend_hash_num_elements(ht);
- zend_long len = zval_get_long(op2);
- if (len < 0) {
- len += (zend_long)(count - skip);
- }
- if (skip < count && len > 0) {
- if (len > (zend_long)(count - skip)) {
- len = (zend_long)(count - skip);
- }
- zend_vm_stack_extend_call_frame(&EX(call), 0, len);
- arg_num = 1;
- param = ZEND_CALL_ARG(EX(call), 1);
- ZEND_HASH_FOREACH_VAL(ht, arg) {
- if (skip > 0) {
- skip--;
- continue;
- } else if ((zend_long)(arg_num - 1) >= len) {
- break;
- } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- if (UNEXPECTED(!Z_ISREF_P(arg))) {
- if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- /* By-value send is not allowed -- emit a warning,
- * but still perform the call. */
- zend_param_must_be_ref(EX(call)->func, arg_num);
- }
- }
- } else {
- if (Z_ISREF_P(arg) &&
- !(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
- /* don't separate references for __call */
- arg = Z_REFVAL_P(arg);
- }
- }
- ZVAL_COPY(param, arg);
- ZEND_CALL_NUM_ARGS(EX(call))++;
- arg_num++;
- param++;
- } ZEND_HASH_FOREACH_END();
- }
- FREE_OP2();
- } else {
- zend_vm_stack_extend_call_frame(&EX(call), 0, zend_hash_num_elements(ht));
- arg_num = 1;
- param = ZEND_CALL_ARG(EX(call), 1);
- ZEND_HASH_FOREACH_VAL(ht, arg) {
- if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- if (UNEXPECTED(!Z_ISREF_P(arg))) {
- if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- /* By-value send is not allowed -- emit a warning,
- * but still perform the call. */
- zend_param_must_be_ref(EX(call)->func, arg_num);
- }
- }
- } else {
- if (Z_ISREF_P(arg) &&
- !(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
- /* don't separate references for __call */
- arg = Z_REFVAL_P(arg);
- }
- }
- ZVAL_COPY(param, arg);
- ZEND_CALL_NUM_ARGS(EX(call))++;
- arg_num++;
- param++;
- } ZEND_HASH_FOREACH_END();
- }
- }
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(120, ZEND_SEND_USER, CONST|TMP|VAR|CV, NUM)
- {
- USE_OPLINE
- zval *arg, *param;
- zend_free_op free_op1;
- SAVE_OPLINE();
- arg = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- param = ZEND_CALL_VAR(EX(call), opline->result.var);
- if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
- zend_param_must_be_ref(EX(call)->func, opline->op2.num);
- }
- ZVAL_COPY(param, arg);
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_HANDLER(63, ZEND_RECV, NUM, UNUSED|CACHE_SLOT)
- {
- USE_OPLINE
- uint32_t arg_num = opline->op1.num;
- if (UNEXPECTED(arg_num > EX_NUM_ARGS())) {
- SAVE_OPLINE();
- zend_missing_arg_error(execute_data);
- HANDLE_EXCEPTION();
- } else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- zval *param = EX_VAR(opline->result.var);
- SAVE_OPLINE();
- if (UNEXPECTED(!zend_verify_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num)) || EG(exception))) {
- HANDLE_EXCEPTION();
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_HANDLER(64, ZEND_RECV_INIT, NUM, CONST, CACHE_SLOT)
- {
- USE_OPLINE
- uint32_t arg_num;
- zval *param;
- ZEND_VM_REPEATABLE_OPCODE
- arg_num = opline->op1.num;
- param = EX_VAR(opline->result.var);
- if (arg_num > EX_NUM_ARGS()) {
- zval *default_value = RT_CONSTANT(opline, opline->op2);
- if (Z_OPT_TYPE_P(default_value) == IS_CONSTANT_AST) {
- zval *cache_val = (zval*)CACHE_ADDR(Z_CACHE_SLOT_P(default_value));
- /* we keep in cache only not refcounted values */
- if (Z_TYPE_P(cache_val) != IS_UNDEF) {
- ZVAL_COPY_VALUE(param, cache_val);
- } else {
- SAVE_OPLINE();
- ZVAL_COPY(param, default_value);
- if (UNEXPECTED(zval_update_constant_ex(param, EX(func)->op_array.scope) != SUCCESS)) {
- zval_ptr_dtor_nogc(param);
- ZVAL_UNDEF(param);
- HANDLE_EXCEPTION();
- }
- if (!Z_REFCOUNTED_P(param)) {
- ZVAL_COPY_VALUE(cache_val, param);
- }
- }
- } else {
- ZVAL_COPY(param, default_value);
- }
- }
- if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- zval *default_value = RT_CONSTANT(opline, opline->op2);
- SAVE_OPLINE();
- if (UNEXPECTED(!zend_verify_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(opline->extended_value)) || EG(exception))) {
- HANDLE_EXCEPTION();
- }
- }
- ZEND_VM_REPEAT_OPCODE(ZEND_RECV_INIT);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, UNUSED|CACHE_SLOT)
- {
- USE_OPLINE
- uint32_t arg_num = opline->op1.num;
- uint32_t arg_count = EX_NUM_ARGS();
- zval *params;
- SAVE_OPLINE();
- params = EX_VAR(opline->result.var);
- if (arg_num <= arg_count) {
- zval *param;
- array_init_size(params, arg_count - arg_num + 1);
- zend_hash_real_init_packed(Z_ARRVAL_P(params));
- ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(params)) {
- param = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T);
- if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_FREE_EXTRA_ARGS);
- do {
- zend_verify_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num));
- if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);
- ZEND_HASH_FILL_ADD(param);
- param++;
- } while (++arg_num <= arg_count);
- } else {
- do {
- if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);
- ZEND_HASH_FILL_ADD(param);
- param++;
- } while (++arg_num <= arg_count);
- }
- } ZEND_HASH_FILL_END();
- } else {
- ZVAL_EMPTY_ARRAY(params);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONST_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY)
- {
- USE_OPLINE
- zval *val;
- zend_free_op free_op1;
- val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- /* The result and op1 can be the same cv zval */
- const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
- ZVAL_FALSE(EX_VAR(opline->result.var));
- if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- } else {
- SAVE_OPLINE();
- ZVAL_BOOL(EX_VAR(opline->result.var), i_zend_is_true(val));
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(48, ZEND_CASE, TMPVAR, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- do {
- int result;
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
- FREE_OP2();
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, UNUSED|CACHE_SLOT, NUM)
- {
- USE_OPLINE
- zval *result;
- zend_function *constructor;
- zend_class_entry *ce;
- zend_execute_data *call;
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CONST) {
- ce = CACHED_PTR(opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(opline->op2.num, ce);
- }
- } else if (OP1_TYPE == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op1.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op1.var));
- }
- result = EX_VAR(opline->result.var);
- if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
- ZVAL_UNDEF(result);
- HANDLE_EXCEPTION();
- }
- constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
- if (constructor == NULL) {
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
- /* If there are no arguments, skip over the DO_FCALL opcode. We check if the next
- * opcode is DO_FCALL in case EXT instructions are used. */
- if (EXPECTED(opline->extended_value == 0 && (opline+1)->opcode == ZEND_DO_FCALL)) {
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
- }
- /* Perform a dummy function call */
- call = zend_vm_stack_push_call_frame(
- ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
- opline->extended_value, NULL, NULL);
- } else {
- if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
- init_func_run_time_cache(&constructor->op_array);
- }
- /* We are not handling overloaded classes right now */
- call = zend_vm_stack_push_call_frame(
- ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
- constructor,
- opline->extended_value,
- ce,
- Z_OBJ_P(result));
- Z_ADDREF_P(result);
- }
- call->prev_execute_data = EX(call);
- EX(call) = call;
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_CONST_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *obj;
- zend_class_entry *ce, *scope;
- zend_function *clone;
- zend_object_clone_obj_t clone_call;
- SAVE_OPLINE();
- obj = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- do {
- if (OP1_TYPE == IS_CONST ||
- (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
- obj = Z_REFVAL_P(obj);
- if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
- break;
- }
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(obj, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "__clone method called on non-object");
- FREE_OP1();
- HANDLE_EXCEPTION();
- }
- } while (0);
- ce = Z_OBJCE_P(obj);
- clone = ce->clone;
- clone_call = Z_OBJ_HT_P(obj)->clone_obj;
- if (UNEXPECTED(clone_call == NULL)) {
- zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
- FREE_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- if (clone) {
- if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
- /* Ensure that if we're calling a private function, we're allowed to do so.
- */
- scope = EX(func)->op_array.scope;
- if (!zend_check_private(clone, scope, clone->common.function_name)) {
- zend_throw_error(NULL, "Call to private %s::__clone() from context '%s'", ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
- FREE_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
- /* Ensure that if we're calling a protected function, we're allowed to do so.
- */
- scope = EX(func)->op_array.scope;
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
- zend_throw_error(NULL, "Call to protected %s::__clone() from context '%s'", ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
- FREE_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
- }
- ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_HANDLER(99, ZEND_FETCH_CONSTANT, UNUSED|CONST_FETCH, CONST, CACHE_SLOT)
- {
- USE_OPLINE
- zend_constant *c;
- c = CACHED_PTR(opline->extended_value);
- if (EXPECTED(c != NULL) && EXPECTED(!IS_SPECIAL_CACHE_VAL(c))) {
- ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), &c->value);
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- zend_quick_get_constant(RT_CONSTANT(opline, opline->op2) + 1, opline->op1.num OPLINE_CC EXECUTE_DATA_CC);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CONST, CACHE_SLOT)
- {
- zend_class_entry *ce, *scope;
- zend_class_constant *c;
- zval *value, *zv;
- USE_OPLINE
- SAVE_OPLINE();
- do {
- if (OP1_TYPE == IS_CONST) {
- if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
- value = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- } else if (EXPECTED(CACHED_PTR(opline->extended_value))) {
- ce = CACHED_PTR(opline->extended_value);
- } else {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
- } else {
- if (OP1_TYPE == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op1.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op1.var));
- }
- if (EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
- value = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- }
- }
- zv = zend_hash_find_ex(&ce->constants_table, Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
- if (EXPECTED(zv != NULL)) {
- c = Z_PTR_P(zv);
- scope = EX(func)->op_array.scope;
- if (!zend_verify_const_access(c, scope)) {
- zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- value = &c->value;
- if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
- zval_update_constant_ex(value, c->ce);
- if (UNEXPECTED(EG(exception) != NULL)) {
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
- CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
- } else {
- zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } while (0);
- ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), value);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, REF)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *expr_ptr, new_expr;
- SAVE_OPLINE();
- if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) &&
- UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
- expr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
- if (Z_ISREF_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- } else {
- ZVAL_MAKE_REF_EX(expr_ptr, 2);
- }
- FREE_OP1_VAR_PTR();
- } else {
- expr_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
- if (OP1_TYPE == IS_TMP_VAR) {
- /* pass */
- } else if (OP1_TYPE == IS_CONST) {
- Z_TRY_ADDREF_P(expr_ptr);
- } else if (OP1_TYPE == IS_CV) {
- ZVAL_DEREF(expr_ptr);
- Z_TRY_ADDREF_P(expr_ptr);
- } else /* if (OP1_TYPE == IS_VAR) */ {
- if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
- zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
- expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(GC_DELREF(ref) == 0)) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
- }
- }
- }
- if (OP2_TYPE != IS_UNUSED) {
- zend_free_op free_op2;
- zval *offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- zend_string *str;
- zend_ulong hval;
- ZEND_VM_C_LABEL(add_again):
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- str = Z_STR_P(offset);
- if (OP2_TYPE != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- ZEND_VM_C_GOTO(num_index);
- }
- }
- ZEND_VM_C_LABEL(str_index):
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
- ZEND_VM_C_LABEL(num_index):
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- } else if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
- offset = Z_REFVAL_P(offset);
- ZEND_VM_C_GOTO(add_again);
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- ZEND_VM_C_GOTO(str_index);
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- ZEND_VM_C_GOTO(num_index);
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- ZEND_VM_C_GOTO(num_index);
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- ZEND_VM_C_GOTO(num_index);
- } else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- ZEND_VM_C_GOTO(str_index);
- } else {
- zend_illegal_offset();
- zval_ptr_dtor_nogc(expr_ptr);
- }
- FREE_OP2();
- } else {
- if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_cannot_add_element();
- zval_ptr_dtor_nogc(expr_ptr);
- }
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(71, ZEND_INIT_ARRAY, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, ARRAY_INIT|REF)
- {
- zval *array;
- uint32_t size;
- USE_OPLINE
- array = EX_VAR(opline->result.var);
- if (OP1_TYPE != IS_UNUSED) {
- size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- ZVAL_ARR(array, zend_new_array(size));
- /* Explicitly initialize array as not-packed if flag is set */
- if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init_mixed(Z_ARRVAL_P(array));
- }
- ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ADD_ARRAY_ELEMENT);
- } else {
- ZVAL_EMPTY_ARRAY(array);
- ZEND_VM_NEXT_OPCODE();
- }
- }
- ZEND_VM_COLD_CONST_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *expr;
- zval *result = EX_VAR(opline->result.var);
- HashTable *ht;
- SAVE_OPLINE();
- expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
- switch (opline->extended_value) {
- case IS_NULL:
- ZVAL_NULL(result);
- break;
- case _IS_BOOL:
- ZVAL_BOOL(result, zend_is_true(expr));
- break;
- case IS_LONG:
- ZVAL_LONG(result, zval_get_long(expr));
- break;
- case IS_DOUBLE:
- ZVAL_DOUBLE(result, zval_get_double(expr));
- break;
- case IS_STRING:
- ZVAL_STR(result, zval_get_string(expr));
- break;
- default:
- if (OP1_TYPE & (IS_VAR|IS_CV)) {
- ZVAL_DEREF(expr);
- }
- /* If value is already of correct type, return it directly */
- if (Z_TYPE_P(expr) == opline->extended_value) {
- ZVAL_COPY_VALUE(result, expr);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
- } else if (OP1_TYPE != IS_TMP_VAR) {
- if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
- }
- FREE_OP1_IF_VAR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- if (opline->extended_value == IS_ARRAY) {
- if (OP1_TYPE == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
- if (Z_TYPE_P(expr) != IS_NULL) {
- ZVAL_ARR(result, zend_new_array(1));
- expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
- } else {
- if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
- }
- } else {
- ZVAL_EMPTY_ARRAY(result);
- }
- } else if (Z_OBJ_HT_P(expr)->get_properties) {
- HashTable *obj_ht = Z_OBJ_HT_P(expr)->get_properties(expr);
- if (obj_ht) {
- /* fast copy */
- obj_ht = zend_proptable_to_symtable(obj_ht,
- (Z_OBJCE_P(expr)->default_properties_count ||
- Z_OBJ_P(expr)->handlers != &std_object_handlers ||
- GC_IS_RECURSIVE(obj_ht)));
- ZVAL_ARR(result, obj_ht);
- } else {
- ZVAL_EMPTY_ARRAY(result);
- }
- } else {
- ZVAL_COPY_VALUE(result, expr);
- Z_ADDREF_P(result);
- convert_to_array(result);
- }
- } else {
- ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
- if (Z_TYPE_P(expr) == IS_ARRAY) {
- ht = zend_symtable_to_proptable(Z_ARR_P(expr));
- if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) {
- /* TODO: try not to duplicate immutable arrays as well ??? */
- ht = zend_array_dup(ht);
- }
- Z_OBJ_P(result)->properties = ht;
- } else if (Z_TYPE_P(expr) != IS_NULL) {
- Z_OBJ_P(result)->properties = ht = zend_new_array(1);
- expr = zend_hash_add_new(ht, ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
- } else {
- if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
- }
- }
- }
- }
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL)
- {
- USE_OPLINE
- zend_op_array *new_op_array;
- zend_free_op free_op1;
- zval *inc_filename;
- SAVE_OPLINE();
- inc_filename = GET_OP1_ZVAL_PTR(BP_VAR_R);
- new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
- FREE_OP1();
- if (UNEXPECTED(EG(exception) != NULL)) {
- if (new_op_array != ZEND_FAKE_OP_ARRAY && new_op_array != NULL) {
- destroy_op_array(new_op_array);
- efree_size(new_op_array, sizeof(zend_op_array));
- }
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else if (new_op_array == ZEND_FAKE_OP_ARRAY) {
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- }
- } else if (EXPECTED(new_op_array != NULL)) {
- zval *return_value = NULL;
- zend_execute_data *call;
- if (RETURN_VALUE_USED(opline)) {
- return_value = EX_VAR(opline->result.var);
- ZVAL_NULL(return_value);
- }
- new_op_array->scope = EX(func)->op_array.scope;
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
- (zend_function*)new_op_array, 0,
- Z_TYPE(EX(This)) != IS_OBJECT ? Z_CE(EX(This)) : NULL,
- Z_TYPE(EX(This)) == IS_OBJECT ? Z_OBJ(EX(This)) : NULL);
- if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) {
- call->symbol_table = EX(symbol_table);
- } else {
- call->symbol_table = zend_rebuild_symbol_table();
- }
- call->prev_execute_data = execute_data;
- i_init_code_execute_data(call, new_op_array, return_value);
- if (EXPECTED(zend_execute_ex == execute_ex)) {
- ZEND_VM_ENTER();
- } else {
- ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
- zend_execute_ex(call);
- zend_vm_stack_free_call_frame(call);
- }
- destroy_op_array(new_op_array);
- efree_size(new_op_array, sizeof(zend_op_array));
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_rethrow_exception(execute_data);
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- } else if (RETURN_VALUE_USED(opline)) {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(196, ZEND_UNSET_CV, CV, UNUSED)
- {
- USE_OPLINE
- zval *var = EX_VAR(opline->op1.var);
- if (Z_REFCOUNTED_P(var)) {
- zend_refcounted *garbage = Z_COUNTED_P(var);
- ZVAL_UNDEF(var);
- SAVE_OPLINE();
- if (!GC_DELREF(garbage)) {
- rc_dtor_func(garbage);
- } else {
- gc_check_possible_root(garbage);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZVAL_UNDEF(var);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
- {
- USE_OPLINE
- zval *varname;
- zend_string *name, *tmp_name;
- HashTable *target_symbol_table;
- zend_free_op free_op1;
- SAVE_OPLINE();
- varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_CONST) {
- name = Z_STR_P(varname);
- } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
- name = Z_STR_P(varname);
- tmp_name = NULL;
- } else {
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- name = zval_get_tmp_string(varname, &tmp_name);
- }
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
- zend_hash_del_ind(target_symbol_table, name);
- if (OP1_TYPE != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_HANDLER(179, ZEND_UNSET_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
- {
- USE_OPLINE
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
- zend_free_op free_op1;
- SAVE_OPLINE();
- if (OP2_TYPE == IS_CONST) {
- ce = CACHED_PTR(opline->extended_value);
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- FREE_UNFETCHED_OP1();
- HANDLE_EXCEPTION();
- }
- /*CACHE_PTR(opline->extended_value, ce);*/
- }
- } else if (OP2_TYPE == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- FREE_UNFETCHED_OP1();
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_CONST) {
- name = Z_STR_P(varname);
- } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
- name = Z_STR_P(varname);
- tmp_name = NULL;
- } else {
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- name = zval_get_tmp_string(varname, &tmp_name);
- }
- zend_std_unset_static_property(ce, name);
- if (OP1_TYPE != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(75, ZEND_UNSET_DIM, VAR|CV, CONST|TMPVAR|CV)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- zval *offset;
- zend_ulong hval;
- zend_string *key;
- SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
- offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- do {
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- HashTable *ht;
- ZEND_VM_C_LABEL(unset_dim_array):
- SEPARATE_ARRAY(container);
- ht = Z_ARRVAL_P(container);
- ZEND_VM_C_LABEL(offset_again):
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- key = Z_STR_P(offset);
- if (OP2_TYPE != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(key, hval)) {
- ZEND_VM_C_GOTO(num_index_dim);
- }
- }
- ZEND_VM_C_LABEL(str_index_dim):
- if (ht == &EG(symbol_table)) {
- zend_delete_global_variable(key);
- } else {
- zend_hash_del(ht, key);
- }
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
- ZEND_VM_C_LABEL(num_index_dim):
- zend_hash_index_del(ht, hval);
- } else if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
- offset = Z_REFVAL_P(offset);
- ZEND_VM_C_GOTO(offset_again);
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- ZEND_VM_C_GOTO(num_index_dim);
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- key = ZSTR_EMPTY_ALLOC();
- ZEND_VM_C_GOTO(str_index_dim);
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- ZEND_VM_C_GOTO(num_index_dim);
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- ZEND_VM_C_GOTO(num_index_dim);
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- ZEND_VM_C_GOTO(num_index_dim);
- } else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- key = ZSTR_EMPTY_ALLOC();
- ZEND_VM_C_GOTO(str_index_dim);
- } else {
- zend_error(E_WARNING, "Illegal offset type in unset");
- }
- break;
- } else if (Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- ZEND_VM_C_GOTO(unset_dim_array);
- }
- }
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- container = GET_OP1_UNDEF_CV(container, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- }
- if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_use_object_as_array();
- } else {
- if (OP2_TYPE == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
- offset++;
- }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
- }
- } else if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_throw_error(NULL, "Cannot unset string offsets");
- }
- } while (0);
- FREE_OP2();
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- zval *offset;
- SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
- do {
- if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- if (Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (Z_TYPE_P(container) != IS_OBJECT) {
- break;
- }
- } else {
- break;
- }
- }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
- } else {
- zend_wrong_property_unset(offset);
- }
- } while (0);
- FREE_OP2();
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *array_ptr, *result;
- SAVE_OPLINE();
- array_ptr = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(array_ptr) == IS_ARRAY)) {
- result = EX_VAR(opline->result.var);
- ZVAL_COPY_VALUE(result, array_ptr);
- if (OP1_TYPE != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(result)) {
- Z_ADDREF_P(array_ptr);
- }
- Z_FE_POS_P(result) = 0;
- FREE_OP1_IF_VAR();
- ZEND_VM_NEXT_OPCODE();
- } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
- if (!Z_OBJCE_P(array_ptr)->get_iterator) {
- result = EX_VAR(opline->result.var);
- ZVAL_COPY_VALUE(result, array_ptr);
- if (OP1_TYPE != IS_TMP_VAR) {
- Z_ADDREF_P(array_ptr);
- }
- if (Z_OBJ_P(array_ptr)->properties
- && UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_DELREF(Z_OBJ_P(array_ptr)->properties);
- }
- Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
- }
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_OBJPROP_P(array_ptr), 0);
- FREE_OP1_IF_VAR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
- FREE_OP1();
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- } else if (is_empty) {
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- } else {
- ZEND_VM_NEXT_OPCODE();
- }
- }
- } else {
- zend_error(E_WARNING, "Invalid argument supplied for foreach()");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
- FREE_OP1();
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- }
- }
- ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *array_ptr, *array_ref;
- SAVE_OPLINE();
- if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
- array_ref = array_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
- if (Z_ISREF_P(array_ref)) {
- array_ptr = Z_REFVAL_P(array_ref);
- }
- } else {
- array_ref = array_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
- }
- if (EXPECTED(Z_TYPE_P(array_ptr) == IS_ARRAY)) {
- if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
- if (array_ptr == array_ref) {
- ZVAL_NEW_REF(array_ref, array_ref);
- array_ptr = Z_REFVAL_P(array_ref);
- }
- Z_ADDREF_P(array_ref);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), array_ref);
- } else {
- array_ref = EX_VAR(opline->result.var);
- ZVAL_NEW_REF(array_ref, array_ptr);
- array_ptr = Z_REFVAL_P(array_ref);
- }
- if (OP1_TYPE == IS_CONST) {
- ZVAL_ARR(array_ptr, zend_array_dup(Z_ARRVAL_P(array_ptr)));
- } else {
- SEPARATE_ARRAY(array_ptr);
- }
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
- if (OP1_TYPE == IS_VAR) {
- FREE_OP1_VAR_PTR();
- }
- ZEND_VM_NEXT_OPCODE();
- } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
- if (!Z_OBJCE_P(array_ptr)->get_iterator) {
- if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
- if (array_ptr == array_ref) {
- ZVAL_NEW_REF(array_ref, array_ref);
- array_ptr = Z_REFVAL_P(array_ref);
- }
- Z_ADDREF_P(array_ref);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), array_ref);
- } else {
- array_ptr = EX_VAR(opline->result.var);
- ZVAL_COPY_VALUE(array_ptr, array_ref);
- }
- if (Z_OBJ_P(array_ptr)->properties
- && UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_DELREF(Z_OBJ_P(array_ptr)->properties);
- }
- Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
- }
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_OBJPROP_P(array_ptr), 0);
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
- if (OP1_TYPE == IS_VAR) {
- FREE_OP1_VAR_PTR();
- } else {
- FREE_OP1();
- }
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- } else if (is_empty) {
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- } else {
- ZEND_VM_NEXT_OPCODE();
- }
- }
- } else {
- zend_error(E_WARNING, "Invalid argument supplied for foreach()");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
- if (OP1_TYPE == IS_VAR) {
- FREE_OP1_VAR_PTR();
- } else {
- FREE_OP1();
- }
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- }
- }
- ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
- {
- USE_OPLINE
- zval *array;
- zval *value;
- uint32_t value_type;
- HashTable *fe_ht;
- HashPosition pos;
- Bucket *p;
- array = EX_VAR(opline->op1.var);
- SAVE_OPLINE();
- if (EXPECTED(Z_TYPE_P(array) == IS_ARRAY)) {
- fe_ht = Z_ARRVAL_P(array);
- pos = Z_FE_POS_P(array);
- p = fe_ht->arData + pos;
- while (1) {
- if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
- /* reached end of iteration */
- ZEND_VM_C_LABEL(fe_fetch_r_exit):
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
- value = &p->val;
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- break;
- }
- } else {
- break;
- }
- }
- pos++;
- p++;
- }
- Z_FE_POS_P(array) = pos + 1;
- if (RETURN_VALUE_USED(opline)) {
- if (!p->key) {
- ZVAL_LONG(EX_VAR(opline->result.var), p->h);
- } else {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
- }
- }
- } else {
- zend_object_iterator *iter;
- ZEND_ASSERT(Z_TYPE_P(array) == IS_OBJECT);
- if ((iter = zend_iterator_unwrap(array)) == NULL) {
- /* plain object */
- fe_ht = Z_OBJPROP_P(array);
- pos = zend_hash_iterator_pos(Z_FE_ITER_P(array), fe_ht);
- p = fe_ht->arData + pos;
- while (1) {
- if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
- /* reached end of iteration */
- ZEND_VM_C_GOTO(fe_fetch_r_exit);
- }
- value = &p->val;
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)
- && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) {
- break;
- }
- } else {
- break;
- }
- }
- pos++;
- p++;
- }
- if (RETURN_VALUE_USED(opline)) {
- if (UNEXPECTED(!p->key)) {
- ZVAL_LONG(EX_VAR(opline->result.var), p->h);
- } else if (ZSTR_VAL(p->key)[0]) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
- } else {
- const char *class_name, *prop_name;
- size_t prop_name_len;
- zend_unmangle_property_name_ex(
- p->key, &class_name, &prop_name, &prop_name_len);
- ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
- }
- }
- EG(ht_iterators)[Z_FE_ITER_P(array)].pos = pos + 1;
- } else {
- if (EXPECTED(++iter->index > 0)) {
- /* This could cause an endless loop if index becomes zero again.
- * In case that ever happens we need an additional flag. */
- iter->funcs->move_forward(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- if (UNEXPECTED(iter->funcs->valid(iter) == FAILURE)) {
- /* reached end of iteration */
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- ZEND_VM_C_GOTO(fe_fetch_r_exit);
- }
- }
- value = iter->funcs->get_current_data(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- if (!value) {
- /* failure in get_current_data */
- ZEND_VM_C_GOTO(fe_fetch_r_exit);
- }
- if (RETURN_VALUE_USED(opline)) {
- if (iter->funcs->get_current_key) {
- iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- } else {
- ZVAL_LONG(EX_VAR(opline->result.var), iter->index);
- }
- }
- value_type = Z_TYPE_INFO_P(value);
- }
- }
- if (EXPECTED(OP2_TYPE == IS_CV)) {
- zval *variable_ptr = EX_VAR(opline->op2.var);
- zend_assign_to_variable(variable_ptr, value, IS_CV);
- } else {
- zval *res = EX_VAR(opline->op2.var);
- zend_refcounted *gc = Z_COUNTED_P(value);
- ZVAL_COPY_VALUE_EX(res, value, gc, value_type);
- if (Z_TYPE_INFO_REFCOUNTED(value_type)) {
- GC_ADDREF(gc);
- }
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
- {
- USE_OPLINE
- zval *array;
- zval *value;
- uint32_t value_type;
- HashTable *fe_ht;
- HashPosition pos;
- Bucket *p;
- array = EX_VAR(opline->op1.var);
- SAVE_OPLINE();
- ZVAL_DEREF(array);
- if (EXPECTED(Z_TYPE_P(array) == IS_ARRAY)) {
- pos = zend_hash_iterator_pos_ex(Z_FE_ITER_P(EX_VAR(opline->op1.var)), array);
- fe_ht = Z_ARRVAL_P(array);
- p = fe_ht->arData + pos;
- while (1) {
- if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
- /* reached end of iteration */
- ZEND_VM_C_GOTO(fe_fetch_w_exit);
- }
- value = &p->val;
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- break;
- }
- } else {
- break;
- }
- }
- pos++;
- p++;
- }
- if (RETURN_VALUE_USED(opline)) {
- if (!p->key) {
- ZVAL_LONG(EX_VAR(opline->result.var), p->h);
- } else {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
- }
- }
- EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos + 1;
- } else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) {
- zend_object_iterator *iter;
- if ((iter = zend_iterator_unwrap(array)) == NULL) {
- /* plain object */
- fe_ht = Z_OBJPROP_P(array);
- pos = zend_hash_iterator_pos(Z_FE_ITER_P(EX_VAR(opline->op1.var)), fe_ht);
- p = fe_ht->arData + pos;
- while (1) {
- if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
- /* reached end of iteration */
- ZEND_VM_C_GOTO(fe_fetch_w_exit);
- }
- value = &p->val;
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)
- && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) {
- break;
- }
- } else {
- break;
- }
- }
- pos++;
- p++;
- }
- if (RETURN_VALUE_USED(opline)) {
- if (UNEXPECTED(!p->key)) {
- ZVAL_LONG(EX_VAR(opline->result.var), p->h);
- } else if (ZSTR_VAL(p->key)[0]) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
- } else {
- const char *class_name, *prop_name;
- size_t prop_name_len;
- zend_unmangle_property_name_ex(
- p->key, &class_name, &prop_name, &prop_name_len);
- ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
- }
- }
- EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos + 1;
- } else {
- if (++iter->index > 0) {
- /* This could cause an endless loop if index becomes zero again.
- * In case that ever happens we need an additional flag. */
- iter->funcs->move_forward(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- if (UNEXPECTED(iter->funcs->valid(iter) == FAILURE)) {
- /* reached end of iteration */
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- ZEND_VM_C_GOTO(fe_fetch_w_exit);
- }
- }
- value = iter->funcs->get_current_data(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- if (!value) {
- /* failure in get_current_data */
- ZEND_VM_C_GOTO(fe_fetch_w_exit);
- }
- if (RETURN_VALUE_USED(opline)) {
- if (iter->funcs->get_current_key) {
- iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- } else {
- ZVAL_LONG(EX_VAR(opline->result.var), iter->index);
- }
- }
- value_type = Z_TYPE_INFO_P(value);
- }
- } else {
- zend_error(E_WARNING, "Invalid argument supplied for foreach()");
- if (UNEXPECTED(EG(exception))) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- ZEND_VM_C_LABEL(fe_fetch_w_exit):
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
- if (EXPECTED((value_type & Z_TYPE_MASK) != IS_REFERENCE)) {
- zend_refcounted *gc = Z_COUNTED_P(value);
- zval *ref;
- ZVAL_NEW_EMPTY_REF(value);
- ref = Z_REFVAL_P(value);
- ZVAL_COPY_VALUE_EX(ref, value, gc, value_type);
- }
- if (EXPECTED(OP2_TYPE == IS_CV)) {
- zval *variable_ptr = EX_VAR(opline->op2.var);
- if (EXPECTED(variable_ptr != value)) {
- zend_reference *ref;
- ref = Z_REF_P(value);
- GC_ADDREF(ref);
- zval_ptr_dtor(variable_ptr);
- ZVAL_REF(variable_ptr, ref);
- }
- } else {
- Z_ADDREF_P(value);
- ZVAL_REF(EX_VAR(opline->op2.var), Z_REF_P(value));
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_HANDLER(197, ZEND_ISSET_ISEMPTY_CV, CV, UNUSED, ISSET, SPEC(ISSET))
- {
- USE_OPLINE
- zval *value;
- int result;
- value = EX_VAR(opline->op1.var);
- if (!(opline->extended_value & ZEND_ISEMPTY)) {
- result =
- Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else {
- SAVE_OPLINE();
- result = !i_zend_is_true(value);
- if (UNEXPECTED(EG(exception))) {
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|ISSET)
- {
- USE_OPLINE
- zval *value;
- int result;
- zend_free_op free_op1;
- zval *varname;
- zend_string *name, *tmp_name;
- HashTable *target_symbol_table;
- SAVE_OPLINE();
- varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
- if (OP1_TYPE == IS_CONST) {
- name = Z_STR_P(varname);
- } else {
- name = zval_get_tmp_string(varname, &tmp_name);
- }
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
- value = zend_hash_find_ex(target_symbol_table, name, OP1_TYPE == IS_CONST);
- if (OP1_TYPE != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
- FREE_OP1();
- if (!value) {
- result = (opline->extended_value & ZEND_ISEMPTY);
- } else {
- if (Z_TYPE_P(value) == IS_INDIRECT) {
- value = Z_INDIRECT_P(value);
- }
- if (!(opline->extended_value & ZEND_ISEMPTY)) {
- if (Z_ISREF_P(value)) {
- value = Z_REFVAL_P(value);
- }
- result = Z_TYPE_P(value) > IS_NULL;
- } else {
- result = !i_zend_is_true(value);
- }
- }
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, ISSET|CACHE_SLOT)
- {
- USE_OPLINE
- zval *value;
- int result;
- zend_free_op free_op1;
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
- SAVE_OPLINE();
- if (OP2_TYPE == IS_CONST) {
- if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- ZEND_VM_C_GOTO(is_static_prop_return);
- } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- if (OP1_TYPE != IS_CONST) {
- CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
- }
- }
- } else {
- if (OP2_TYPE == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- FREE_UNFETCHED_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- if (OP1_TYPE == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- ZEND_VM_C_GOTO(is_static_prop_return);
- }
- }
- varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
- if (OP1_TYPE == IS_CONST) {
- name = Z_STR_P(varname);
- } else {
- name = zval_get_tmp_string(varname, &tmp_name);
- }
- value = zend_std_get_static_property(ce, name, 1);
- if (OP1_TYPE == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
- }
- if (OP1_TYPE != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
- FREE_OP1();
- ZEND_VM_C_LABEL(is_static_prop_return):
- if (!(opline->extended_value & ZEND_ISEMPTY)) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else {
- result = !value || !i_zend_is_true(value);
- }
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, CONST|TMPVAR|CV, CONST|TMPVAR|CV, ISSET)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- int result;
- zend_ulong hval;
- zval *offset;
- SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_IS);
- offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- HashTable *ht;
- zval *value;
- zend_string *str;
- ZEND_VM_C_LABEL(isset_dim_obj_array):
- ht = Z_ARRVAL_P(container);
- ZEND_VM_C_LABEL(isset_again):
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- str = Z_STR_P(offset);
- if (OP2_TYPE != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- ZEND_VM_C_GOTO(num_index_prop);
- }
- }
- value = zend_hash_find_ex_ind(ht, str, OP2_TYPE == IS_CONST);
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
- ZEND_VM_C_LABEL(num_index_prop):
- value = zend_hash_index_find(ht, hval);
- } else if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
- offset = Z_REFVAL_P(offset);
- ZEND_VM_C_GOTO(isset_again);
- } else {
- value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
- }
- if (!(opline->extended_value & ZEND_ISEMPTY)) {
- /* > IS_NULL means not IS_UNDEF and not IS_NULL */
- result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else {
- result = (value == NULL || !i_zend_is_true(value));
- }
- ZEND_VM_C_GOTO(isset_dim_obj_exit);
- } else if ((OP1_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- ZEND_VM_C_GOTO(isset_dim_obj_array);
- }
- }
- if (OP2_TYPE == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
- offset++;
- }
- if (!(opline->extended_value & ZEND_ISEMPTY)) {
- result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
- } else {
- result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
- }
- ZEND_VM_C_LABEL(isset_dim_obj_exit):
- FREE_OP2();
- FREE_OP1();
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONST_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, ISSET|CACHE_SLOT)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- int result;
- zval *offset;
- SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS);
- if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
- if (OP1_TYPE == IS_CONST ||
- (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- ZEND_VM_C_GOTO(isset_no_object);
- }
- } else {
- ZEND_VM_C_GOTO(isset_no_object);
- }
- }
- if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_wrong_property_check(offset);
- ZEND_VM_C_LABEL(isset_no_object):
- result = (opline->extended_value & ZEND_ISEMPTY);
- } else {
- result =
- (opline->extended_value & ZEND_ISEMPTY) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
- }
- FREE_OP2();
- FREE_OP1();
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_HANDLER(79, ZEND_EXIT, CONST|TMPVAR|UNUSED|CV, ANY)
- {
- USE_OPLINE
- SAVE_OPLINE();
- if (OP1_TYPE != IS_UNUSED) {
- zend_free_op free_op1;
- zval *ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
- do {
- if (Z_TYPE_P(ptr) == IS_LONG) {
- EG(exit_status) = Z_LVAL_P(ptr);
- } else {
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(ptr)) {
- ptr = Z_REFVAL_P(ptr);
- if (Z_TYPE_P(ptr) == IS_LONG) {
- EG(exit_status) = Z_LVAL_P(ptr);
- break;
- }
- }
- zend_print_zval(ptr, 0);
- }
- } while (0);
- FREE_OP1();
- }
- zend_bailout();
- ZEND_VM_NEXT_OPCODE(); /* Never reached */
- }
- ZEND_VM_HANDLER(57, ZEND_BEGIN_SILENCE, ANY, ANY)
- {
- USE_OPLINE
- ZVAL_LONG(EX_VAR(opline->result.var), EG(error_reporting));
- if (EG(error_reporting)) {
- do {
- EG(error_reporting) = 0;
- if (!EG(error_reporting_ini_entry)) {
- zval *zv = zend_hash_find_ex(EG(ini_directives), ZSTR_KNOWN(ZEND_STR_ERROR_REPORTING), 1);
- if (zv) {
- EG(error_reporting_ini_entry) = (zend_ini_entry *)Z_PTR_P(zv);
- } else {
- break;
- }
- }
- if (!EG(error_reporting_ini_entry)->modified) {
- if (!EG(modified_ini_directives)) {
- ALLOC_HASHTABLE(EG(modified_ini_directives));
- zend_hash_init(EG(modified_ini_directives), 8, NULL, NULL, 0);
- }
- if (EXPECTED(zend_hash_add_ptr(EG(modified_ini_directives), ZSTR_KNOWN(ZEND_STR_ERROR_REPORTING), EG(error_reporting_ini_entry)) != NULL)) {
- EG(error_reporting_ini_entry)->orig_value = EG(error_reporting_ini_entry)->value;
- EG(error_reporting_ini_entry)->orig_modifiable = EG(error_reporting_ini_entry)->modifiable;
- EG(error_reporting_ini_entry)->modified = 1;
- }
- }
- } while (0);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(58, ZEND_END_SILENCE, TMP, ANY)
- {
- USE_OPLINE
- if (!EG(error_reporting) && Z_LVAL_P(EX_VAR(opline->op1.var)) != 0) {
- EG(error_reporting) = Z_LVAL_P(EX_VAR(opline->op1.var));
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_CONST_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, JMP_ADDR)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *value;
- zval *ref = NULL;
- int ret;
- SAVE_OPLINE();
- value = GET_OP1_ZVAL_PTR(BP_VAR_R);
- if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) && Z_ISREF_P(value)) {
- if (OP1_TYPE == IS_VAR) {
- ref = value;
- }
- value = Z_REFVAL_P(value);
- }
- ret = i_zend_is_true(value);
- if (UNEXPECTED(EG(exception))) {
- FREE_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- if (ret) {
- zval *result = EX_VAR(opline->result.var);
- ZVAL_COPY_VALUE(result, value);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
- } else if (OP1_TYPE == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
- } else if (OP1_TYPE == IS_VAR && ref) {
- zend_reference *r = Z_REF_P(ref);
- if (UNEXPECTED(GC_DELREF(r) == 0)) {
- efree_size(r, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(result)) {
- Z_ADDREF_P(result);
- }
- }
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- }
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_CONST_HANDLER(169, ZEND_COALESCE, CONST|TMPVAR|CV, JMP_ADDR)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *value;
- zval *ref = NULL;
- SAVE_OPLINE();
- value = GET_OP1_ZVAL_PTR(BP_VAR_IS);
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
- if (OP1_TYPE & IS_VAR) {
- ref = value;
- }
- value = Z_REFVAL_P(value);
- }
- if (Z_TYPE_P(value) > IS_NULL) {
- zval *result = EX_VAR(opline->result.var);
- ZVAL_COPY_VALUE(result, value);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
- } else if (OP1_TYPE == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
- } else if ((OP1_TYPE & IS_VAR) && ref) {
- zend_reference *r = Z_REF_P(ref);
- if (UNEXPECTED(GC_DELREF(r) == 0)) {
- efree_size(r, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(result)) {
- Z_ADDREF_P(result);
- }
- }
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- }
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *value;
- zval *result = EX_VAR(opline->result.var);
- value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(value, BP_VAR_R);
- ZVAL_NULL(result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- if (OP1_TYPE == IS_CV) {
- ZVAL_COPY_DEREF(result, value);
- } else if (OP1_TYPE == IS_VAR) {
- if (UNEXPECTED(Z_ISREF_P(value))) {
- ZVAL_COPY_VALUE(result, Z_REFVAL_P(value));
- if (UNEXPECTED(Z_DELREF_P(value) == 0)) {
- efree_size(Z_REF_P(value), sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(result)) {
- Z_ADDREF_P(result);
- }
- } else {
- ZVAL_COPY_VALUE(result, value);
- }
- } else {
- ZVAL_COPY_VALUE(result, value);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) {
- Z_ADDREF_P(result);
- }
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_HANDLER(101, ZEND_EXT_STMT, ANY, ANY)
- {
- USE_OPLINE
- if (!EG(no_extensions)) {
- SAVE_OPLINE();
- zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_statement_handler, execute_data);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_HANDLER(102, ZEND_EXT_FCALL_BEGIN, ANY, ANY)
- {
- USE_OPLINE
- if (!EG(no_extensions)) {
- SAVE_OPLINE();
- zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_begin_handler, execute_data);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_HANDLER(103, ZEND_EXT_FCALL_END, ANY, ANY)
- {
- USE_OPLINE
- if (!EG(no_extensions)) {
- SAVE_OPLINE();
- zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_end_handler, execute_data);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(139, ZEND_DECLARE_CLASS, CONST, ANY)
- {
- USE_OPLINE
- SAVE_OPLINE();
- Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(140, ZEND_DECLARE_INHERITED_CLASS, CONST, CONST)
- {
- zend_class_entry *parent;
- USE_OPLINE
- SAVE_OPLINE();
- parent = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
- RT_CONSTANT(opline, opline->op2) + 1,
- ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(parent == NULL)) {
- ZEND_ASSERT(EG(exception));
- HANDLE_EXCEPTION();
- }
- Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), parent, 0);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(145, ZEND_DECLARE_INHERITED_CLASS_DELAYED, CONST, CONST)
- {
- USE_OPLINE
- zval *zce, *orig_zce;
- zend_class_entry *parent;
- SAVE_OPLINE();
- if ((zce = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1)) == NULL ||
- ((orig_zce = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)+1), 1)) != NULL &&
- Z_CE_P(zce) != Z_CE_P(orig_zce))) {
- parent = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
- RT_CONSTANT(opline, opline->op2) + 1,
- ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(parent == NULL)) {
- ZEND_ASSERT(EG(exception));
- HANDLE_EXCEPTION();
- }
- do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), parent, 0);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(171, ZEND_DECLARE_ANON_CLASS, ANY, ANY, JMP_ADDR)
- {
- zval *zv;
- zend_class_entry *ce;
- USE_OPLINE
- SAVE_OPLINE();
- zv = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
- ZEND_ASSERT(zv != NULL);
- ce = Z_CE_P(zv);
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
- if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) {
- zend_verify_abstract_class(ce);
- }
- ce->ce_flags |= ZEND_ACC_ANON_BOUND;
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(172, ZEND_DECLARE_ANON_INHERITED_CLASS, CONST, CONST, JMP_ADDR)
- {
- zval *zv;
- zend_class_entry *ce, *parent;
- USE_OPLINE
- SAVE_OPLINE();
- zv = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
- ZEND_ASSERT(zv != NULL);
- ce = Z_CE_P(zv);
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
- parent = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
- RT_CONSTANT(opline, opline->op2) + 1,
- ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(parent == NULL)) {
- ZEND_ASSERT(EG(exception));
- HANDLE_EXCEPTION();
- }
- zend_do_inheritance(ce, parent);
- ce->ce_flags |= ZEND_ACC_ANON_BOUND;
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, ANY)
- {
- USE_OPLINE
- SAVE_OPLINE();
- do_bind_function(&EX(func)->op_array, opline, EG(function_table), 0);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(105, ZEND_TICKS, ANY, ANY, NUM)
- {
- USE_OPLINE
- if ((uint32_t)++EG(ticks_count) >= opline->extended_value) {
- EG(ticks_count) = 0;
- if (zend_ticks_function) {
- SAVE_OPLINE();
- zend_ticks_function(opline->extended_value);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *expr;
- zend_bool result;
- SAVE_OPLINE();
- expr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- ZEND_VM_C_LABEL(try_instanceof):
- if (Z_TYPE_P(expr) == IS_OBJECT) {
- zend_class_entry *ce;
- if (OP2_TYPE == IS_CONST) {
- ce = CACHED_PTR(opline->extended_value);
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
- if (EXPECTED(ce)) {
- CACHE_PTR(opline->extended_value, ce);
- }
- }
- } else if (OP2_TYPE == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- FREE_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
- } else if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
- expr = Z_REFVAL_P(expr);
- ZEND_VM_C_GOTO(try_instanceof);
- } else {
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(expr, BP_VAR_R);
- }
- result = 0;
- }
- FREE_OP1();
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_HANDLER(104, ZEND_EXT_NOP, ANY, ANY)
- {
- USE_OPLINE
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_HANDLER(0, ZEND_NOP, ANY, ANY)
- {
- USE_OPLINE
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(144, ZEND_ADD_INTERFACE, ANY, CONST, CACHE_SLOT)
- {
- USE_OPLINE
- zend_class_entry *ce = Z_CE_P(EX_VAR(opline->op1.var));
- zend_class_entry *iface;
- SAVE_OPLINE();
- iface = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_INTERFACE);
- if (UNEXPECTED(iface == NULL)) {
- ZEND_ASSERT(EG(exception));
- HANDLE_EXCEPTION();
- }
- if (UNEXPECTED((iface->ce_flags & ZEND_ACC_INTERFACE) == 0)) {
- zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ZSTR_VAL(ce->name), ZSTR_VAL(iface->name));
- }
- zend_do_implement_interface(ce, iface);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(154, ZEND_ADD_TRAIT, ANY, ANY, CACHE_SLOT)
- {
- USE_OPLINE
- zend_class_entry *ce = Z_CE_P(EX_VAR(opline->op1.var));
- zend_class_entry *trait;
- SAVE_OPLINE();
- trait = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
- RT_CONSTANT(opline, opline->op2) + 1,
- ZEND_FETCH_CLASS_TRAIT);
- if (UNEXPECTED(trait == NULL)) {
- ZEND_ASSERT(EG(exception));
- HANDLE_EXCEPTION();
- }
- if (!(trait->ce_flags & ZEND_ACC_TRAIT)) {
- zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ZSTR_VAL(ce->name), ZSTR_VAL(trait->name));
- }
- zend_do_implement_trait(ce, trait);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(155, ZEND_BIND_TRAITS, ANY, ANY)
- {
- USE_OPLINE
- zend_class_entry *ce = Z_CE_P(EX_VAR(opline->op1.var));
- SAVE_OPLINE();
- zend_do_bind_traits(ce);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_catch_offset, uint32_t op_num)
- {
- /* May be NULL during generator closing (only finally blocks are executed) */
- zend_object *ex = EG(exception);
- /* Walk try/catch/finally structures upwards, performing the necessary actions */
- while (try_catch_offset != (uint32_t) -1) {
- zend_try_catch_element *try_catch =
- &EX(func)->op_array.try_catch_array[try_catch_offset];
- if (op_num < try_catch->catch_op && ex) {
- /* Go to catch block */
- cleanup_live_vars(execute_data, op_num, try_catch->catch_op);
- ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->catch_op], 0);
- } else if (op_num < try_catch->finally_op) {
- /* Go to finally block */
- zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[try_catch->finally_end].op1.var);
- cleanup_live_vars(execute_data, op_num, try_catch->finally_op);
- Z_OBJ_P(fast_call) = EG(exception);
- EG(exception) = NULL;
- Z_OPLINE_NUM_P(fast_call) = (uint32_t)-1;
- ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->finally_op], 0);
- } else if (op_num < try_catch->finally_end) {
- zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[try_catch->finally_end].op1.var);
- /* cleanup incomplete RETURN statement */
- if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1
- && (EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2_type & (IS_TMP_VAR | IS_VAR))) {
- zval *return_value = EX_VAR(EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2.var);
- zval_ptr_dtor(return_value);
- }
- /* Chain potential exception from wrapping finally block */
- if (Z_OBJ_P(fast_call)) {
- if (ex) {
- zend_exception_set_previous(ex, Z_OBJ_P(fast_call));
- } else {
- EG(exception) = Z_OBJ_P(fast_call);
- }
- ex = Z_OBJ_P(fast_call);
- }
- }
- try_catch_offset--;
- }
- /* Uncaught exception */
- cleanup_live_vars(execute_data, op_num, 0);
- if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) {
- zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
- zend_generator_close(generator, 1);
- ZEND_VM_RETURN();
- } else {
- ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
- }
- }
- ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
- {
- const zend_op *throw_op = EG(opline_before_exception);
- uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
- int i, current_try_catch_offset = -1;
- if ((throw_op->opcode == ZEND_FREE || throw_op->opcode == ZEND_FE_FREE)
- && throw_op->extended_value & ZEND_FREE_ON_RETURN) {
- /* exceptions thrown because of loop var destruction on return/break/...
- * are logically thrown at the end of the foreach loop, so adjust the
- * throw_op_num.
- */
- const zend_live_range *range = find_live_range(
- &EX(func)->op_array, throw_op_num, throw_op->op1.var);
- throw_op_num = range->end;
- }
- /* Find the innermost try/catch/finally the exception was thrown in */
- for (i = 0; i < EX(func)->op_array.last_try_catch; i++) {
- zend_try_catch_element *try_catch = &EX(func)->op_array.try_catch_array[i];
- if (try_catch->try_op > throw_op_num) {
- /* further blocks will not be relevant... */
- break;
- }
- if (throw_op_num < try_catch->catch_op || throw_op_num < try_catch->finally_end) {
- current_try_catch_offset = i;
- }
- }
- cleanup_unfinished_calls(execute_data, throw_op_num);
- if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {
- switch (throw_op->opcode) {
- case ZEND_ADD_ARRAY_ELEMENT:
- case ZEND_ROPE_INIT:
- case ZEND_ROPE_ADD:
- break; /* exception while building structures, live range handling will free those */
- case ZEND_FETCH_CLASS:
- case ZEND_DECLARE_CLASS:
- case ZEND_DECLARE_INHERITED_CLASS:
- case ZEND_DECLARE_ANON_CLASS:
- case ZEND_DECLARE_ANON_INHERITED_CLASS:
- break; /* return value is zend_class_entry pointer */
- default:
- zval_ptr_dtor_nogc(EX_VAR(throw_op->result.var));
- }
- }
- ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, current_try_catch_offset, op_num, throw_op_num);
- }
- ZEND_VM_HANDLER(146, ZEND_VERIFY_ABSTRACT_CLASS, ANY, ANY)
- {
- USE_OPLINE
- SAVE_OPLINE();
- zend_verify_abstract_class(Z_CE_P(EX_VAR(opline->op1.var)));
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY)
- {
- USE_OPLINE
- int ret;
- SAVE_OPLINE();
- ret = zend_user_opcode_handlers[opline->opcode](execute_data);
- opline = EX(opline);
- switch (ret) {
- case ZEND_USER_OPCODE_CONTINUE:
- ZEND_VM_CONTINUE();
- case ZEND_USER_OPCODE_RETURN:
- if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) {
- zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
- zend_generator_close(generator, 1);
- ZEND_VM_RETURN();
- } else {
- ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
- }
- case ZEND_USER_OPCODE_ENTER:
- ZEND_VM_ENTER();
- case ZEND_USER_OPCODE_LEAVE:
- ZEND_VM_LEAVE();
- case ZEND_USER_OPCODE_DISPATCH:
- ZEND_VM_DISPATCH(opline->opcode, opline);
- default:
- ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), opline);
- }
- }
- ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *name;
- zval *val;
- zend_constant c;
- SAVE_OPLINE();
- name = GET_OP1_ZVAL_PTR(BP_VAR_R);
- val = GET_OP2_ZVAL_PTR(BP_VAR_R);
- ZVAL_COPY(&c.value, val);
- if (Z_OPT_CONSTANT(c.value)) {
- if (UNEXPECTED(zval_update_constant_ex(&c.value, EX(func)->op_array.scope) != SUCCESS)) {
- zval_ptr_dtor_nogc(&c.value);
- FREE_OP1();
- FREE_OP2();
- HANDLE_EXCEPTION();
- }
- }
- /* non persistent, case sensitive */
- ZEND_CONSTANT_SET_FLAGS(&c, CONST_CS, PHP_USER_CONSTANT);
- c.name = zend_string_copy(Z_STR_P(name));
- if (zend_register_constant(&c) == FAILURE) {
- }
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(153, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED)
- {
- USE_OPLINE
- zval *zfunc;
- zval *object;
- zend_class_entry *called_scope;
- zend_function *fbc;
- zfunc = zend_hash_find_ex(EG(function_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
- ZEND_ASSERT(zfunc != NULL && Z_FUNC_P(zfunc)->type == ZEND_USER_FUNCTION);
- if (Z_TYPE(EX(This)) == IS_OBJECT) {
- called_scope = Z_OBJCE(EX(This));
- if (UNEXPECTED((Z_FUNC_P(zfunc)->common.fn_flags & ZEND_ACC_STATIC) ||
- (EX(func)->common.fn_flags & ZEND_ACC_STATIC))) {
- object = NULL;
- } else {
- object = &EX(This);
- }
- } else {
- called_scope = Z_CE(EX(This));
- object = NULL;
- }
- zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc),
- EX(func)->op_array.scope, called_scope, object);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(156, ZEND_SEPARATE, VAR, UNUSED)
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = EX_VAR(opline->op1.var);
- if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
- if (UNEXPECTED(Z_REFCOUNT_P(var_ptr) == 1)) {
- ZVAL_UNREF(var_ptr);
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_HELPER(zend_yield_in_closed_generator_helper, ANY, ANY)
- {
- USE_OPLINE
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- FREE_UNFETCHED_OP2();
- FREE_UNFETCHED_OP1();
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSED, SRC)
- {
- USE_OPLINE
- zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
- SAVE_OPLINE();
- if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_yield_in_closed_generator_helper);
- }
- /* Destroy the previously yielded value */
- zval_ptr_dtor(&generator->value);
- /* Destroy the previously yielded key */
- zval_ptr_dtor(&generator->key);
- /* Set the new yielded value */
- if (OP1_TYPE != IS_UNUSED) {
- zend_free_op free_op1;
- if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
- /* Constants and temporary variables aren't yieldable by reference,
- * but we still allow them with a notice. */
- if (OP1_TYPE & (IS_CONST|IS_TMP_VAR)) {
- zval *value;
- zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- value = GET_OP1_ZVAL_PTR(BP_VAR_R);
- ZVAL_COPY_VALUE(&generator->value, value);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
- Z_ADDREF(generator->value);
- }
- }
- } else {
- zval *value_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
- /* If a function call result is yielded and the function did
- * not return by reference we throw a notice. */
- if (OP1_TYPE == IS_VAR &&
- (value_ptr == &EG(uninitialized_zval) ||
- (opline->extended_value == ZEND_RETURNS_FUNCTION &&
- !Z_ISREF_P(value_ptr)))) {
- zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- ZVAL_COPY(&generator->value, value_ptr);
- } else {
- if (Z_ISREF_P(value_ptr)) {
- Z_ADDREF_P(value_ptr);
- } else {
- ZVAL_MAKE_REF_EX(value_ptr, 2);
- }
- ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
- }
- FREE_OP1_VAR_PTR();
- }
- } else {
- zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R);
- /* Consts, temporary variables and references need copying */
- if (OP1_TYPE == IS_CONST) {
- ZVAL_COPY_VALUE(&generator->value, value);
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
- Z_ADDREF(generator->value);
- }
- } else if (OP1_TYPE == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
- ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
- FREE_OP1_IF_VAR();
- } else {
- ZVAL_COPY_VALUE(&generator->value, value);
- if (OP1_TYPE == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- }
- }
- }
- } else {
- /* If no value was specified yield null */
- ZVAL_NULL(&generator->value);
- }
- /* Set the new yielded key */
- if (OP2_TYPE != IS_UNUSED) {
- zend_free_op free_op2;
- zval *key = GET_OP2_ZVAL_PTR(BP_VAR_R);
- /* Consts, temporary variables and references need copying */
- if (OP2_TYPE == IS_CONST) {
- ZVAL_COPY_VALUE(&generator->key, key);
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->key))) {
- Z_ADDREF(generator->key);
- }
- } else if (OP2_TYPE == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((OP2_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
- ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
- FREE_OP2_IF_VAR();
- } else {
- ZVAL_COPY_VALUE(&generator->key, key);
- if (OP2_TYPE == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key);
- }
- }
- if (Z_TYPE(generator->key) == IS_LONG
- && Z_LVAL(generator->key) > generator->largest_used_integer_key
- ) {
- generator->largest_used_integer_key = Z_LVAL(generator->key);
- }
- } else {
- /* If no key was specified we use auto-increment keys */
- generator->largest_used_integer_key++;
- ZVAL_LONG(&generator->key, generator->largest_used_integer_key);
- }
- if (RETURN_VALUE_USED(opline)) {
- /* If the return value of yield is used set the send
- * target and initialize it to NULL */
- generator->send_target = EX_VAR(opline->result.var);
- ZVAL_NULL(generator->send_target);
- } else {
- generator->send_target = NULL;
- }
- /* We increment to the next op, so we are at the correct position when the
- * generator is resumed. */
- ZEND_VM_INC_OPCODE();
- /* The GOTO VM uses a local opline variable. We need to set the opline
- * variable in execute_data so we don't resume at an old position. */
- SAVE_OPLINE();
- ZEND_VM_RETURN();
- }
- ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
- {
- USE_OPLINE
- zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
- zval *val;
- zend_free_op free_op1;
- SAVE_OPLINE();
- val = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot use \"yield from\" in a force-closed generator");
- FREE_OP1();
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- if (Z_TYPE_P(val) == IS_ARRAY) {
- ZVAL_COPY_VALUE(&generator->values, val);
- if (OP1_TYPE != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) {
- Z_ADDREF_P(val);
- }
- Z_FE_POS(generator->values) = 0;
- FREE_OP1_IF_VAR();
- } else if (OP1_TYPE != IS_CONST && Z_TYPE_P(val) == IS_OBJECT && Z_OBJCE_P(val)->get_iterator) {
- zend_class_entry *ce = Z_OBJCE_P(val);
- if (ce == zend_ce_generator) {
- zend_generator *new_gen = (zend_generator *) Z_OBJ_P(val);
- if (OP1_TYPE != IS_TMP_VAR) {
- Z_ADDREF_P(val);
- }
- FREE_OP1_IF_VAR();
- if (Z_ISUNDEF(new_gen->retval)) {
- if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
- zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
- zval_ptr_dtor(val);
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else {
- zend_generator_yield_from(generator, new_gen);
- }
- } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
- zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
- zval_ptr_dtor(val);
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else {
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_COPY(EX_VAR(opline->result.var), &new_gen->retval);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- } else {
- zend_object_iterator *iter = ce->get_iterator(ce, val, 0);
- FREE_OP1();
- if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
- if (!EG(exception)) {
- zend_throw_error(NULL, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
- }
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- iter->index = 0;
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- }
- ZVAL_OBJ(&generator->values, &iter->std);
- }
- } else {
- zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables");
- FREE_OP1();
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- /* This is the default return value
- * when the expression is a Generator, it will be overwritten in zend_generator_resume() */
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- /* This generator has no send target (though the generator we delegate to might have one) */
- generator->send_target = NULL;
- /* We increment to the next op, so we are at the correct position when the
- * generator is resumed. */
- ZEND_VM_INC_OPCODE();
- /* The GOTO VM uses a local opline variable. We need to set the opline
- * variable in execute_data so we don't resume at an old position. */
- SAVE_OPLINE();
- ZEND_VM_RETURN();
- }
- ZEND_VM_HANDLER(159, ZEND_DISCARD_EXCEPTION, ANY, ANY)
- {
- USE_OPLINE
- zval *fast_call = EX_VAR(opline->op1.var);
- SAVE_OPLINE();
- /* cleanup incomplete RETURN statement */
- if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1
- && (EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2_type & (IS_TMP_VAR | IS_VAR))) {
- zval *return_value = EX_VAR(EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2.var);
- zval_ptr_dtor(return_value);
- }
- /* cleanup delayed exception */
- if (Z_OBJ_P(fast_call) != NULL) {
- /* discard the previously thrown exception */
- OBJ_RELEASE(Z_OBJ_P(fast_call));
- Z_OBJ_P(fast_call) = NULL;
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(162, ZEND_FAST_CALL, JMP_ADDR, ANY)
- {
- USE_OPLINE
- zval *fast_call = EX_VAR(opline->result.var);
- Z_OBJ_P(fast_call) = NULL;
- /* set return address */
- Z_OPLINE_NUM_P(fast_call) = opline - EX(func)->op_array.opcodes;
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op1), 0);
- }
- ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, TRY_CATCH)
- {
- USE_OPLINE
- zval *fast_call = EX_VAR(opline->op1.var);
- uint32_t current_try_catch_offset, current_op_num;
- if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1) {
- const zend_op *fast_ret = EX(func)->op_array.opcodes + Z_OPLINE_NUM_P(fast_call);
- ZEND_VM_JMP_EX(fast_ret + 1, 0);
- }
- /* special case for unhandled exceptions */
- EG(exception) = Z_OBJ_P(fast_call);
- Z_OBJ_P(fast_call) = NULL;
- current_try_catch_offset = opline->op2.num;
- current_op_num = opline - EX(func)->op_array.opcodes;
- ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, current_try_catch_offset, op_num, current_op_num);
- }
- ZEND_VM_HOT_HANDLER(168, ZEND_BIND_GLOBAL, CV, CONST, CACHE_SLOT)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *varname;
- zval *value;
- zval *variable_ptr;
- uintptr_t idx;
- zend_reference *ref;
- ZEND_VM_REPEATABLE_OPCODE
- varname = GET_OP2_ZVAL_PTR(BP_VAR_R);
- /* We store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
- idx = (uintptr_t)CACHED_PTR(opline->extended_value) - 1;
- if (EXPECTED(idx < EG(symbol_table).nNumUsed * sizeof(Bucket))) {
- Bucket *p = (Bucket*)((char*)EG(symbol_table).arData + idx);
- if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
- (EXPECTED(p->key == Z_STR_P(varname)) ||
- (EXPECTED(p->h == ZSTR_H(Z_STR_P(varname))) &&
- EXPECTED(p->key != NULL) &&
- EXPECTED(zend_string_equal_content(p->key, Z_STR_P(varname)))))) {
- value = (zval*)p; /* value = &p->val; */
- ZEND_VM_C_GOTO(check_indirect);
- }
- }
- value = zend_hash_find_ex(&EG(symbol_table), Z_STR_P(varname), 1);
- if (UNEXPECTED(value == NULL)) {
- value = zend_hash_add_new(&EG(symbol_table), Z_STR_P(varname), &EG(uninitialized_zval));
- idx = (char*)value - (char*)EG(symbol_table).arData;
- /* Store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
- CACHE_PTR(opline->extended_value, (void*)(idx + 1));
- } else {
- idx = (char*)value - (char*)EG(symbol_table).arData;
- /* Store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
- CACHE_PTR(opline->extended_value, (void*)(idx + 1));
- ZEND_VM_C_LABEL(check_indirect):
- /* GLOBAL variable may be an INDIRECT pointer to CV */
- if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- if (UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- ZVAL_NULL(value);
- }
- }
- }
- if (UNEXPECTED(!Z_ISREF_P(value))) {
- ZVAL_MAKE_REF_EX(value, 2);
- ref = Z_REF_P(value);
- } else {
- ref = Z_REF_P(value);
- GC_ADDREF(ref);
- }
- variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
- zend_refcounted *ref = Z_COUNTED_P(variable_ptr);
- uint32_t refcnt = GC_DELREF(ref);
- if (EXPECTED(variable_ptr != value)) {
- if (refcnt == 0) {
- SAVE_OPLINE();
- rc_dtor_func(ref);
- if (UNEXPECTED(EG(exception))) {
- ZVAL_NULL(variable_ptr);
- HANDLE_EXCEPTION();
- }
- } else {
- gc_check_possible_root(ref);
- }
- }
- }
- ZVAL_REF(variable_ptr, ref);
- ZEND_VM_REPEAT_OPCODE(ZEND_BIND_GLOBAL);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_CONST_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
- {
- USE_OPLINE
- zval *value;
- zend_free_op free_op1;
- value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE();
- } else {
- zend_bool strict;
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(value) == IS_REFERENCE) {
- value = Z_REFVAL_P(value);
- if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- value = GET_OP1_UNDEF_CV(value, BP_VAR_R);
- }
- strict = EX_USES_STRICT_TYPES();
- do {
- if (EXPECTED(!strict)) {
- zend_string *str;
- zval tmp;
- ZVAL_COPY(&tmp, value);
- if (zend_parse_arg_str_weak(&tmp, &str)) {
- ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
- zval_ptr_dtor(&tmp);
- break;
- }
- zval_ptr_dtor(&tmp);
- }
- zend_internal_type_error(strict, "strlen() expects parameter 1 to be string, %s given", zend_get_type_by_const(Z_TYPE_P(value)));
- ZVAL_NULL(EX_VAR(opline->result.var));
- } while (0);
- }
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_NOCONST_HANDLER(123, ZEND_TYPE_CHECK, CONST|TMPVAR|CV, ANY, TYPE_MASK)
- {
- USE_OPLINE
- zval *value;
- int result = 0;
- zend_free_op free_op1;
- value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
- ZEND_VM_C_LABEL(type_check_resource):
- if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE)
- || EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) {
- result = 1;
- }
- } else if ((OP1_TYPE & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) {
- value = Z_REFVAL_P(value);
- if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
- ZEND_VM_C_GOTO(type_check_resource);
- }
- } else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- result = ((1 << IS_NULL) & opline->extended_value) != 0;
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(value, BP_VAR_R);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
- SAVE_OPLINE();
- FREE_OP1();
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- }
- }
- ZEND_VM_HOT_HANDLER(122, ZEND_DEFINED, CONST, ANY, CACHE_SLOT)
- {
- USE_OPLINE
- zend_constant *c;
- int result;
- c = CACHED_PTR(opline->extended_value);
- do {
- if (EXPECTED(c != NULL)) {
- if (!IS_SPECIAL_CACHE_VAL(c)) {
- result = 1;
- break;
- } else if (EXPECTED(zend_hash_num_elements(EG(zend_constants)) == DECODE_SPECIAL_CACHE_NUM(c))) {
- result = 0;
- break;
- }
- }
- if (zend_quick_check_constant(RT_CONSTANT(opline, opline->op1) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
- CACHE_PTR(opline->extended_value, ENCODE_SPECIAL_CACHE_NUM(zend_hash_num_elements(EG(zend_constants))));
- result = 0;
- } else {
- result = 1;
- }
- } while (0);
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(151, ZEND_ASSERT_CHECK, ANY, JMP_ADDR)
- {
- USE_OPLINE
- if (EG(assertions) <= 0) {
- zend_op *target = OP_JMP_ADDR(opline, opline->op2);
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- }
- ZEND_VM_JMP_EX(target, 0);
- } else {
- ZEND_VM_NEXT_OPCODE();
- }
- }
- ZEND_VM_HANDLER(157, ZEND_FETCH_CLASS_NAME, UNUSED|CLASS_FETCH, ANY)
- {
- uint32_t fetch_type;
- zend_class_entry *called_scope, *scope;
- USE_OPLINE
- fetch_type = opline->op1.num;
- scope = EX(func)->op_array.scope;
- if (UNEXPECTED(scope == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot use \"%s\" when no class scope is active",
- fetch_type == ZEND_FETCH_CLASS_SELF ? "self" :
- fetch_type == ZEND_FETCH_CLASS_PARENT ? "parent" : "static");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- switch (fetch_type) {
- case ZEND_FETCH_CLASS_SELF:
- ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->name);
- break;
- case ZEND_FETCH_CLASS_PARENT:
- if (UNEXPECTED(scope->parent == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL,
- "Cannot use \"parent\" when current class scope has no parent");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->parent->name);
- break;
- case ZEND_FETCH_CLASS_STATIC:
- if (Z_TYPE(EX(This)) == IS_OBJECT) {
- called_scope = Z_OBJCE(EX(This));
- } else {
- called_scope = Z_CE(EX(This));
- }
- ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
- {
- zend_array *args;
- zend_function *fbc = EX(func);
- zval *ret = EX(return_value);
- uint32_t call_info = EX_CALL_INFO() & (ZEND_CALL_NESTED | ZEND_CALL_TOP | ZEND_CALL_RELEASE_THIS);
- uint32_t num_args = EX_NUM_ARGS();
- zend_execute_data *call;
- SAVE_OPLINE();
- if (num_args) {
- zval *p = ZEND_CALL_ARG(execute_data, 1);
- zval *end = p + num_args;
- args = zend_new_array(num_args);
- zend_hash_real_init_packed(args);
- ZEND_HASH_FILL_PACKED(args) {
- do {
- ZEND_HASH_FILL_ADD(p);
- p++;
- } while (p != end);
- } ZEND_HASH_FILL_END();
- }
- call = execute_data;
- execute_data = EG(current_execute_data) = EX(prev_execute_data);
- call->func = (fbc->op_array.fn_flags & ZEND_ACC_STATIC) ? fbc->op_array.scope->__callstatic : fbc->op_array.scope->__call;
- ZEND_ASSERT(zend_vm_calc_used_stack(2, call->func) <= (size_t)(((char*)EG(vm_stack_end)) - (char*)call));
- ZEND_CALL_NUM_ARGS(call) = 2;
- ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
- if (num_args) {
- ZVAL_ARR(ZEND_CALL_ARG(call, 2), args);
- } else {
- ZVAL_EMPTY_ARRAY(ZEND_CALL_ARG(call, 2));
- }
- zend_free_trampoline(fbc);
- fbc = call->func;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
- if (UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
- }
- execute_data = call;
- i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- if (EXPECTED(zend_execute_ex == execute_ex)) {
- LOAD_OPLINE();
- ZEND_VM_ENTER_EX();
- } else {
- execute_data = EX(prev_execute_data);
- LOAD_OPLINE();
- ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
- zend_execute_ex(call);
- }
- } else {
- zval retval;
- ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
- EG(current_execute_data) = call;
- if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
- && UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
- zend_vm_stack_free_call_frame(call);
- if (ret) {
- ZVAL_UNDEF(ret);
- }
- ZEND_VM_C_GOTO(call_trampoline_end);
- }
- if (ret == NULL) {
- ZVAL_NULL(&retval);
- ret = &retval;
- }
- if (!zend_execute_internal) {
- /* saves one function call if zend_execute_internal is not used */
- fbc->internal_function.handler(call, ret);
- } else {
- zend_execute_internal(call, ret);
- }
- #if ZEND_DEBUG
- if (!EG(exception) && call->func) {
- ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
- ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
- }
- #endif
- EG(current_execute_data) = call->prev_execute_data;
- zend_vm_stack_free_args(call);
- if (ret == &retval) {
- zval_ptr_dtor(ret);
- }
- }
- ZEND_VM_C_LABEL(call_trampoline_end):
- execute_data = EG(current_execute_data);
- if (!EX(func) || !ZEND_USER_CODE(EX(func)->type) || (call_info & ZEND_CALL_TOP)) {
- ZEND_VM_RETURN();
- }
- if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
- zend_object *object = Z_OBJ(call->This);
- OBJ_RELEASE(object);
- }
- zend_vm_stack_free_call_frame(call);
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_rethrow_exception(execute_data);
- HANDLE_EXCEPTION_LEAVE();
- }
- LOAD_OPLINE();
- ZEND_VM_INC_OPCODE();
- ZEND_VM_LEAVE();
- }
- ZEND_VM_HANDLER(182, ZEND_BIND_LEXICAL, TMP, CV, REF)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *closure, *var;
- closure = GET_OP1_ZVAL_PTR(BP_VAR_R);
- if (opline->extended_value & ZEND_BIND_REF) {
- /* By-ref binding */
- var = GET_OP2_ZVAL_PTR(BP_VAR_W);
- if (Z_ISREF_P(var)) {
- Z_ADDREF_P(var);
- } else {
- ZVAL_MAKE_REF_EX(var, 2);
- }
- } else {
- var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (UNEXPECTED(Z_ISUNDEF_P(var))) {
- SAVE_OPLINE();
- var = GET_OP2_UNDEF_CV(var, BP_VAR_R);
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
- }
- ZVAL_DEREF(var);
- Z_TRY_ADDREF_P(var);
- }
- zend_closure_bind_var_ex(closure, (opline->extended_value & ~ZEND_BIND_REF), var);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, CONST, REF)
- {
- USE_OPLINE
- zend_free_op free_op1;
- HashTable *ht;
- zval *value;
- zval *variable_ptr;
- variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- zval_ptr_dtor(variable_ptr);
- ht = EX(func)->op_array.static_variables;
- ZEND_ASSERT(ht != NULL);
- if (GC_REFCOUNT(ht) > 1) {
- if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
- GC_DELREF(ht);
- }
- EX(func)->op_array.static_variables = ht = zend_array_dup(ht);
- }
- value = (zval*)((char*)ht->arData + (opline->extended_value & ~ZEND_BIND_REF));
- if (opline->extended_value & ZEND_BIND_REF) {
- if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
- SAVE_OPLINE();
- if (UNEXPECTED(zval_update_constant_ex(value, EX(func)->op_array.scope) != SUCCESS)) {
- ZVAL_NULL(variable_ptr);
- HANDLE_EXCEPTION();
- }
- }
- if (UNEXPECTED(!Z_ISREF_P(value))) {
- zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
- GC_SET_REFCOUNT(ref, 2);
- GC_TYPE_INFO(ref) = IS_REFERENCE;
- ZVAL_COPY_VALUE(&ref->val, value);
- Z_REF_P(value) = ref;
- Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
- ZVAL_REF(variable_ptr, ref);
- } else {
- Z_ADDREF_P(value);
- ZVAL_REF(variable_ptr, Z_REF_P(value));
- }
- } else {
- ZVAL_COPY(variable_ptr, value);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(184, ZEND_FETCH_THIS, UNUSED, UNUSED)
- {
- USE_OPLINE
- if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
- zval *result = EX_VAR(opline->result.var);
- ZVAL_OBJ(result, Z_OBJ(EX(This)));
- Z_ADDREF_P(result);
- ZEND_VM_NEXT_OPCODE();
- } else {
- ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
- }
- }
- ZEND_VM_HANDLER(186, ZEND_ISSET_ISEMPTY_THIS, UNUSED, UNUSED)
- {
- USE_OPLINE
- ZVAL_BOOL(EX_VAR(opline->result.var),
- (opline->extended_value & ZEND_ISEMPTY) ^
- (Z_TYPE(EX(This)) == IS_OBJECT));
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(49, ZEND_CHECK_VAR, CV, UNUSED)
- {
- USE_OPLINE
- zval *op1 = EX_VAR(opline->op1.var);
- if (UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(51, ZEND_MAKE_REF, VAR|CV, UNUSED)
- {
- USE_OPLINE
- zval *op1 = EX_VAR(opline->op1.var);
- if (OP1_TYPE == IS_CV) {
- if (UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- ZVAL_NEW_EMPTY_REF(op1);
- Z_SET_REFCOUNT_P(op1, 2);
- ZVAL_NULL(Z_REFVAL_P(op1));
- ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
- } else {
- if (Z_ISREF_P(op1)) {
- Z_ADDREF_P(op1);
- } else {
- ZVAL_MAKE_REF_EX(op1, 2);
- }
- ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_INDIRECT)) {
- op1 = Z_INDIRECT_P(op1);
- if (EXPECTED(!Z_ISREF_P(op1))) {
- ZVAL_MAKE_REF_EX(op1, 2);
- } else {
- GC_ADDREF(Z_REF_P(op1));
- }
- ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
- } else {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), op1);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(187, ZEND_SWITCH_LONG, CONST|TMPVARCV, CONST, JMP_ADDR)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op, *jump_zv;
- HashTable *jumptable;
- op = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- jumptable = Z_ARRVAL_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
- if (Z_TYPE_P(op) != IS_LONG) {
- ZVAL_DEREF(op);
- if (Z_TYPE_P(op) != IS_LONG) {
- /* Wrong type, fall back to ZEND_CASE chain */
- ZEND_VM_NEXT_OPCODE();
- }
- }
- jump_zv = zend_hash_index_find(jumptable, Z_LVAL_P(op));
- if (jump_zv != NULL) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
- ZEND_VM_CONTINUE();
- } else {
- /* default */
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(188, ZEND_SWITCH_STRING, CONST|TMPVARCV, CONST, JMP_ADDR)
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op, *jump_zv;
- HashTable *jumptable;
- op = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- jumptable = Z_ARRVAL_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
- if (Z_TYPE_P(op) != IS_STRING) {
- if (OP1_TYPE == IS_CONST) {
- /* Wrong type, fall back to ZEND_CASE chain */
- ZEND_VM_NEXT_OPCODE();
- } else {
- ZVAL_DEREF(op);
- if (Z_TYPE_P(op) != IS_STRING) {
- /* Wrong type, fall back to ZEND_CASE chain */
- ZEND_VM_NEXT_OPCODE();
- }
- }
- }
- jump_zv = zend_hash_find_ex(jumptable, Z_STR_P(op), OP1_TYPE == IS_CONST);
- if (jump_zv != NULL) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
- ZEND_VM_CONTINUE();
- } else {
- /* default */
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
- }
- ZEND_VM_COLD_CONSTCONST_HANDLER(189, ZEND_IN_ARRAY, CONST|TMP|VAR|CV, CONST, NUM)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1;
- HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
- int result;
- SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- result = zend_hash_exists(ht, Z_STR_P(op1));
- } else if (opline->extended_value) {
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- result = zend_hash_index_exists(ht, Z_LVAL_P(op1));
- } else {
- result = 0;
- }
- } else if (Z_TYPE_P(op1) <= IS_FALSE) {
- result = zend_hash_exists(ht, ZSTR_EMPTY_ALLOC());
- } else {
- zend_string *key;
- zval key_tmp, result_tmp;
- result = 0;
- ZEND_HASH_FOREACH_STR_KEY(ht, key) {
- ZVAL_STR(&key_tmp, key);
- compare_function(&result_tmp, op1, &key_tmp);
- if (Z_LVAL(result_tmp) == 0) {
- result = 1;
- break;
- }
- } ZEND_HASH_FOREACH_END();
- }
- FREE_OP1();
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMP|VAR|CV, UNUSED)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1;
- zend_long count;
- SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- do {
- if (Z_TYPE_P(op1) == IS_ARRAY) {
- count = zend_array_count(Z_ARRVAL_P(op1));
- break;
- } else if (Z_TYPE_P(op1) == IS_OBJECT) {
- /* first, we check if the handler is defined */
- if (Z_OBJ_HT_P(op1)->count_elements) {
- if (SUCCESS == Z_OBJ_HT_P(op1)->count_elements(op1, &count)) {
- break;
- }
- }
- /* if not and the object implements Countable we call its count() method */
- if (instanceof_function(Z_OBJCE_P(op1), zend_ce_countable)) {
- zval retval;
- zend_call_method_with_0_params(op1, NULL, NULL, "count", &retval);
- count = zval_get_long(&retval);
- zval_ptr_dtor(&retval);
- break;
- }
- /* If There's no handler and it doesn't implement Countable then add a warning */
- count = 1;
- } else if (Z_TYPE_P(op1) == IS_NULL) {
- count = 0;
- } else {
- count = 1;
- }
- zend_error(E_WARNING, "count(): Parameter must be an array or an object that implements Countable");
- } while (0);
- ZVAL_LONG(EX_VAR(opline->result.var), count);
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_COLD_CONST_HANDLER(191, ZEND_GET_CLASS, UNUSED|CONST|TMP|VAR|CV, UNUSED)
- {
- USE_OPLINE
- if (OP1_TYPE == IS_UNUSED) {
- if (UNEXPECTED(!EX(func)->common.scope)) {
- SAVE_OPLINE();
- zend_error(E_WARNING, "get_class() called without object from outside a class");
- ZVAL_FALSE(EX_VAR(opline->result.var));
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
- ZEND_VM_NEXT_OPCODE();
- }
- } else {
- zend_free_op free_op1;
- zval *op1;
- SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- if (Z_TYPE_P(op1) == IS_OBJECT) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE_P(op1)->name);
- } else {
- zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
- ZVAL_FALSE(EX_VAR(opline->result.var));
- }
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- }
- ZEND_VM_HANDLER(192, ZEND_GET_CALLED_CLASS, UNUSED, UNUSED)
- {
- USE_OPLINE
- if (Z_TYPE(EX(This)) == IS_OBJECT) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE(EX(This))->name);
- } else if (Z_CE(EX(This))) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_CE(EX(This))->name);
- } else {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- if (UNEXPECTED(!EX(func)->common.scope)) {
- SAVE_OPLINE();
- zend_error(E_WARNING, "get_called_class() called from outside a class");
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_COLD_CONST_HANDLER(193, ZEND_GET_TYPE, CONST|TMP|VAR|CV, UNUSED)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1;
- zend_string *type;
- SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- type = zend_zval_get_type(op1);
- if (EXPECTED(type)) {
- ZVAL_INTERNED_STR(EX_VAR(opline->result.var), type);
- } else {
- ZVAL_STRING(EX_VAR(opline->result.var), "unknown type");
- }
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HANDLER(194, ZEND_FUNC_NUM_ARGS, UNUSED, UNUSED)
- {
- USE_OPLINE
- ZVAL_LONG(EX_VAR(opline->result.var), EX_NUM_ARGS());
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HANDLER(195, ZEND_FUNC_GET_ARGS, UNUSED|CONST, UNUSED)
- {
- USE_OPLINE
- zend_array *ht;
- uint32_t arg_count, result_size, skip;
- arg_count = EX_NUM_ARGS();
- if (OP1_TYPE == IS_CONST) {
- skip = Z_LVAL_P(RT_CONSTANT(opline, opline->op1));
- if (arg_count < skip) {
- result_size = 0;
- } else {
- result_size = arg_count - skip;
- }
- } else {
- skip = 0;
- result_size = arg_count;
- }
- if (result_size) {
- uint32_t first_extra_arg = EX(func)->op_array.num_args;
- ht = zend_new_array(result_size);
- ZVAL_ARR(EX_VAR(opline->result.var), ht);
- zend_hash_real_init_packed(ht);
- ZEND_HASH_FILL_PACKED(ht) {
- zval *p, *q;
- uint32_t i = skip;
- p = EX_VAR_NUM(i);
- if (arg_count > first_extra_arg) {
- while (i < first_extra_arg) {
- q = p;
- if (EXPECTED(Z_TYPE_INFO_P(q) != IS_UNDEF)) {
- ZVAL_DEREF(q);
- if (Z_OPT_REFCOUNTED_P(q)) {
- Z_ADDREF_P(q);
- }
- } else {
- q = &EG(uninitialized_zval);
- }
- ZEND_HASH_FILL_ADD(q);
- p++;
- i++;
- }
- if (skip < first_extra_arg) {
- skip = 0;
- } else {
- skip -= first_extra_arg;
- }
- p = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T + skip);
- }
- while (i < arg_count) {
- q = p;
- if (EXPECTED(Z_TYPE_INFO_P(q) != IS_UNDEF)) {
- ZVAL_DEREF(q);
- if (Z_OPT_REFCOUNTED_P(q)) {
- Z_ADDREF_P(q);
- }
- } else {
- q = &EG(uninitialized_zval);
- }
- ZEND_HASH_FILL_ADD(q);
- p++;
- i++;
- }
- } ZEND_HASH_FILL_END();
- ht->nNumOfElements = result_size;
- } else {
- ZVAL_EMPTY_ARRAY(EX_VAR(opline->result.var));
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_JMP, (OP_JMP_ADDR(op, op->op1) > op), ZEND_JMP_FORWARD, JMP_ADDR, ANY)
- {
- USE_OPLINE
- OPLINE = OP_JMP_ADDR(opline, opline->op1);
- ZEND_VM_CONTINUE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_ADD, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_ADD_LONG_NO_OVERFLOW, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
- {
- USE_OPLINE
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- ZVAL_LONG(result, Z_LVAL_P(op1) + Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_ADD, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_ADD_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
- {
- USE_OPLINE
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- fast_long_add_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_ADD, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_ADD_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
- {
- USE_OPLINE
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SUB, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_SUB_LONG_NO_OVERFLOW, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST))
- {
- USE_OPLINE
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- ZVAL_LONG(result, Z_LVAL_P(op1) - Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SUB, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_SUB_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST))
- {
- USE_OPLINE
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- fast_long_sub_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SUB, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_SUB_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST))
- {
- USE_OPLINE
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_MUL, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_MUL_LONG_NO_OVERFLOW, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
- {
- USE_OPLINE
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- ZVAL_LONG(result, Z_LVAL_P(op1) * Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_MUL, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_MUL_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
- {
- USE_OPLINE
- zval *op1, *op2, *result;
- zend_long overflow;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
- Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_MUL, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_MUL_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
- {
- USE_OPLINE
- zval *op1, *op2, *result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_EQUAL, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_IS_EQUAL_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST,COMMUTATIVE))
- {
- USE_OPLINE
- zval *op1, *op2;
- int result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_EQUAL, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_IS_EQUAL_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST,COMMUTATIVE))
- {
- USE_OPLINE
- zval *op1, *op2;
- int result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_NOT_EQUAL, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_IS_NOT_EQUAL_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST,COMMUTATIVE))
- {
- USE_OPLINE
- zval *op1, *op2;
- int result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_NOT_EQUAL, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_IS_NOT_EQUAL_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST,COMMUTATIVE))
- {
- USE_OPLINE
- zval *op1, *op2;
- int result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_SMALLER, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_IS_SMALLER_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST))
- {
- USE_OPLINE
- zval *op1, *op2;
- int result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_SMALLER, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_IS_SMALLER_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST))
- {
- USE_OPLINE
- zval *op1, *op2;
- int result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_SMALLER_OR_EQUAL, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_IS_SMALLER_OR_EQUAL_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST))
- {
- USE_OPLINE
- zval *op1, *op2;
- int result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_SMALLER_OR_EQUAL, (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE), ZEND_IS_SMALLER_OR_EQUAL_DOUBLE, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST))
- {
- USE_OPLINE
- zval *op1, *op2;
- int result;
- op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_INC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_PRE_INC_LONG_NO_OVERFLOW, CV, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- Z_LVAL_P(var_ptr)++;
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_INC, (op1_info == MAY_BE_LONG), ZEND_PRE_INC_LONG, CV, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- fast_long_increment_function(var_ptr);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_INC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_PRE_INC_LONG_OR_DOUBLE, CV, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_increment_function(var_ptr);
- } else {
- Z_DVAL_P(var_ptr)++;
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_DEC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_PRE_DEC_LONG_NO_OVERFLOW, CV, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- Z_LVAL_P(var_ptr)--;
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_DEC, (op1_info == MAY_BE_LONG), ZEND_PRE_DEC_LONG, CV, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- fast_long_decrement_function(var_ptr);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_DEC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_PRE_DEC_LONG_OR_DOUBLE, CV, ANY, SPEC(RETVAL))
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_decrement_function(var_ptr);
- } else {
- Z_DVAL_P(var_ptr)--;
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_POST_INC_LONG_NO_OVERFLOW, CV, ANY)
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
- Z_LVAL_P(var_ptr)++;
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (op1_info == MAY_BE_LONG), ZEND_POST_INC_LONG, CV, ANY)
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
- fast_long_increment_function(var_ptr);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_POST_INC_LONG_OR_DOUBLE, CV, ANY)
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
- fast_long_increment_function(var_ptr);
- } else {
- ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(var_ptr));
- Z_DVAL_P(var_ptr)++;
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_POST_DEC_LONG_NO_OVERFLOW, CV, ANY)
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
- Z_LVAL_P(var_ptr)--;
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (op1_info == MAY_BE_LONG), ZEND_POST_DEC_LONG, CV, ANY)
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
- fast_long_decrement_function(var_ptr);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_POST_DEC_LONG_OR_DOUBLE, CV, ANY)
- {
- USE_OPLINE
- zval *var_ptr;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
- fast_long_decrement_function(var_ptr);
- } else {
- ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(var_ptr));
- Z_DVAL_P(var_ptr)--;
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, (op1_info == MAY_BE_DOUBLE), ZEND_QM_ASSIGN_DOUBLE, CONST|TMPVARCV, ANY)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *value;
- value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(value));
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, ((op->op1_type == IS_CONST) ? !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)) : (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))), ZEND_QM_ASSIGN_NOREF, CONST|TMPVARCV, ANY)
- {
- USE_OPLINE
- zend_free_op free_op1;
- zval *value;
- value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FETCH_DIM_R, (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))), ZEND_FETCH_DIM_R_INDEX, CONST|TMPVAR|CV, CONST|TMPVARCV, SPEC(NO_CONST_CONST))
- {
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container, *dim, *value;
- zend_long offset;
- HashTable *ht;
- container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- ZEND_VM_C_LABEL(fetch_dim_r_index_array):
- if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
- offset = Z_LVAL_P(dim);
- } else {
- offset = zval_get_long(dim);
- }
- ht = Z_ARRVAL_P(container);
- ZEND_HASH_INDEX_FIND(ht, offset, value, ZEND_VM_C_LABEL(fetch_dim_r_index_undef));
- ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
- if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
- SAVE_OPLINE();
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- ZEND_VM_C_GOTO(fetch_dim_r_index_array);
- } else {
- ZEND_VM_C_GOTO(fetch_dim_r_index_slow);
- }
- } else {
- ZEND_VM_C_LABEL(fetch_dim_r_index_slow):
- SAVE_OPLINE();
- if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
- dim++;
- }
- zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_C_LABEL(fetch_dim_r_index_undef):
- ZVAL_NULL(EX_VAR(opline->result.var));
- SAVE_OPLINE();
- zend_undefined_offset(offset);
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAR, (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0, ZEND_SEND_VAR_SIMPLE, CV|VAR, NUM)
- {
- USE_OPLINE
- zval *varptr, *arg;
- zend_free_op free_op1;
- varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- if (OP1_TYPE == IS_CV) {
- ZVAL_COPY(arg, varptr);
- } else /* if (OP1_TYPE == IS_VAR) */ {
- ZVAL_COPY_VALUE(arg, varptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAR_EX, op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0, ZEND_SEND_VAR_EX_SIMPLE, CV|VAR, NUM)
- {
- USE_OPLINE
- zval *varptr, *arg;
- zend_free_op free_op1;
- uint32_t arg_num = opline->op2.num;
- if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_REF);
- }
- varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- if (OP1_TYPE == IS_CV) {
- ZVAL_COPY(arg, varptr);
- } else /* if (OP1_TYPE == IS_VAR) */ {
- ZVAL_COPY_VALUE(arg, varptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAL, op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)), ZEND_SEND_VAL_SIMPLE, CONST, NUM)
- {
- USE_OPLINE
- zval *value, *arg;
- zend_free_op free_op1;
- value = GET_OP1_ZVAL_PTR(BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_COPY_VALUE(arg, value);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAL_EX, op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)), ZEND_SEND_VAL_EX_SIMPLE, CONST, NUM)
- {
- USE_OPLINE
- zval *value, *arg;
- zend_free_op free_op1;
- uint32_t arg_num = opline->op2.num;
- if (QUICK_ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_cannot_pass_by_ref_helper);
- }
- value = GET_OP1_ZVAL_PTR(BP_VAR_R);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_COPY_VALUE(arg, value);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY, ZEND_FE_FETCH_R_SIMPLE, VAR, CV, JMP_ADDR, SPEC(RETVAL))
- {
- USE_OPLINE
- zval *array;
- zval *value, *variable_ptr;
- uint32_t value_type;
- HashTable *fe_ht;
- HashPosition pos;
- Bucket *p;
- array = EX_VAR(opline->op1.var);
- SAVE_OPLINE();
- fe_ht = Z_ARRVAL_P(array);
- pos = Z_FE_POS_P(array);
- p = fe_ht->arData + pos;
- while (1) {
- if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
- /* reached end of iteration */
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
- value = &p->val;
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- break;
- }
- } else {
- break;
- }
- }
- pos++;
- p++;
- }
- Z_FE_POS_P(array) = pos + 1;
- if (RETURN_VALUE_USED(opline)) {
- if (!p->key) {
- ZVAL_LONG(EX_VAR(opline->result.var), p->h);
- } else {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
- }
- }
- variable_ptr = EX_VAR(opline->op2.var);
- zend_assign_to_variable(variable_ptr, value, IS_CV);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_DEFINE_OP(137, ZEND_OP_DATA);
- ZEND_VM_HELPER(zend_interrupt_helper, ANY, ANY)
- {
- EG(vm_interrupt) = 0;
- SAVE_OPLINE();
- if (EG(timed_out)) {
- zend_timeout(0);
- } else if (zend_interrupt_function) {
- zend_interrupt_function(execute_data);
- ZEND_VM_ENTER();
- }
- ZEND_VM_CONTINUE();
- }
|