pcre2_jit_compile.c 436 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509
  1. /*************************************************
  2. * Perl-Compatible Regular Expressions *
  3. *************************************************/
  4. /* PCRE is a library of functions to support regular expressions whose syntax
  5. and semantics are as close as possible to those of the Perl 5 language.
  6. Written by Philip Hazel
  7. This module by Zoltan Herczeg
  8. Original API code Copyright (c) 1997-2012 University of Cambridge
  9. New API code Copyright (c) 2016-2021 University of Cambridge
  10. -----------------------------------------------------------------------------
  11. Redistribution and use in source and binary forms, with or without
  12. modification, are permitted provided that the following conditions are met:
  13. * Redistributions of source code must retain the above copyright notice,
  14. this list of conditions and the following disclaimer.
  15. * Redistributions in binary form must reproduce the above copyright
  16. notice, this list of conditions and the following disclaimer in the
  17. documentation and/or other materials provided with the distribution.
  18. * Neither the name of the University of Cambridge nor the names of its
  19. contributors may be used to endorse or promote products derived from
  20. this software without specific prior written permission.
  21. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  22. AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  25. LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  26. CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  27. SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  28. INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  29. CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  30. ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  31. POSSIBILITY OF SUCH DAMAGE.
  32. -----------------------------------------------------------------------------
  33. */
  34. #ifdef HAVE_CONFIG_H
  35. #include "config.h"
  36. #endif
  37. #include "pcre2_internal.h"
  38. #ifdef SUPPORT_JIT
  39. /* All-in-one: Since we use the JIT compiler only from here,
  40. we just include it. This way we don't need to touch the build
  41. system files. */
  42. #define SLJIT_CONFIG_AUTO 1
  43. #define SLJIT_CONFIG_STATIC 1
  44. #define SLJIT_VERBOSE 0
  45. #ifdef PCRE2_DEBUG
  46. #define SLJIT_DEBUG 1
  47. #else
  48. #define SLJIT_DEBUG 0
  49. #endif
  50. #define SLJIT_MALLOC(size, allocator_data) pcre2_jit_malloc(size, allocator_data)
  51. #define SLJIT_FREE(ptr, allocator_data) pcre2_jit_free(ptr, allocator_data)
  52. static void * pcre2_jit_malloc(size_t size, void *allocator_data)
  53. {
  54. pcre2_memctl *allocator = ((pcre2_memctl*)allocator_data);
  55. return allocator->malloc(size, allocator->memory_data);
  56. }
  57. static void pcre2_jit_free(void *ptr, void *allocator_data)
  58. {
  59. pcre2_memctl *allocator = ((pcre2_memctl*)allocator_data);
  60. allocator->free(ptr, allocator->memory_data);
  61. }
  62. #include "sljit/sljitLir.c"
  63. #if defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED
  64. #error Unsupported architecture
  65. #endif
  66. /* Defines for debugging purposes. */
  67. /* 1 - Use unoptimized capturing brackets.
  68. 2 - Enable capture_last_ptr (includes option 1). */
  69. /* #define DEBUG_FORCE_UNOPTIMIZED_CBRAS 2 */
  70. /* 1 - Always have a control head. */
  71. /* #define DEBUG_FORCE_CONTROL_HEAD 1 */
  72. /* Allocate memory for the regex stack on the real machine stack.
  73. Fast, but limited size. */
  74. #define MACHINE_STACK_SIZE 32768
  75. /* Growth rate for stack allocated by the OS. Should be the multiply
  76. of page size. */
  77. #define STACK_GROWTH_RATE 8192
  78. /* Enable to check that the allocation could destroy temporaries. */
  79. #if defined SLJIT_DEBUG && SLJIT_DEBUG
  80. #define DESTROY_REGISTERS 1
  81. #endif
  82. /*
  83. Short summary about the backtracking mechanism empolyed by the jit code generator:
  84. The code generator follows the recursive nature of the PERL compatible regular
  85. expressions. The basic blocks of regular expressions are condition checkers
  86. whose execute different commands depending on the result of the condition check.
  87. The relationship between the operators can be horizontal (concatenation) and
  88. vertical (sub-expression) (See struct backtrack_common for more details).
  89. 'ab' - 'a' and 'b' regexps are concatenated
  90. 'a+' - 'a' is the sub-expression of the '+' operator
  91. The condition checkers are boolean (true/false) checkers. Machine code is generated
  92. for the checker itself and for the actions depending on the result of the checker.
  93. The 'true' case is called as the matching path (expected path), and the other is called as
  94. the 'backtrack' path. Branch instructions are expesive for all CPUs, so we avoid taken
  95. branches on the matching path.
  96. Greedy star operator (*) :
  97. Matching path: match happens.
  98. Backtrack path: match failed.
  99. Non-greedy star operator (*?) :
  100. Matching path: no need to perform a match.
  101. Backtrack path: match is required.
  102. The following example shows how the code generated for a capturing bracket
  103. with two alternatives. Let A, B, C, D are arbirary regular expressions, and
  104. we have the following regular expression:
  105. A(B|C)D
  106. The generated code will be the following:
  107. A matching path
  108. '(' matching path (pushing arguments to the stack)
  109. B matching path
  110. ')' matching path (pushing arguments to the stack)
  111. D matching path
  112. return with successful match
  113. D backtrack path
  114. ')' backtrack path (If we arrived from "C" jump to the backtrack of "C")
  115. B backtrack path
  116. C expected path
  117. jump to D matching path
  118. C backtrack path
  119. A backtrack path
  120. Notice, that the order of backtrack code paths are the opposite of the fast
  121. code paths. In this way the topmost value on the stack is always belong
  122. to the current backtrack code path. The backtrack path must check
  123. whether there is a next alternative. If so, it needs to jump back to
  124. the matching path eventually. Otherwise it needs to clear out its own stack
  125. frame and continue the execution on the backtrack code paths.
  126. */
  127. /*
  128. Saved stack frames:
  129. Atomic blocks and asserts require reloading the values of private data
  130. when the backtrack mechanism performed. Because of OP_RECURSE, the data
  131. are not necessarly known in compile time, thus we need a dynamic restore
  132. mechanism.
  133. The stack frames are stored in a chain list, and have the following format:
  134. ([ capturing bracket offset ][ start value ][ end value ])+ ... [ 0 ] [ previous head ]
  135. Thus we can restore the private data to a particular point in the stack.
  136. */
  137. typedef struct jit_arguments {
  138. /* Pointers first. */
  139. struct sljit_stack *stack;
  140. PCRE2_SPTR str;
  141. PCRE2_SPTR begin;
  142. PCRE2_SPTR end;
  143. pcre2_match_data *match_data;
  144. PCRE2_SPTR startchar_ptr;
  145. PCRE2_UCHAR *mark_ptr;
  146. int (*callout)(pcre2_callout_block *, void *);
  147. void *callout_data;
  148. /* Everything else after. */
  149. sljit_uw offset_limit;
  150. sljit_u32 limit_match;
  151. sljit_u32 oveccount;
  152. sljit_u32 options;
  153. } jit_arguments;
  154. #define JIT_NUMBER_OF_COMPILE_MODES 3
  155. typedef struct executable_functions {
  156. void *executable_funcs[JIT_NUMBER_OF_COMPILE_MODES];
  157. void *read_only_data_heads[JIT_NUMBER_OF_COMPILE_MODES];
  158. sljit_uw executable_sizes[JIT_NUMBER_OF_COMPILE_MODES];
  159. sljit_u32 top_bracket;
  160. sljit_u32 limit_match;
  161. } executable_functions;
  162. typedef struct jump_list {
  163. struct sljit_jump *jump;
  164. struct jump_list *next;
  165. } jump_list;
  166. typedef struct stub_list {
  167. struct sljit_jump *start;
  168. struct sljit_label *quit;
  169. struct stub_list *next;
  170. } stub_list;
  171. enum frame_types {
  172. no_frame = -1,
  173. no_stack = -2
  174. };
  175. enum control_types {
  176. type_mark = 0,
  177. type_then_trap = 1
  178. };
  179. enum early_fail_types {
  180. type_skip = 0,
  181. type_fail = 1,
  182. type_fail_range = 2
  183. };
  184. typedef int (SLJIT_FUNC *jit_function)(jit_arguments *args);
  185. /* The following structure is the key data type for the recursive
  186. code generator. It is allocated by compile_matchingpath, and contains
  187. the arguments for compile_backtrackingpath. Must be the first member
  188. of its descendants. */
  189. typedef struct backtrack_common {
  190. /* Concatenation stack. */
  191. struct backtrack_common *prev;
  192. jump_list *nextbacktracks;
  193. /* Internal stack (for component operators). */
  194. struct backtrack_common *top;
  195. jump_list *topbacktracks;
  196. /* Opcode pointer. */
  197. PCRE2_SPTR cc;
  198. } backtrack_common;
  199. typedef struct assert_backtrack {
  200. backtrack_common common;
  201. jump_list *condfailed;
  202. /* Less than 0 if a frame is not needed. */
  203. int framesize;
  204. /* Points to our private memory word on the stack. */
  205. int private_data_ptr;
  206. /* For iterators. */
  207. struct sljit_label *matchingpath;
  208. } assert_backtrack;
  209. typedef struct bracket_backtrack {
  210. backtrack_common common;
  211. /* Where to coninue if an alternative is successfully matched. */
  212. struct sljit_label *alternative_matchingpath;
  213. /* For rmin and rmax iterators. */
  214. struct sljit_label *recursive_matchingpath;
  215. /* For greedy ? operator. */
  216. struct sljit_label *zero_matchingpath;
  217. /* Contains the branches of a failed condition. */
  218. union {
  219. /* Both for OP_COND, OP_SCOND. */
  220. jump_list *condfailed;
  221. assert_backtrack *assert;
  222. /* For OP_ONCE. Less than 0 if not needed. */
  223. int framesize;
  224. /* For brackets with >3 alternatives. */
  225. struct sljit_put_label *matching_put_label;
  226. } u;
  227. /* Points to our private memory word on the stack. */
  228. int private_data_ptr;
  229. } bracket_backtrack;
  230. typedef struct bracketpos_backtrack {
  231. backtrack_common common;
  232. /* Points to our private memory word on the stack. */
  233. int private_data_ptr;
  234. /* Reverting stack is needed. */
  235. int framesize;
  236. /* Allocated stack size. */
  237. int stacksize;
  238. } bracketpos_backtrack;
  239. typedef struct braminzero_backtrack {
  240. backtrack_common common;
  241. struct sljit_label *matchingpath;
  242. } braminzero_backtrack;
  243. typedef struct char_iterator_backtrack {
  244. backtrack_common common;
  245. /* Next iteration. */
  246. struct sljit_label *matchingpath;
  247. union {
  248. jump_list *backtracks;
  249. struct {
  250. unsigned int othercasebit;
  251. PCRE2_UCHAR chr;
  252. BOOL enabled;
  253. } charpos;
  254. } u;
  255. } char_iterator_backtrack;
  256. typedef struct ref_iterator_backtrack {
  257. backtrack_common common;
  258. /* Next iteration. */
  259. struct sljit_label *matchingpath;
  260. } ref_iterator_backtrack;
  261. typedef struct recurse_entry {
  262. struct recurse_entry *next;
  263. /* Contains the function entry label. */
  264. struct sljit_label *entry_label;
  265. /* Contains the function entry label. */
  266. struct sljit_label *backtrack_label;
  267. /* Collects the entry calls until the function is not created. */
  268. jump_list *entry_calls;
  269. /* Collects the backtrack calls until the function is not created. */
  270. jump_list *backtrack_calls;
  271. /* Points to the starting opcode. */
  272. sljit_sw start;
  273. } recurse_entry;
  274. typedef struct recurse_backtrack {
  275. backtrack_common common;
  276. /* Return to the matching path. */
  277. struct sljit_label *matchingpath;
  278. /* Recursive pattern. */
  279. recurse_entry *entry;
  280. /* Pattern is inlined. */
  281. BOOL inlined_pattern;
  282. } recurse_backtrack;
  283. #define OP_THEN_TRAP OP_TABLE_LENGTH
  284. typedef struct then_trap_backtrack {
  285. backtrack_common common;
  286. /* If then_trap is not NULL, this structure contains the real
  287. then_trap for the backtracking path. */
  288. struct then_trap_backtrack *then_trap;
  289. /* Points to the starting opcode. */
  290. sljit_sw start;
  291. /* Exit point for the then opcodes of this alternative. */
  292. jump_list *quit;
  293. /* Frame size of the current alternative. */
  294. int framesize;
  295. } then_trap_backtrack;
  296. #define MAX_N_CHARS 12
  297. #define MAX_DIFF_CHARS 5
  298. typedef struct fast_forward_char_data {
  299. /* Number of characters in the chars array, 255 for any character. */
  300. sljit_u8 count;
  301. /* Number of last UTF-8 characters in the chars array. */
  302. sljit_u8 last_count;
  303. /* Available characters in the current position. */
  304. PCRE2_UCHAR chars[MAX_DIFF_CHARS];
  305. } fast_forward_char_data;
  306. #define MAX_CLASS_RANGE_SIZE 4
  307. #define MAX_CLASS_CHARS_SIZE 3
  308. typedef struct compiler_common {
  309. /* The sljit ceneric compiler. */
  310. struct sljit_compiler *compiler;
  311. /* Compiled regular expression. */
  312. pcre2_real_code *re;
  313. /* First byte code. */
  314. PCRE2_SPTR start;
  315. /* Maps private data offset to each opcode. */
  316. sljit_s32 *private_data_ptrs;
  317. /* Chain list of read-only data ptrs. */
  318. void *read_only_data_head;
  319. /* Tells whether the capturing bracket is optimized. */
  320. sljit_u8 *optimized_cbracket;
  321. /* Tells whether the starting offset is a target of then. */
  322. sljit_u8 *then_offsets;
  323. /* Current position where a THEN must jump. */
  324. then_trap_backtrack *then_trap;
  325. /* Starting offset of private data for capturing brackets. */
  326. sljit_s32 cbra_ptr;
  327. /* Output vector starting point. Must be divisible by 2. */
  328. sljit_s32 ovector_start;
  329. /* Points to the starting character of the current match. */
  330. sljit_s32 start_ptr;
  331. /* Last known position of the requested byte. */
  332. sljit_s32 req_char_ptr;
  333. /* Head of the last recursion. */
  334. sljit_s32 recursive_head_ptr;
  335. /* First inspected character for partial matching.
  336. (Needed for avoiding zero length partial matches.) */
  337. sljit_s32 start_used_ptr;
  338. /* Starting pointer for partial soft matches. */
  339. sljit_s32 hit_start;
  340. /* Pointer of the match end position. */
  341. sljit_s32 match_end_ptr;
  342. /* Points to the marked string. */
  343. sljit_s32 mark_ptr;
  344. /* Recursive control verb management chain. */
  345. sljit_s32 control_head_ptr;
  346. /* Points to the last matched capture block index. */
  347. sljit_s32 capture_last_ptr;
  348. /* Fast forward skipping byte code pointer. */
  349. PCRE2_SPTR fast_forward_bc_ptr;
  350. /* Locals used by fast fail optimization. */
  351. sljit_s32 early_fail_start_ptr;
  352. sljit_s32 early_fail_end_ptr;
  353. /* Variables used by recursive call generator. */
  354. sljit_s32 recurse_bitset_size;
  355. uint8_t *recurse_bitset;
  356. /* Flipped and lower case tables. */
  357. const sljit_u8 *fcc;
  358. sljit_sw lcc;
  359. /* Mode can be PCRE2_JIT_COMPLETE and others. */
  360. int mode;
  361. /* TRUE, when empty match is accepted for partial matching. */
  362. BOOL allow_empty_partial;
  363. /* TRUE, when minlength is greater than 0. */
  364. BOOL might_be_empty;
  365. /* \K is found in the pattern. */
  366. BOOL has_set_som;
  367. /* (*SKIP:arg) is found in the pattern. */
  368. BOOL has_skip_arg;
  369. /* (*THEN) is found in the pattern. */
  370. BOOL has_then;
  371. /* (*SKIP) or (*SKIP:arg) is found in lookbehind assertion. */
  372. BOOL has_skip_in_assert_back;
  373. /* Quit is redirected by recurse, negative assertion, or positive assertion in conditional block. */
  374. BOOL local_quit_available;
  375. /* Currently in a positive assertion. */
  376. BOOL in_positive_assertion;
  377. /* Newline control. */
  378. int nltype;
  379. sljit_u32 nlmax;
  380. sljit_u32 nlmin;
  381. int newline;
  382. int bsr_nltype;
  383. sljit_u32 bsr_nlmax;
  384. sljit_u32 bsr_nlmin;
  385. /* Dollar endonly. */
  386. int endonly;
  387. /* Tables. */
  388. sljit_sw ctypes;
  389. /* Named capturing brackets. */
  390. PCRE2_SPTR name_table;
  391. sljit_sw name_count;
  392. sljit_sw name_entry_size;
  393. /* Labels and jump lists. */
  394. struct sljit_label *partialmatchlabel;
  395. struct sljit_label *quit_label;
  396. struct sljit_label *abort_label;
  397. struct sljit_label *accept_label;
  398. struct sljit_label *ff_newline_shortcut;
  399. stub_list *stubs;
  400. recurse_entry *entries;
  401. recurse_entry *currententry;
  402. jump_list *partialmatch;
  403. jump_list *quit;
  404. jump_list *positive_assertion_quit;
  405. jump_list *abort;
  406. jump_list *failed_match;
  407. jump_list *accept;
  408. jump_list *calllimit;
  409. jump_list *stackalloc;
  410. jump_list *revertframes;
  411. jump_list *wordboundary;
  412. jump_list *anynewline;
  413. jump_list *hspace;
  414. jump_list *vspace;
  415. jump_list *casefulcmp;
  416. jump_list *caselesscmp;
  417. jump_list *reset_match;
  418. BOOL unset_backref;
  419. BOOL alt_circumflex;
  420. #ifdef SUPPORT_UNICODE
  421. BOOL utf;
  422. BOOL invalid_utf;
  423. BOOL ucp;
  424. /* Points to saving area for iref. */
  425. sljit_s32 iref_ptr;
  426. jump_list *getucd;
  427. jump_list *getucdtype;
  428. #if PCRE2_CODE_UNIT_WIDTH == 8
  429. jump_list *utfreadchar;
  430. jump_list *utfreadtype8;
  431. jump_list *utfpeakcharback;
  432. #endif
  433. #if PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16
  434. jump_list *utfreadchar_invalid;
  435. jump_list *utfreadnewline_invalid;
  436. jump_list *utfmoveback_invalid;
  437. jump_list *utfpeakcharback_invalid;
  438. #endif
  439. #endif /* SUPPORT_UNICODE */
  440. } compiler_common;
  441. /* For byte_sequence_compare. */
  442. typedef struct compare_context {
  443. int length;
  444. int sourcereg;
  445. #if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED
  446. int ucharptr;
  447. union {
  448. sljit_s32 asint;
  449. sljit_u16 asushort;
  450. #if PCRE2_CODE_UNIT_WIDTH == 8
  451. sljit_u8 asbyte;
  452. sljit_u8 asuchars[4];
  453. #elif PCRE2_CODE_UNIT_WIDTH == 16
  454. sljit_u16 asuchars[2];
  455. #elif PCRE2_CODE_UNIT_WIDTH == 32
  456. sljit_u32 asuchars[1];
  457. #endif
  458. } c;
  459. union {
  460. sljit_s32 asint;
  461. sljit_u16 asushort;
  462. #if PCRE2_CODE_UNIT_WIDTH == 8
  463. sljit_u8 asbyte;
  464. sljit_u8 asuchars[4];
  465. #elif PCRE2_CODE_UNIT_WIDTH == 16
  466. sljit_u16 asuchars[2];
  467. #elif PCRE2_CODE_UNIT_WIDTH == 32
  468. sljit_u32 asuchars[1];
  469. #endif
  470. } oc;
  471. #endif
  472. } compare_context;
  473. /* Undefine sljit macros. */
  474. #undef CMP
  475. /* Used for accessing the elements of the stack. */
  476. #define STACK(i) ((i) * (int)sizeof(sljit_sw))
  477. #ifdef SLJIT_PREF_SHIFT_REG
  478. #if SLJIT_PREF_SHIFT_REG == SLJIT_R2
  479. /* Nothing. */
  480. #elif SLJIT_PREF_SHIFT_REG == SLJIT_R3
  481. #define SHIFT_REG_IS_R3
  482. #else
  483. #error "Unsupported shift register"
  484. #endif
  485. #endif
  486. #define TMP1 SLJIT_R0
  487. #ifdef SHIFT_REG_IS_R3
  488. #define TMP2 SLJIT_R3
  489. #define TMP3 SLJIT_R2
  490. #else
  491. #define TMP2 SLJIT_R2
  492. #define TMP3 SLJIT_R3
  493. #endif
  494. #define STR_PTR SLJIT_R1
  495. #define STR_END SLJIT_S0
  496. #define STACK_TOP SLJIT_S1
  497. #define STACK_LIMIT SLJIT_S2
  498. #define COUNT_MATCH SLJIT_S3
  499. #define ARGUMENTS SLJIT_S4
  500. #define RETURN_ADDR SLJIT_R4
  501. #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
  502. #define HAS_VIRTUAL_REGISTERS 1
  503. #else
  504. #define HAS_VIRTUAL_REGISTERS 0
  505. #endif
  506. /* Local space layout. */
  507. /* These two locals can be used by the current opcode. */
  508. #define LOCALS0 (0 * sizeof(sljit_sw))
  509. #define LOCALS1 (1 * sizeof(sljit_sw))
  510. /* Two local variables for possessive quantifiers (char1 cannot use them). */
  511. #define POSSESSIVE0 (2 * sizeof(sljit_sw))
  512. #define POSSESSIVE1 (3 * sizeof(sljit_sw))
  513. /* Max limit of recursions. */
  514. #define LIMIT_MATCH (4 * sizeof(sljit_sw))
  515. /* The output vector is stored on the stack, and contains pointers
  516. to characters. The vector data is divided into two groups: the first
  517. group contains the start / end character pointers, and the second is
  518. the start pointers when the end of the capturing group has not yet reached. */
  519. #define OVECTOR_START (common->ovector_start)
  520. #define OVECTOR(i) (OVECTOR_START + (i) * (sljit_sw)sizeof(sljit_sw))
  521. #define OVECTOR_PRIV(i) (common->cbra_ptr + (i) * (sljit_sw)sizeof(sljit_sw))
  522. #define PRIVATE_DATA(cc) (common->private_data_ptrs[(cc) - common->start])
  523. #if PCRE2_CODE_UNIT_WIDTH == 8
  524. #define MOV_UCHAR SLJIT_MOV_U8
  525. #define IN_UCHARS(x) (x)
  526. #elif PCRE2_CODE_UNIT_WIDTH == 16
  527. #define MOV_UCHAR SLJIT_MOV_U16
  528. #define UCHAR_SHIFT (1)
  529. #define IN_UCHARS(x) ((x) * 2)
  530. #elif PCRE2_CODE_UNIT_WIDTH == 32
  531. #define MOV_UCHAR SLJIT_MOV_U32
  532. #define UCHAR_SHIFT (2)
  533. #define IN_UCHARS(x) ((x) * 4)
  534. #else
  535. #error Unsupported compiling mode
  536. #endif
  537. /* Shortcuts. */
  538. #define DEFINE_COMPILER \
  539. struct sljit_compiler *compiler = common->compiler
  540. #define OP1(op, dst, dstw, src, srcw) \
  541. sljit_emit_op1(compiler, (op), (dst), (dstw), (src), (srcw))
  542. #define OP2(op, dst, dstw, src1, src1w, src2, src2w) \
  543. sljit_emit_op2(compiler, (op), (dst), (dstw), (src1), (src1w), (src2), (src2w))
  544. #define OP2U(op, src1, src1w, src2, src2w) \
  545. sljit_emit_op2u(compiler, (op), (src1), (src1w), (src2), (src2w))
  546. #define OP_SRC(op, src, srcw) \
  547. sljit_emit_op_src(compiler, (op), (src), (srcw))
  548. #define LABEL() \
  549. sljit_emit_label(compiler)
  550. #define JUMP(type) \
  551. sljit_emit_jump(compiler, (type))
  552. #define JUMPTO(type, label) \
  553. sljit_set_label(sljit_emit_jump(compiler, (type)), (label))
  554. #define JUMPHERE(jump) \
  555. sljit_set_label((jump), sljit_emit_label(compiler))
  556. #define SET_LABEL(jump, label) \
  557. sljit_set_label((jump), (label))
  558. #define CMP(type, src1, src1w, src2, src2w) \
  559. sljit_emit_cmp(compiler, (type), (src1), (src1w), (src2), (src2w))
  560. #define CMPTO(type, src1, src1w, src2, src2w, label) \
  561. sljit_set_label(sljit_emit_cmp(compiler, (type), (src1), (src1w), (src2), (src2w)), (label))
  562. #define OP_FLAGS(op, dst, dstw, type) \
  563. sljit_emit_op_flags(compiler, (op), (dst), (dstw), (type))
  564. #define CMOV(type, dst_reg, src, srcw) \
  565. sljit_emit_cmov(compiler, (type), (dst_reg), (src), (srcw))
  566. #define GET_LOCAL_BASE(dst, dstw, offset) \
  567. sljit_get_local_base(compiler, (dst), (dstw), (offset))
  568. #define READ_CHAR_MAX 0x7fffffff
  569. #define INVALID_UTF_CHAR -1
  570. #define UNASSIGNED_UTF_CHAR 888
  571. #if defined SUPPORT_UNICODE
  572. #if PCRE2_CODE_UNIT_WIDTH == 8
  573. #define GETCHARINC_INVALID(c, ptr, end, invalid_action) \
  574. { \
  575. if (ptr[0] <= 0x7f) \
  576. c = *ptr++; \
  577. else if (ptr + 1 < end && ptr[1] >= 0x80 && ptr[1] < 0xc0) \
  578. { \
  579. c = ptr[1] - 0x80; \
  580. \
  581. if (ptr[0] >= 0xc2 && ptr[0] <= 0xdf) \
  582. { \
  583. c |= (ptr[0] - 0xc0) << 6; \
  584. ptr += 2; \
  585. } \
  586. else if (ptr + 2 < end && ptr[2] >= 0x80 && ptr[2] < 0xc0) \
  587. { \
  588. c = c << 6 | (ptr[2] - 0x80); \
  589. \
  590. if (ptr[0] >= 0xe0 && ptr[0] <= 0xef) \
  591. { \
  592. c |= (ptr[0] - 0xe0) << 12; \
  593. ptr += 3; \
  594. \
  595. if (c < 0x800 || (c >= 0xd800 && c < 0xe000)) \
  596. { \
  597. invalid_action; \
  598. } \
  599. } \
  600. else if (ptr + 3 < end && ptr[3] >= 0x80 && ptr[3] < 0xc0) \
  601. { \
  602. c = c << 6 | (ptr[3] - 0x80); \
  603. \
  604. if (ptr[0] >= 0xf0 && ptr[0] <= 0xf4) \
  605. { \
  606. c |= (ptr[0] - 0xf0) << 18; \
  607. ptr += 4; \
  608. \
  609. if (c >= 0x110000 || c < 0x10000) \
  610. { \
  611. invalid_action; \
  612. } \
  613. } \
  614. else \
  615. { \
  616. invalid_action; \
  617. } \
  618. } \
  619. else \
  620. { \
  621. invalid_action; \
  622. } \
  623. } \
  624. else \
  625. { \
  626. invalid_action; \
  627. } \
  628. } \
  629. else \
  630. { \
  631. invalid_action; \
  632. } \
  633. }
  634. #define GETCHARBACK_INVALID(c, ptr, start, invalid_action) \
  635. { \
  636. c = ptr[-1]; \
  637. if (c <= 0x7f) \
  638. ptr--; \
  639. else if (ptr - 1 > start && ptr[-1] >= 0x80 && ptr[-1] < 0xc0) \
  640. { \
  641. c -= 0x80; \
  642. \
  643. if (ptr[-2] >= 0xc2 && ptr[-2] <= 0xdf) \
  644. { \
  645. c |= (ptr[-2] - 0xc0) << 6; \
  646. ptr -= 2; \
  647. } \
  648. else if (ptr - 2 > start && ptr[-2] >= 0x80 && ptr[-2] < 0xc0) \
  649. { \
  650. c = c << 6 | (ptr[-2] - 0x80); \
  651. \
  652. if (ptr[-3] >= 0xe0 && ptr[-3] <= 0xef) \
  653. { \
  654. c |= (ptr[-3] - 0xe0) << 12; \
  655. ptr -= 3; \
  656. \
  657. if (c < 0x800 || (c >= 0xd800 && c < 0xe000)) \
  658. { \
  659. invalid_action; \
  660. } \
  661. } \
  662. else if (ptr - 3 > start && ptr[-3] >= 0x80 && ptr[-3] < 0xc0) \
  663. { \
  664. c = c << 6 | (ptr[-3] - 0x80); \
  665. \
  666. if (ptr[-4] >= 0xf0 && ptr[-4] <= 0xf4) \
  667. { \
  668. c |= (ptr[-4] - 0xf0) << 18; \
  669. ptr -= 4; \
  670. \
  671. if (c >= 0x110000 || c < 0x10000) \
  672. { \
  673. invalid_action; \
  674. } \
  675. } \
  676. else \
  677. { \
  678. invalid_action; \
  679. } \
  680. } \
  681. else \
  682. { \
  683. invalid_action; \
  684. } \
  685. } \
  686. else \
  687. { \
  688. invalid_action; \
  689. } \
  690. } \
  691. else \
  692. { \
  693. invalid_action; \
  694. } \
  695. }
  696. #elif PCRE2_CODE_UNIT_WIDTH == 16
  697. #define GETCHARINC_INVALID(c, ptr, end, invalid_action) \
  698. { \
  699. if (ptr[0] < 0xd800 || ptr[0] >= 0xe000) \
  700. c = *ptr++; \
  701. else if (ptr[0] < 0xdc00 && ptr + 1 < end && ptr[1] >= 0xdc00 && ptr[1] < 0xe000) \
  702. { \
  703. c = (((ptr[0] - 0xd800) << 10) | (ptr[1] - 0xdc00)) + 0x10000; \
  704. ptr += 2; \
  705. } \
  706. else \
  707. { \
  708. invalid_action; \
  709. } \
  710. }
  711. #define GETCHARBACK_INVALID(c, ptr, start, invalid_action) \
  712. { \
  713. c = ptr[-1]; \
  714. if (c < 0xd800 || c >= 0xe000) \
  715. ptr--; \
  716. else if (c >= 0xdc00 && ptr - 1 > start && ptr[-2] >= 0xd800 && ptr[-2] < 0xdc00) \
  717. { \
  718. c = (((ptr[-2] - 0xd800) << 10) | (c - 0xdc00)) + 0x10000; \
  719. ptr -= 2; \
  720. } \
  721. else \
  722. { \
  723. invalid_action; \
  724. } \
  725. }
  726. #elif PCRE2_CODE_UNIT_WIDTH == 32
  727. #define GETCHARINC_INVALID(c, ptr, end, invalid_action) \
  728. { \
  729. if (ptr[0] < 0xd800 || (ptr[0] >= 0xe000 && ptr[0] < 0x110000)) \
  730. c = *ptr++; \
  731. else \
  732. { \
  733. invalid_action; \
  734. } \
  735. }
  736. #define GETCHARBACK_INVALID(c, ptr, start, invalid_action) \
  737. { \
  738. c = ptr[-1]; \
  739. if (ptr[-1] < 0xd800 || (ptr[-1] >= 0xe000 && ptr[-1] < 0x110000)) \
  740. ptr--; \
  741. else \
  742. { \
  743. invalid_action; \
  744. } \
  745. }
  746. #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
  747. #endif /* SUPPORT_UNICODE */
  748. static PCRE2_SPTR bracketend(PCRE2_SPTR cc)
  749. {
  750. SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NA) || (*cc >= OP_ONCE && *cc <= OP_SCOND));
  751. do cc += GET(cc, 1); while (*cc == OP_ALT);
  752. SLJIT_ASSERT(*cc >= OP_KET && *cc <= OP_KETRPOS);
  753. cc += 1 + LINK_SIZE;
  754. return cc;
  755. }
  756. static int no_alternatives(PCRE2_SPTR cc)
  757. {
  758. int count = 0;
  759. SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NA) || (*cc >= OP_ONCE && *cc <= OP_SCOND));
  760. do
  761. {
  762. cc += GET(cc, 1);
  763. count++;
  764. }
  765. while (*cc == OP_ALT);
  766. SLJIT_ASSERT(*cc >= OP_KET && *cc <= OP_KETRPOS);
  767. return count;
  768. }
  769. /* Functions whose might need modification for all new supported opcodes:
  770. next_opcode
  771. check_opcode_types
  772. set_private_data_ptrs
  773. get_framesize
  774. init_frame
  775. get_recurse_data_length
  776. copy_recurse_data
  777. compile_matchingpath
  778. compile_backtrackingpath
  779. */
  780. static PCRE2_SPTR next_opcode(compiler_common *common, PCRE2_SPTR cc)
  781. {
  782. SLJIT_UNUSED_ARG(common);
  783. switch(*cc)
  784. {
  785. case OP_SOD:
  786. case OP_SOM:
  787. case OP_SET_SOM:
  788. case OP_NOT_WORD_BOUNDARY:
  789. case OP_WORD_BOUNDARY:
  790. case OP_NOT_DIGIT:
  791. case OP_DIGIT:
  792. case OP_NOT_WHITESPACE:
  793. case OP_WHITESPACE:
  794. case OP_NOT_WORDCHAR:
  795. case OP_WORDCHAR:
  796. case OP_ANY:
  797. case OP_ALLANY:
  798. case OP_NOTPROP:
  799. case OP_PROP:
  800. case OP_ANYNL:
  801. case OP_NOT_HSPACE:
  802. case OP_HSPACE:
  803. case OP_NOT_VSPACE:
  804. case OP_VSPACE:
  805. case OP_EXTUNI:
  806. case OP_EODN:
  807. case OP_EOD:
  808. case OP_CIRC:
  809. case OP_CIRCM:
  810. case OP_DOLL:
  811. case OP_DOLLM:
  812. case OP_CRSTAR:
  813. case OP_CRMINSTAR:
  814. case OP_CRPLUS:
  815. case OP_CRMINPLUS:
  816. case OP_CRQUERY:
  817. case OP_CRMINQUERY:
  818. case OP_CRRANGE:
  819. case OP_CRMINRANGE:
  820. case OP_CRPOSSTAR:
  821. case OP_CRPOSPLUS:
  822. case OP_CRPOSQUERY:
  823. case OP_CRPOSRANGE:
  824. case OP_CLASS:
  825. case OP_NCLASS:
  826. case OP_REF:
  827. case OP_REFI:
  828. case OP_DNREF:
  829. case OP_DNREFI:
  830. case OP_RECURSE:
  831. case OP_CALLOUT:
  832. case OP_ALT:
  833. case OP_KET:
  834. case OP_KETRMAX:
  835. case OP_KETRMIN:
  836. case OP_KETRPOS:
  837. case OP_REVERSE:
  838. case OP_ASSERT:
  839. case OP_ASSERT_NOT:
  840. case OP_ASSERTBACK:
  841. case OP_ASSERTBACK_NOT:
  842. case OP_ASSERT_NA:
  843. case OP_ASSERTBACK_NA:
  844. case OP_ONCE:
  845. case OP_SCRIPT_RUN:
  846. case OP_BRA:
  847. case OP_BRAPOS:
  848. case OP_CBRA:
  849. case OP_CBRAPOS:
  850. case OP_COND:
  851. case OP_SBRA:
  852. case OP_SBRAPOS:
  853. case OP_SCBRA:
  854. case OP_SCBRAPOS:
  855. case OP_SCOND:
  856. case OP_CREF:
  857. case OP_DNCREF:
  858. case OP_RREF:
  859. case OP_DNRREF:
  860. case OP_FALSE:
  861. case OP_TRUE:
  862. case OP_BRAZERO:
  863. case OP_BRAMINZERO:
  864. case OP_BRAPOSZERO:
  865. case OP_PRUNE:
  866. case OP_SKIP:
  867. case OP_THEN:
  868. case OP_COMMIT:
  869. case OP_FAIL:
  870. case OP_ACCEPT:
  871. case OP_ASSERT_ACCEPT:
  872. case OP_CLOSE:
  873. case OP_SKIPZERO:
  874. return cc + PRIV(OP_lengths)[*cc];
  875. case OP_CHAR:
  876. case OP_CHARI:
  877. case OP_NOT:
  878. case OP_NOTI:
  879. case OP_STAR:
  880. case OP_MINSTAR:
  881. case OP_PLUS:
  882. case OP_MINPLUS:
  883. case OP_QUERY:
  884. case OP_MINQUERY:
  885. case OP_UPTO:
  886. case OP_MINUPTO:
  887. case OP_EXACT:
  888. case OP_POSSTAR:
  889. case OP_POSPLUS:
  890. case OP_POSQUERY:
  891. case OP_POSUPTO:
  892. case OP_STARI:
  893. case OP_MINSTARI:
  894. case OP_PLUSI:
  895. case OP_MINPLUSI:
  896. case OP_QUERYI:
  897. case OP_MINQUERYI:
  898. case OP_UPTOI:
  899. case OP_MINUPTOI:
  900. case OP_EXACTI:
  901. case OP_POSSTARI:
  902. case OP_POSPLUSI:
  903. case OP_POSQUERYI:
  904. case OP_POSUPTOI:
  905. case OP_NOTSTAR:
  906. case OP_NOTMINSTAR:
  907. case OP_NOTPLUS:
  908. case OP_NOTMINPLUS:
  909. case OP_NOTQUERY:
  910. case OP_NOTMINQUERY:
  911. case OP_NOTUPTO:
  912. case OP_NOTMINUPTO:
  913. case OP_NOTEXACT:
  914. case OP_NOTPOSSTAR:
  915. case OP_NOTPOSPLUS:
  916. case OP_NOTPOSQUERY:
  917. case OP_NOTPOSUPTO:
  918. case OP_NOTSTARI:
  919. case OP_NOTMINSTARI:
  920. case OP_NOTPLUSI:
  921. case OP_NOTMINPLUSI:
  922. case OP_NOTQUERYI:
  923. case OP_NOTMINQUERYI:
  924. case OP_NOTUPTOI:
  925. case OP_NOTMINUPTOI:
  926. case OP_NOTEXACTI:
  927. case OP_NOTPOSSTARI:
  928. case OP_NOTPOSPLUSI:
  929. case OP_NOTPOSQUERYI:
  930. case OP_NOTPOSUPTOI:
  931. cc += PRIV(OP_lengths)[*cc];
  932. #ifdef SUPPORT_UNICODE
  933. if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
  934. #endif
  935. return cc;
  936. /* Special cases. */
  937. case OP_TYPESTAR:
  938. case OP_TYPEMINSTAR:
  939. case OP_TYPEPLUS:
  940. case OP_TYPEMINPLUS:
  941. case OP_TYPEQUERY:
  942. case OP_TYPEMINQUERY:
  943. case OP_TYPEUPTO:
  944. case OP_TYPEMINUPTO:
  945. case OP_TYPEEXACT:
  946. case OP_TYPEPOSSTAR:
  947. case OP_TYPEPOSPLUS:
  948. case OP_TYPEPOSQUERY:
  949. case OP_TYPEPOSUPTO:
  950. return cc + PRIV(OP_lengths)[*cc] - 1;
  951. case OP_ANYBYTE:
  952. #ifdef SUPPORT_UNICODE
  953. if (common->utf) return NULL;
  954. #endif
  955. return cc + 1;
  956. case OP_CALLOUT_STR:
  957. return cc + GET(cc, 1 + 2*LINK_SIZE);
  958. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
  959. case OP_XCLASS:
  960. return cc + GET(cc, 1);
  961. #endif
  962. case OP_MARK:
  963. case OP_COMMIT_ARG:
  964. case OP_PRUNE_ARG:
  965. case OP_SKIP_ARG:
  966. case OP_THEN_ARG:
  967. return cc + 1 + 2 + cc[1];
  968. default:
  969. SLJIT_UNREACHABLE();
  970. return NULL;
  971. }
  972. }
  973. static BOOL check_opcode_types(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend)
  974. {
  975. int count;
  976. PCRE2_SPTR slot;
  977. PCRE2_SPTR assert_back_end = cc - 1;
  978. PCRE2_SPTR assert_na_end = cc - 1;
  979. /* Calculate important variables (like stack size) and checks whether all opcodes are supported. */
  980. while (cc < ccend)
  981. {
  982. switch(*cc)
  983. {
  984. case OP_SET_SOM:
  985. common->has_set_som = TRUE;
  986. common->might_be_empty = TRUE;
  987. cc += 1;
  988. break;
  989. case OP_REFI:
  990. #ifdef SUPPORT_UNICODE
  991. if (common->iref_ptr == 0)
  992. {
  993. common->iref_ptr = common->ovector_start;
  994. common->ovector_start += 3 * sizeof(sljit_sw);
  995. }
  996. #endif /* SUPPORT_UNICODE */
  997. /* Fall through. */
  998. case OP_REF:
  999. common->optimized_cbracket[GET2(cc, 1)] = 0;
  1000. cc += 1 + IMM2_SIZE;
  1001. break;
  1002. case OP_ASSERT_NA:
  1003. case OP_ASSERTBACK_NA:
  1004. slot = bracketend(cc);
  1005. if (slot > assert_na_end)
  1006. assert_na_end = slot;
  1007. cc += 1 + LINK_SIZE;
  1008. break;
  1009. case OP_CBRAPOS:
  1010. case OP_SCBRAPOS:
  1011. common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] = 0;
  1012. cc += 1 + LINK_SIZE + IMM2_SIZE;
  1013. break;
  1014. case OP_COND:
  1015. case OP_SCOND:
  1016. /* Only AUTO_CALLOUT can insert this opcode. We do
  1017. not intend to support this case. */
  1018. if (cc[1 + LINK_SIZE] == OP_CALLOUT || cc[1 + LINK_SIZE] == OP_CALLOUT_STR)
  1019. return FALSE;
  1020. cc += 1 + LINK_SIZE;
  1021. break;
  1022. case OP_CREF:
  1023. common->optimized_cbracket[GET2(cc, 1)] = 0;
  1024. cc += 1 + IMM2_SIZE;
  1025. break;
  1026. case OP_DNREF:
  1027. case OP_DNREFI:
  1028. case OP_DNCREF:
  1029. count = GET2(cc, 1 + IMM2_SIZE);
  1030. slot = common->name_table + GET2(cc, 1) * common->name_entry_size;
  1031. while (count-- > 0)
  1032. {
  1033. common->optimized_cbracket[GET2(slot, 0)] = 0;
  1034. slot += common->name_entry_size;
  1035. }
  1036. cc += 1 + 2 * IMM2_SIZE;
  1037. break;
  1038. case OP_RECURSE:
  1039. /* Set its value only once. */
  1040. if (common->recursive_head_ptr == 0)
  1041. {
  1042. common->recursive_head_ptr = common->ovector_start;
  1043. common->ovector_start += sizeof(sljit_sw);
  1044. }
  1045. cc += 1 + LINK_SIZE;
  1046. break;
  1047. case OP_CALLOUT:
  1048. case OP_CALLOUT_STR:
  1049. if (common->capture_last_ptr == 0)
  1050. {
  1051. common->capture_last_ptr = common->ovector_start;
  1052. common->ovector_start += sizeof(sljit_sw);
  1053. }
  1054. cc += (*cc == OP_CALLOUT) ? PRIV(OP_lengths)[OP_CALLOUT] : GET(cc, 1 + 2*LINK_SIZE);
  1055. break;
  1056. case OP_ASSERTBACK:
  1057. slot = bracketend(cc);
  1058. if (slot > assert_back_end)
  1059. assert_back_end = slot;
  1060. cc += 1 + LINK_SIZE;
  1061. break;
  1062. case OP_THEN_ARG:
  1063. common->has_then = TRUE;
  1064. common->control_head_ptr = 1;
  1065. /* Fall through. */
  1066. case OP_COMMIT_ARG:
  1067. case OP_PRUNE_ARG:
  1068. if (cc < assert_na_end)
  1069. return FALSE;
  1070. /* Fall through */
  1071. case OP_MARK:
  1072. if (common->mark_ptr == 0)
  1073. {
  1074. common->mark_ptr = common->ovector_start;
  1075. common->ovector_start += sizeof(sljit_sw);
  1076. }
  1077. cc += 1 + 2 + cc[1];
  1078. break;
  1079. case OP_THEN:
  1080. common->has_then = TRUE;
  1081. common->control_head_ptr = 1;
  1082. cc += 1;
  1083. break;
  1084. case OP_SKIP:
  1085. if (cc < assert_back_end)
  1086. common->has_skip_in_assert_back = TRUE;
  1087. if (cc < assert_na_end)
  1088. return FALSE;
  1089. cc += 1;
  1090. break;
  1091. case OP_SKIP_ARG:
  1092. common->control_head_ptr = 1;
  1093. common->has_skip_arg = TRUE;
  1094. if (cc < assert_back_end)
  1095. common->has_skip_in_assert_back = TRUE;
  1096. if (cc < assert_na_end)
  1097. return FALSE;
  1098. cc += 1 + 2 + cc[1];
  1099. break;
  1100. case OP_PRUNE:
  1101. case OP_COMMIT:
  1102. case OP_ASSERT_ACCEPT:
  1103. if (cc < assert_na_end)
  1104. return FALSE;
  1105. cc++;
  1106. break;
  1107. default:
  1108. cc = next_opcode(common, cc);
  1109. if (cc == NULL)
  1110. return FALSE;
  1111. break;
  1112. }
  1113. }
  1114. return TRUE;
  1115. }
  1116. #define EARLY_FAIL_ENHANCE_MAX (1 + 3)
  1117. /*
  1118. start:
  1119. 0 - skip / early fail allowed
  1120. 1 - only early fail with range allowed
  1121. >1 - (start - 1) early fail is processed
  1122. return: current number of iterators enhanced with fast fail
  1123. */
  1124. static int detect_early_fail(compiler_common *common, PCRE2_SPTR cc, int *private_data_start,
  1125. sljit_s32 depth, int start, BOOL fast_forward_allowed)
  1126. {
  1127. PCRE2_SPTR begin = cc;
  1128. PCRE2_SPTR next_alt;
  1129. PCRE2_SPTR end;
  1130. PCRE2_SPTR accelerated_start;
  1131. BOOL prev_fast_forward_allowed;
  1132. int result = 0;
  1133. int count;
  1134. SLJIT_ASSERT(*cc == OP_ONCE || *cc == OP_BRA || *cc == OP_CBRA);
  1135. SLJIT_ASSERT(*cc != OP_CBRA || common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] != 0);
  1136. SLJIT_ASSERT(start < EARLY_FAIL_ENHANCE_MAX);
  1137. next_alt = cc + GET(cc, 1);
  1138. if (*next_alt == OP_ALT)
  1139. fast_forward_allowed = FALSE;
  1140. do
  1141. {
  1142. count = start;
  1143. cc += 1 + LINK_SIZE + ((*cc == OP_CBRA) ? IMM2_SIZE : 0);
  1144. while (TRUE)
  1145. {
  1146. accelerated_start = NULL;
  1147. switch(*cc)
  1148. {
  1149. case OP_SOD:
  1150. case OP_SOM:
  1151. case OP_SET_SOM:
  1152. case OP_NOT_WORD_BOUNDARY:
  1153. case OP_WORD_BOUNDARY:
  1154. case OP_EODN:
  1155. case OP_EOD:
  1156. case OP_CIRC:
  1157. case OP_CIRCM:
  1158. case OP_DOLL:
  1159. case OP_DOLLM:
  1160. /* Zero width assertions. */
  1161. cc++;
  1162. continue;
  1163. case OP_NOT_DIGIT:
  1164. case OP_DIGIT:
  1165. case OP_NOT_WHITESPACE:
  1166. case OP_WHITESPACE:
  1167. case OP_NOT_WORDCHAR:
  1168. case OP_WORDCHAR:
  1169. case OP_ANY:
  1170. case OP_ALLANY:
  1171. case OP_ANYBYTE:
  1172. case OP_NOT_HSPACE:
  1173. case OP_HSPACE:
  1174. case OP_NOT_VSPACE:
  1175. case OP_VSPACE:
  1176. fast_forward_allowed = FALSE;
  1177. cc++;
  1178. continue;
  1179. case OP_ANYNL:
  1180. case OP_EXTUNI:
  1181. fast_forward_allowed = FALSE;
  1182. if (count == 0)
  1183. count = 1;
  1184. cc++;
  1185. continue;
  1186. case OP_NOTPROP:
  1187. case OP_PROP:
  1188. fast_forward_allowed = FALSE;
  1189. cc += 1 + 2;
  1190. continue;
  1191. case OP_CHAR:
  1192. case OP_CHARI:
  1193. case OP_NOT:
  1194. case OP_NOTI:
  1195. fast_forward_allowed = FALSE;
  1196. cc += 2;
  1197. #ifdef SUPPORT_UNICODE
  1198. if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
  1199. #endif
  1200. continue;
  1201. case OP_TYPESTAR:
  1202. case OP_TYPEMINSTAR:
  1203. case OP_TYPEPLUS:
  1204. case OP_TYPEMINPLUS:
  1205. case OP_TYPEPOSSTAR:
  1206. case OP_TYPEPOSPLUS:
  1207. /* The type or prop opcode is skipped in the next iteration. */
  1208. cc += 1;
  1209. if (cc[0] != OP_ANYNL && cc[0] != OP_EXTUNI)
  1210. {
  1211. accelerated_start = cc - 1;
  1212. break;
  1213. }
  1214. if (count == 0)
  1215. count = 1;
  1216. fast_forward_allowed = FALSE;
  1217. continue;
  1218. case OP_TYPEUPTO:
  1219. case OP_TYPEMINUPTO:
  1220. case OP_TYPEEXACT:
  1221. case OP_TYPEPOSUPTO:
  1222. cc += IMM2_SIZE;
  1223. /* Fall through */
  1224. case OP_TYPEQUERY:
  1225. case OP_TYPEMINQUERY:
  1226. case OP_TYPEPOSQUERY:
  1227. /* The type or prop opcode is skipped in the next iteration. */
  1228. fast_forward_allowed = FALSE;
  1229. if (count == 0)
  1230. count = 1;
  1231. cc += 1;
  1232. continue;
  1233. case OP_STAR:
  1234. case OP_MINSTAR:
  1235. case OP_PLUS:
  1236. case OP_MINPLUS:
  1237. case OP_POSSTAR:
  1238. case OP_POSPLUS:
  1239. case OP_STARI:
  1240. case OP_MINSTARI:
  1241. case OP_PLUSI:
  1242. case OP_MINPLUSI:
  1243. case OP_POSSTARI:
  1244. case OP_POSPLUSI:
  1245. case OP_NOTSTAR:
  1246. case OP_NOTMINSTAR:
  1247. case OP_NOTPLUS:
  1248. case OP_NOTMINPLUS:
  1249. case OP_NOTPOSSTAR:
  1250. case OP_NOTPOSPLUS:
  1251. case OP_NOTSTARI:
  1252. case OP_NOTMINSTARI:
  1253. case OP_NOTPLUSI:
  1254. case OP_NOTMINPLUSI:
  1255. case OP_NOTPOSSTARI:
  1256. case OP_NOTPOSPLUSI:
  1257. accelerated_start = cc;
  1258. cc += 2;
  1259. #ifdef SUPPORT_UNICODE
  1260. if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
  1261. #endif
  1262. break;
  1263. case OP_UPTO:
  1264. case OP_MINUPTO:
  1265. case OP_EXACT:
  1266. case OP_POSUPTO:
  1267. case OP_UPTOI:
  1268. case OP_MINUPTOI:
  1269. case OP_EXACTI:
  1270. case OP_POSUPTOI:
  1271. case OP_NOTUPTO:
  1272. case OP_NOTMINUPTO:
  1273. case OP_NOTEXACT:
  1274. case OP_NOTPOSUPTO:
  1275. case OP_NOTUPTOI:
  1276. case OP_NOTMINUPTOI:
  1277. case OP_NOTEXACTI:
  1278. case OP_NOTPOSUPTOI:
  1279. cc += IMM2_SIZE;
  1280. /* Fall through */
  1281. case OP_QUERY:
  1282. case OP_MINQUERY:
  1283. case OP_POSQUERY:
  1284. case OP_QUERYI:
  1285. case OP_MINQUERYI:
  1286. case OP_POSQUERYI:
  1287. case OP_NOTQUERY:
  1288. case OP_NOTMINQUERY:
  1289. case OP_NOTPOSQUERY:
  1290. case OP_NOTQUERYI:
  1291. case OP_NOTMINQUERYI:
  1292. case OP_NOTPOSQUERYI:
  1293. fast_forward_allowed = FALSE;
  1294. if (count == 0)
  1295. count = 1;
  1296. cc += 2;
  1297. #ifdef SUPPORT_UNICODE
  1298. if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
  1299. #endif
  1300. continue;
  1301. case OP_CLASS:
  1302. case OP_NCLASS:
  1303. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
  1304. case OP_XCLASS:
  1305. accelerated_start = cc;
  1306. cc += ((*cc == OP_XCLASS) ? GET(cc, 1) : (unsigned int)(1 + (32 / sizeof(PCRE2_UCHAR))));
  1307. #else
  1308. accelerated_start = cc;
  1309. cc += (1 + (32 / sizeof(PCRE2_UCHAR)));
  1310. #endif
  1311. switch (*cc)
  1312. {
  1313. case OP_CRSTAR:
  1314. case OP_CRMINSTAR:
  1315. case OP_CRPLUS:
  1316. case OP_CRMINPLUS:
  1317. case OP_CRPOSSTAR:
  1318. case OP_CRPOSPLUS:
  1319. cc++;
  1320. break;
  1321. case OP_CRRANGE:
  1322. case OP_CRMINRANGE:
  1323. case OP_CRPOSRANGE:
  1324. cc += 2 * IMM2_SIZE;
  1325. /* Fall through */
  1326. case OP_CRQUERY:
  1327. case OP_CRMINQUERY:
  1328. case OP_CRPOSQUERY:
  1329. cc++;
  1330. if (count == 0)
  1331. count = 1;
  1332. /* Fall through */
  1333. default:
  1334. accelerated_start = NULL;
  1335. fast_forward_allowed = FALSE;
  1336. continue;
  1337. }
  1338. break;
  1339. case OP_ONCE:
  1340. case OP_BRA:
  1341. case OP_CBRA:
  1342. end = cc + GET(cc, 1);
  1343. prev_fast_forward_allowed = fast_forward_allowed;
  1344. fast_forward_allowed = FALSE;
  1345. if (depth >= 4)
  1346. break;
  1347. end = bracketend(cc) - (1 + LINK_SIZE);
  1348. if (*end != OP_KET || (*cc == OP_CBRA && common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0))
  1349. break;
  1350. count = detect_early_fail(common, cc, private_data_start, depth + 1, count, prev_fast_forward_allowed);
  1351. if (PRIVATE_DATA(cc) != 0)
  1352. common->private_data_ptrs[begin - common->start] = 1;
  1353. if (count < EARLY_FAIL_ENHANCE_MAX)
  1354. {
  1355. cc = end + (1 + LINK_SIZE);
  1356. continue;
  1357. }
  1358. break;
  1359. case OP_KET:
  1360. SLJIT_ASSERT(PRIVATE_DATA(cc) == 0);
  1361. if (cc >= next_alt)
  1362. break;
  1363. cc += 1 + LINK_SIZE;
  1364. continue;
  1365. }
  1366. if (accelerated_start != NULL)
  1367. {
  1368. if (count == 0)
  1369. {
  1370. count++;
  1371. if (fast_forward_allowed)
  1372. {
  1373. common->fast_forward_bc_ptr = accelerated_start;
  1374. common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_skip;
  1375. *private_data_start += sizeof(sljit_sw);
  1376. }
  1377. else
  1378. {
  1379. common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_fail;
  1380. if (common->early_fail_start_ptr == 0)
  1381. common->early_fail_start_ptr = *private_data_start;
  1382. *private_data_start += sizeof(sljit_sw);
  1383. common->early_fail_end_ptr = *private_data_start;
  1384. if (*private_data_start > SLJIT_MAX_LOCAL_SIZE)
  1385. return EARLY_FAIL_ENHANCE_MAX;
  1386. }
  1387. }
  1388. else
  1389. {
  1390. common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_fail_range;
  1391. if (common->early_fail_start_ptr == 0)
  1392. common->early_fail_start_ptr = *private_data_start;
  1393. *private_data_start += 2 * sizeof(sljit_sw);
  1394. common->early_fail_end_ptr = *private_data_start;
  1395. if (*private_data_start > SLJIT_MAX_LOCAL_SIZE)
  1396. return EARLY_FAIL_ENHANCE_MAX;
  1397. }
  1398. /* Cannot be part of a repeat. */
  1399. common->private_data_ptrs[begin - common->start] = 1;
  1400. count++;
  1401. if (count < EARLY_FAIL_ENHANCE_MAX)
  1402. continue;
  1403. }
  1404. break;
  1405. }
  1406. if (*cc != OP_ALT && *cc != OP_KET)
  1407. result = EARLY_FAIL_ENHANCE_MAX;
  1408. else if (result < count)
  1409. result = count;
  1410. cc = next_alt;
  1411. next_alt = cc + GET(cc, 1);
  1412. }
  1413. while (*cc == OP_ALT);
  1414. return result;
  1415. }
  1416. static int get_class_iterator_size(PCRE2_SPTR cc)
  1417. {
  1418. sljit_u32 min;
  1419. sljit_u32 max;
  1420. switch(*cc)
  1421. {
  1422. case OP_CRSTAR:
  1423. case OP_CRPLUS:
  1424. return 2;
  1425. case OP_CRMINSTAR:
  1426. case OP_CRMINPLUS:
  1427. case OP_CRQUERY:
  1428. case OP_CRMINQUERY:
  1429. return 1;
  1430. case OP_CRRANGE:
  1431. case OP_CRMINRANGE:
  1432. min = GET2(cc, 1);
  1433. max = GET2(cc, 1 + IMM2_SIZE);
  1434. if (max == 0)
  1435. return (*cc == OP_CRRANGE) ? 2 : 1;
  1436. max -= min;
  1437. if (max > 2)
  1438. max = 2;
  1439. return max;
  1440. default:
  1441. return 0;
  1442. }
  1443. }
  1444. static BOOL detect_repeat(compiler_common *common, PCRE2_SPTR begin)
  1445. {
  1446. PCRE2_SPTR end = bracketend(begin);
  1447. PCRE2_SPTR next;
  1448. PCRE2_SPTR next_end;
  1449. PCRE2_SPTR max_end;
  1450. PCRE2_UCHAR type;
  1451. sljit_sw length = end - begin;
  1452. sljit_s32 min, max, i;
  1453. /* Detect fixed iterations first. */
  1454. if (end[-(1 + LINK_SIZE)] != OP_KET || PRIVATE_DATA(begin) != 0)
  1455. return FALSE;
  1456. /* /(?:AB){4,6}/ is currently converted to /(?:AB){3}(?AB){1,3}/
  1457. * Skip the check of the second part. */
  1458. if (PRIVATE_DATA(end - LINK_SIZE) != 0)
  1459. return TRUE;
  1460. next = end;
  1461. min = 1;
  1462. while (1)
  1463. {
  1464. if (*next != *begin)
  1465. break;
  1466. next_end = bracketend(next);
  1467. if (next_end - next != length || memcmp(begin, next, IN_UCHARS(length)) != 0)
  1468. break;
  1469. next = next_end;
  1470. min++;
  1471. }
  1472. if (min == 2)
  1473. return FALSE;
  1474. max = 0;
  1475. max_end = next;
  1476. if (*next == OP_BRAZERO || *next == OP_BRAMINZERO)
  1477. {
  1478. type = *next;
  1479. while (1)
  1480. {
  1481. if (next[0] != type || next[1] != OP_BRA || next[2 + LINK_SIZE] != *begin)
  1482. break;
  1483. next_end = bracketend(next + 2 + LINK_SIZE);
  1484. if (next_end - next != (length + 2 + LINK_SIZE) || memcmp(begin, next + 2 + LINK_SIZE, IN_UCHARS(length)) != 0)
  1485. break;
  1486. next = next_end;
  1487. max++;
  1488. }
  1489. if (next[0] == type && next[1] == *begin && max >= 1)
  1490. {
  1491. next_end = bracketend(next + 1);
  1492. if (next_end - next == (length + 1) && memcmp(begin, next + 1, IN_UCHARS(length)) == 0)
  1493. {
  1494. for (i = 0; i < max; i++, next_end += 1 + LINK_SIZE)
  1495. if (*next_end != OP_KET)
  1496. break;
  1497. if (i == max)
  1498. {
  1499. common->private_data_ptrs[max_end - common->start - LINK_SIZE] = next_end - max_end;
  1500. common->private_data_ptrs[max_end - common->start - LINK_SIZE + 1] = (type == OP_BRAZERO) ? OP_UPTO : OP_MINUPTO;
  1501. /* +2 the original and the last. */
  1502. common->private_data_ptrs[max_end - common->start - LINK_SIZE + 2] = max + 2;
  1503. if (min == 1)
  1504. return TRUE;
  1505. min--;
  1506. max_end -= (1 + LINK_SIZE) + GET(max_end, -LINK_SIZE);
  1507. }
  1508. }
  1509. }
  1510. }
  1511. if (min >= 3)
  1512. {
  1513. common->private_data_ptrs[end - common->start - LINK_SIZE] = max_end - end;
  1514. common->private_data_ptrs[end - common->start - LINK_SIZE + 1] = OP_EXACT;
  1515. common->private_data_ptrs[end - common->start - LINK_SIZE + 2] = min;
  1516. return TRUE;
  1517. }
  1518. return FALSE;
  1519. }
  1520. #define CASE_ITERATOR_PRIVATE_DATA_1 \
  1521. case OP_MINSTAR: \
  1522. case OP_MINPLUS: \
  1523. case OP_QUERY: \
  1524. case OP_MINQUERY: \
  1525. case OP_MINSTARI: \
  1526. case OP_MINPLUSI: \
  1527. case OP_QUERYI: \
  1528. case OP_MINQUERYI: \
  1529. case OP_NOTMINSTAR: \
  1530. case OP_NOTMINPLUS: \
  1531. case OP_NOTQUERY: \
  1532. case OP_NOTMINQUERY: \
  1533. case OP_NOTMINSTARI: \
  1534. case OP_NOTMINPLUSI: \
  1535. case OP_NOTQUERYI: \
  1536. case OP_NOTMINQUERYI:
  1537. #define CASE_ITERATOR_PRIVATE_DATA_2A \
  1538. case OP_STAR: \
  1539. case OP_PLUS: \
  1540. case OP_STARI: \
  1541. case OP_PLUSI: \
  1542. case OP_NOTSTAR: \
  1543. case OP_NOTPLUS: \
  1544. case OP_NOTSTARI: \
  1545. case OP_NOTPLUSI:
  1546. #define CASE_ITERATOR_PRIVATE_DATA_2B \
  1547. case OP_UPTO: \
  1548. case OP_MINUPTO: \
  1549. case OP_UPTOI: \
  1550. case OP_MINUPTOI: \
  1551. case OP_NOTUPTO: \
  1552. case OP_NOTMINUPTO: \
  1553. case OP_NOTUPTOI: \
  1554. case OP_NOTMINUPTOI:
  1555. #define CASE_ITERATOR_TYPE_PRIVATE_DATA_1 \
  1556. case OP_TYPEMINSTAR: \
  1557. case OP_TYPEMINPLUS: \
  1558. case OP_TYPEQUERY: \
  1559. case OP_TYPEMINQUERY:
  1560. #define CASE_ITERATOR_TYPE_PRIVATE_DATA_2A \
  1561. case OP_TYPESTAR: \
  1562. case OP_TYPEPLUS:
  1563. #define CASE_ITERATOR_TYPE_PRIVATE_DATA_2B \
  1564. case OP_TYPEUPTO: \
  1565. case OP_TYPEMINUPTO:
  1566. static void set_private_data_ptrs(compiler_common *common, int *private_data_start, PCRE2_SPTR ccend)
  1567. {
  1568. PCRE2_SPTR cc = common->start;
  1569. PCRE2_SPTR alternative;
  1570. PCRE2_SPTR end = NULL;
  1571. int private_data_ptr = *private_data_start;
  1572. int space, size, bracketlen;
  1573. BOOL repeat_check = TRUE;
  1574. while (cc < ccend)
  1575. {
  1576. space = 0;
  1577. size = 0;
  1578. bracketlen = 0;
  1579. if (private_data_ptr > SLJIT_MAX_LOCAL_SIZE)
  1580. break;
  1581. /* When the bracket is prefixed by a zero iteration, skip the repeat check (at this point). */
  1582. if (repeat_check && (*cc == OP_ONCE || *cc == OP_BRA || *cc == OP_CBRA || *cc == OP_COND))
  1583. {
  1584. if (detect_repeat(common, cc))
  1585. {
  1586. /* These brackets are converted to repeats, so no global
  1587. based single character repeat is allowed. */
  1588. if (cc >= end)
  1589. end = bracketend(cc);
  1590. }
  1591. }
  1592. repeat_check = TRUE;
  1593. switch(*cc)
  1594. {
  1595. case OP_KET:
  1596. if (common->private_data_ptrs[cc + 1 - common->start] != 0)
  1597. {
  1598. common->private_data_ptrs[cc - common->start] = private_data_ptr;
  1599. private_data_ptr += sizeof(sljit_sw);
  1600. cc += common->private_data_ptrs[cc + 1 - common->start];
  1601. }
  1602. cc += 1 + LINK_SIZE;
  1603. break;
  1604. case OP_ASSERT:
  1605. case OP_ASSERT_NOT:
  1606. case OP_ASSERTBACK:
  1607. case OP_ASSERTBACK_NOT:
  1608. case OP_ASSERT_NA:
  1609. case OP_ASSERTBACK_NA:
  1610. case OP_ONCE:
  1611. case OP_SCRIPT_RUN:
  1612. case OP_BRAPOS:
  1613. case OP_SBRA:
  1614. case OP_SBRAPOS:
  1615. case OP_SCOND:
  1616. common->private_data_ptrs[cc - common->start] = private_data_ptr;
  1617. private_data_ptr += sizeof(sljit_sw);
  1618. bracketlen = 1 + LINK_SIZE;
  1619. break;
  1620. case OP_CBRAPOS:
  1621. case OP_SCBRAPOS:
  1622. common->private_data_ptrs[cc - common->start] = private_data_ptr;
  1623. private_data_ptr += sizeof(sljit_sw);
  1624. bracketlen = 1 + LINK_SIZE + IMM2_SIZE;
  1625. break;
  1626. case OP_COND:
  1627. /* Might be a hidden SCOND. */
  1628. common->private_data_ptrs[cc - common->start] = 0;
  1629. alternative = cc + GET(cc, 1);
  1630. if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN)
  1631. {
  1632. common->private_data_ptrs[cc - common->start] = private_data_ptr;
  1633. private_data_ptr += sizeof(sljit_sw);
  1634. }
  1635. bracketlen = 1 + LINK_SIZE;
  1636. break;
  1637. case OP_BRA:
  1638. bracketlen = 1 + LINK_SIZE;
  1639. break;
  1640. case OP_CBRA:
  1641. case OP_SCBRA:
  1642. bracketlen = 1 + LINK_SIZE + IMM2_SIZE;
  1643. break;
  1644. case OP_BRAZERO:
  1645. case OP_BRAMINZERO:
  1646. case OP_BRAPOSZERO:
  1647. size = 1;
  1648. repeat_check = FALSE;
  1649. break;
  1650. CASE_ITERATOR_PRIVATE_DATA_1
  1651. size = -2;
  1652. space = 1;
  1653. break;
  1654. CASE_ITERATOR_PRIVATE_DATA_2A
  1655. size = -2;
  1656. space = 2;
  1657. break;
  1658. CASE_ITERATOR_PRIVATE_DATA_2B
  1659. size = -(2 + IMM2_SIZE);
  1660. space = 2;
  1661. break;
  1662. CASE_ITERATOR_TYPE_PRIVATE_DATA_1
  1663. size = 1;
  1664. space = 1;
  1665. break;
  1666. CASE_ITERATOR_TYPE_PRIVATE_DATA_2A
  1667. size = 1;
  1668. if (cc[1] != OP_ANYNL && cc[1] != OP_EXTUNI)
  1669. space = 2;
  1670. break;
  1671. case OP_TYPEUPTO:
  1672. size = 1 + IMM2_SIZE;
  1673. if (cc[1 + IMM2_SIZE] != OP_ANYNL && cc[1 + IMM2_SIZE] != OP_EXTUNI)
  1674. space = 2;
  1675. break;
  1676. case OP_TYPEMINUPTO:
  1677. size = 1 + IMM2_SIZE;
  1678. space = 2;
  1679. break;
  1680. case OP_CLASS:
  1681. case OP_NCLASS:
  1682. size = 1 + 32 / sizeof(PCRE2_UCHAR);
  1683. space = get_class_iterator_size(cc + size);
  1684. break;
  1685. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
  1686. case OP_XCLASS:
  1687. size = GET(cc, 1);
  1688. space = get_class_iterator_size(cc + size);
  1689. break;
  1690. #endif
  1691. default:
  1692. cc = next_opcode(common, cc);
  1693. SLJIT_ASSERT(cc != NULL);
  1694. break;
  1695. }
  1696. /* Character iterators, which are not inside a repeated bracket,
  1697. gets a private slot instead of allocating it on the stack. */
  1698. if (space > 0 && cc >= end)
  1699. {
  1700. common->private_data_ptrs[cc - common->start] = private_data_ptr;
  1701. private_data_ptr += sizeof(sljit_sw) * space;
  1702. }
  1703. if (size != 0)
  1704. {
  1705. if (size < 0)
  1706. {
  1707. cc += -size;
  1708. #ifdef SUPPORT_UNICODE
  1709. if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
  1710. #endif
  1711. }
  1712. else
  1713. cc += size;
  1714. }
  1715. if (bracketlen > 0)
  1716. {
  1717. if (cc >= end)
  1718. {
  1719. end = bracketend(cc);
  1720. if (end[-1 - LINK_SIZE] == OP_KET)
  1721. end = NULL;
  1722. }
  1723. cc += bracketlen;
  1724. }
  1725. }
  1726. *private_data_start = private_data_ptr;
  1727. }
  1728. /* Returns with a frame_types (always < 0) if no need for frame. */
  1729. static int get_framesize(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, BOOL recursive, BOOL *needs_control_head)
  1730. {
  1731. int length = 0;
  1732. int possessive = 0;
  1733. BOOL stack_restore = FALSE;
  1734. BOOL setsom_found = recursive;
  1735. BOOL setmark_found = recursive;
  1736. /* The last capture is a local variable even for recursions. */
  1737. BOOL capture_last_found = FALSE;
  1738. #if defined DEBUG_FORCE_CONTROL_HEAD && DEBUG_FORCE_CONTROL_HEAD
  1739. SLJIT_ASSERT(common->control_head_ptr != 0);
  1740. *needs_control_head = TRUE;
  1741. #else
  1742. *needs_control_head = FALSE;
  1743. #endif
  1744. if (ccend == NULL)
  1745. {
  1746. ccend = bracketend(cc) - (1 + LINK_SIZE);
  1747. if (!recursive && (*cc == OP_CBRAPOS || *cc == OP_SCBRAPOS))
  1748. {
  1749. possessive = length = (common->capture_last_ptr != 0) ? 5 : 3;
  1750. /* This is correct regardless of common->capture_last_ptr. */
  1751. capture_last_found = TRUE;
  1752. }
  1753. cc = next_opcode(common, cc);
  1754. }
  1755. SLJIT_ASSERT(cc != NULL);
  1756. while (cc < ccend)
  1757. switch(*cc)
  1758. {
  1759. case OP_SET_SOM:
  1760. SLJIT_ASSERT(common->has_set_som);
  1761. stack_restore = TRUE;
  1762. if (!setsom_found)
  1763. {
  1764. length += 2;
  1765. setsom_found = TRUE;
  1766. }
  1767. cc += 1;
  1768. break;
  1769. case OP_MARK:
  1770. case OP_COMMIT_ARG:
  1771. case OP_PRUNE_ARG:
  1772. case OP_THEN_ARG:
  1773. SLJIT_ASSERT(common->mark_ptr != 0);
  1774. stack_restore = TRUE;
  1775. if (!setmark_found)
  1776. {
  1777. length += 2;
  1778. setmark_found = TRUE;
  1779. }
  1780. if (common->control_head_ptr != 0)
  1781. *needs_control_head = TRUE;
  1782. cc += 1 + 2 + cc[1];
  1783. break;
  1784. case OP_RECURSE:
  1785. stack_restore = TRUE;
  1786. if (common->has_set_som && !setsom_found)
  1787. {
  1788. length += 2;
  1789. setsom_found = TRUE;
  1790. }
  1791. if (common->mark_ptr != 0 && !setmark_found)
  1792. {
  1793. length += 2;
  1794. setmark_found = TRUE;
  1795. }
  1796. if (common->capture_last_ptr != 0 && !capture_last_found)
  1797. {
  1798. length += 2;
  1799. capture_last_found = TRUE;
  1800. }
  1801. cc += 1 + LINK_SIZE;
  1802. break;
  1803. case OP_CBRA:
  1804. case OP_CBRAPOS:
  1805. case OP_SCBRA:
  1806. case OP_SCBRAPOS:
  1807. stack_restore = TRUE;
  1808. if (common->capture_last_ptr != 0 && !capture_last_found)
  1809. {
  1810. length += 2;
  1811. capture_last_found = TRUE;
  1812. }
  1813. length += 3;
  1814. cc += 1 + LINK_SIZE + IMM2_SIZE;
  1815. break;
  1816. case OP_THEN:
  1817. stack_restore = TRUE;
  1818. if (common->control_head_ptr != 0)
  1819. *needs_control_head = TRUE;
  1820. cc ++;
  1821. break;
  1822. default:
  1823. stack_restore = TRUE;
  1824. /* Fall through. */
  1825. case OP_NOT_WORD_BOUNDARY:
  1826. case OP_WORD_BOUNDARY:
  1827. case OP_NOT_DIGIT:
  1828. case OP_DIGIT:
  1829. case OP_NOT_WHITESPACE:
  1830. case OP_WHITESPACE:
  1831. case OP_NOT_WORDCHAR:
  1832. case OP_WORDCHAR:
  1833. case OP_ANY:
  1834. case OP_ALLANY:
  1835. case OP_ANYBYTE:
  1836. case OP_NOTPROP:
  1837. case OP_PROP:
  1838. case OP_ANYNL:
  1839. case OP_NOT_HSPACE:
  1840. case OP_HSPACE:
  1841. case OP_NOT_VSPACE:
  1842. case OP_VSPACE:
  1843. case OP_EXTUNI:
  1844. case OP_EODN:
  1845. case OP_EOD:
  1846. case OP_CIRC:
  1847. case OP_CIRCM:
  1848. case OP_DOLL:
  1849. case OP_DOLLM:
  1850. case OP_CHAR:
  1851. case OP_CHARI:
  1852. case OP_NOT:
  1853. case OP_NOTI:
  1854. case OP_EXACT:
  1855. case OP_POSSTAR:
  1856. case OP_POSPLUS:
  1857. case OP_POSQUERY:
  1858. case OP_POSUPTO:
  1859. case OP_EXACTI:
  1860. case OP_POSSTARI:
  1861. case OP_POSPLUSI:
  1862. case OP_POSQUERYI:
  1863. case OP_POSUPTOI:
  1864. case OP_NOTEXACT:
  1865. case OP_NOTPOSSTAR:
  1866. case OP_NOTPOSPLUS:
  1867. case OP_NOTPOSQUERY:
  1868. case OP_NOTPOSUPTO:
  1869. case OP_NOTEXACTI:
  1870. case OP_NOTPOSSTARI:
  1871. case OP_NOTPOSPLUSI:
  1872. case OP_NOTPOSQUERYI:
  1873. case OP_NOTPOSUPTOI:
  1874. case OP_TYPEEXACT:
  1875. case OP_TYPEPOSSTAR:
  1876. case OP_TYPEPOSPLUS:
  1877. case OP_TYPEPOSQUERY:
  1878. case OP_TYPEPOSUPTO:
  1879. case OP_CLASS:
  1880. case OP_NCLASS:
  1881. case OP_XCLASS:
  1882. case OP_CALLOUT:
  1883. case OP_CALLOUT_STR:
  1884. cc = next_opcode(common, cc);
  1885. SLJIT_ASSERT(cc != NULL);
  1886. break;
  1887. }
  1888. /* Possessive quantifiers can use a special case. */
  1889. if (SLJIT_UNLIKELY(possessive == length))
  1890. return stack_restore ? no_frame : no_stack;
  1891. if (length > 0)
  1892. return length + 1;
  1893. return stack_restore ? no_frame : no_stack;
  1894. }
  1895. static void init_frame(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, int stackpos, int stacktop)
  1896. {
  1897. DEFINE_COMPILER;
  1898. BOOL setsom_found = FALSE;
  1899. BOOL setmark_found = FALSE;
  1900. /* The last capture is a local variable even for recursions. */
  1901. BOOL capture_last_found = FALSE;
  1902. int offset;
  1903. /* >= 1 + shortest item size (2) */
  1904. SLJIT_UNUSED_ARG(stacktop);
  1905. SLJIT_ASSERT(stackpos >= stacktop + 2);
  1906. stackpos = STACK(stackpos);
  1907. if (ccend == NULL)
  1908. {
  1909. ccend = bracketend(cc) - (1 + LINK_SIZE);
  1910. if (*cc != OP_CBRAPOS && *cc != OP_SCBRAPOS)
  1911. cc = next_opcode(common, cc);
  1912. }
  1913. SLJIT_ASSERT(cc != NULL);
  1914. while (cc < ccend)
  1915. switch(*cc)
  1916. {
  1917. case OP_SET_SOM:
  1918. SLJIT_ASSERT(common->has_set_som);
  1919. if (!setsom_found)
  1920. {
  1921. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0));
  1922. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -OVECTOR(0));
  1923. stackpos -= (int)sizeof(sljit_sw);
  1924. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);
  1925. stackpos -= (int)sizeof(sljit_sw);
  1926. setsom_found = TRUE;
  1927. }
  1928. cc += 1;
  1929. break;
  1930. case OP_MARK:
  1931. case OP_COMMIT_ARG:
  1932. case OP_PRUNE_ARG:
  1933. case OP_THEN_ARG:
  1934. SLJIT_ASSERT(common->mark_ptr != 0);
  1935. if (!setmark_found)
  1936. {
  1937. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);
  1938. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->mark_ptr);
  1939. stackpos -= (int)sizeof(sljit_sw);
  1940. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);
  1941. stackpos -= (int)sizeof(sljit_sw);
  1942. setmark_found = TRUE;
  1943. }
  1944. cc += 1 + 2 + cc[1];
  1945. break;
  1946. case OP_RECURSE:
  1947. if (common->has_set_som && !setsom_found)
  1948. {
  1949. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0));
  1950. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -OVECTOR(0));
  1951. stackpos -= (int)sizeof(sljit_sw);
  1952. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);
  1953. stackpos -= (int)sizeof(sljit_sw);
  1954. setsom_found = TRUE;
  1955. }
  1956. if (common->mark_ptr != 0 && !setmark_found)
  1957. {
  1958. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);
  1959. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->mark_ptr);
  1960. stackpos -= (int)sizeof(sljit_sw);
  1961. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);
  1962. stackpos -= (int)sizeof(sljit_sw);
  1963. setmark_found = TRUE;
  1964. }
  1965. if (common->capture_last_ptr != 0 && !capture_last_found)
  1966. {
  1967. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr);
  1968. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->capture_last_ptr);
  1969. stackpos -= (int)sizeof(sljit_sw);
  1970. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);
  1971. stackpos -= (int)sizeof(sljit_sw);
  1972. capture_last_found = TRUE;
  1973. }
  1974. cc += 1 + LINK_SIZE;
  1975. break;
  1976. case OP_CBRA:
  1977. case OP_CBRAPOS:
  1978. case OP_SCBRA:
  1979. case OP_SCBRAPOS:
  1980. if (common->capture_last_ptr != 0 && !capture_last_found)
  1981. {
  1982. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr);
  1983. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->capture_last_ptr);
  1984. stackpos -= (int)sizeof(sljit_sw);
  1985. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);
  1986. stackpos -= (int)sizeof(sljit_sw);
  1987. capture_last_found = TRUE;
  1988. }
  1989. offset = (GET2(cc, 1 + LINK_SIZE)) << 1;
  1990. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, OVECTOR(offset));
  1991. stackpos -= (int)sizeof(sljit_sw);
  1992. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));
  1993. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
  1994. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);
  1995. stackpos -= (int)sizeof(sljit_sw);
  1996. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP2, 0);
  1997. stackpos -= (int)sizeof(sljit_sw);
  1998. cc += 1 + LINK_SIZE + IMM2_SIZE;
  1999. break;
  2000. default:
  2001. cc = next_opcode(common, cc);
  2002. SLJIT_ASSERT(cc != NULL);
  2003. break;
  2004. }
  2005. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, 0);
  2006. SLJIT_ASSERT(stackpos == STACK(stacktop));
  2007. }
  2008. #define RECURSE_TMP_REG_COUNT 3
  2009. typedef struct delayed_mem_copy_status {
  2010. struct sljit_compiler *compiler;
  2011. int store_bases[RECURSE_TMP_REG_COUNT];
  2012. int store_offsets[RECURSE_TMP_REG_COUNT];
  2013. int tmp_regs[RECURSE_TMP_REG_COUNT];
  2014. int saved_tmp_regs[RECURSE_TMP_REG_COUNT];
  2015. int next_tmp_reg;
  2016. } delayed_mem_copy_status;
  2017. static void delayed_mem_copy_init(delayed_mem_copy_status *status, compiler_common *common)
  2018. {
  2019. int i;
  2020. for (i = 0; i < RECURSE_TMP_REG_COUNT; i++)
  2021. {
  2022. SLJIT_ASSERT(status->tmp_regs[i] >= 0);
  2023. SLJIT_ASSERT(sljit_get_register_index(status->saved_tmp_regs[i]) < 0 || status->tmp_regs[i] == status->saved_tmp_regs[i]);
  2024. status->store_bases[i] = -1;
  2025. }
  2026. status->next_tmp_reg = 0;
  2027. status->compiler = common->compiler;
  2028. }
  2029. static void delayed_mem_copy_move(delayed_mem_copy_status *status, int load_base, sljit_sw load_offset,
  2030. int store_base, sljit_sw store_offset)
  2031. {
  2032. struct sljit_compiler *compiler = status->compiler;
  2033. int next_tmp_reg = status->next_tmp_reg;
  2034. int tmp_reg = status->tmp_regs[next_tmp_reg];
  2035. SLJIT_ASSERT(load_base > 0 && store_base > 0);
  2036. if (status->store_bases[next_tmp_reg] == -1)
  2037. {
  2038. /* Preserve virtual registers. */
  2039. if (sljit_get_register_index(status->saved_tmp_regs[next_tmp_reg]) < 0)
  2040. OP1(SLJIT_MOV, status->saved_tmp_regs[next_tmp_reg], 0, tmp_reg, 0);
  2041. }
  2042. else
  2043. OP1(SLJIT_MOV, SLJIT_MEM1(status->store_bases[next_tmp_reg]), status->store_offsets[next_tmp_reg], tmp_reg, 0);
  2044. OP1(SLJIT_MOV, tmp_reg, 0, SLJIT_MEM1(load_base), load_offset);
  2045. status->store_bases[next_tmp_reg] = store_base;
  2046. status->store_offsets[next_tmp_reg] = store_offset;
  2047. status->next_tmp_reg = (next_tmp_reg + 1) % RECURSE_TMP_REG_COUNT;
  2048. }
  2049. static void delayed_mem_copy_finish(delayed_mem_copy_status *status)
  2050. {
  2051. struct sljit_compiler *compiler = status->compiler;
  2052. int next_tmp_reg = status->next_tmp_reg;
  2053. int tmp_reg, saved_tmp_reg, i;
  2054. for (i = 0; i < RECURSE_TMP_REG_COUNT; i++)
  2055. {
  2056. if (status->store_bases[next_tmp_reg] != -1)
  2057. {
  2058. tmp_reg = status->tmp_regs[next_tmp_reg];
  2059. saved_tmp_reg = status->saved_tmp_regs[next_tmp_reg];
  2060. OP1(SLJIT_MOV, SLJIT_MEM1(status->store_bases[next_tmp_reg]), status->store_offsets[next_tmp_reg], tmp_reg, 0);
  2061. /* Restore virtual registers. */
  2062. if (sljit_get_register_index(saved_tmp_reg) < 0)
  2063. OP1(SLJIT_MOV, tmp_reg, 0, saved_tmp_reg, 0);
  2064. }
  2065. next_tmp_reg = (next_tmp_reg + 1) % RECURSE_TMP_REG_COUNT;
  2066. }
  2067. }
  2068. #undef RECURSE_TMP_REG_COUNT
  2069. static BOOL recurse_check_bit(compiler_common *common, sljit_sw bit_index)
  2070. {
  2071. uint8_t *byte;
  2072. uint8_t mask;
  2073. SLJIT_ASSERT((bit_index & (sizeof(sljit_sw) - 1)) == 0);
  2074. bit_index >>= SLJIT_WORD_SHIFT;
  2075. SLJIT_ASSERT((bit_index >> 3) < common->recurse_bitset_size);
  2076. mask = 1 << (bit_index & 0x7);
  2077. byte = common->recurse_bitset + (bit_index >> 3);
  2078. if (*byte & mask)
  2079. return FALSE;
  2080. *byte |= mask;
  2081. return TRUE;
  2082. }
  2083. enum get_recurse_flags {
  2084. recurse_flag_quit_found = (1 << 0),
  2085. recurse_flag_accept_found = (1 << 1),
  2086. recurse_flag_setsom_found = (1 << 2),
  2087. recurse_flag_setmark_found = (1 << 3),
  2088. recurse_flag_control_head_found = (1 << 4),
  2089. };
  2090. static int get_recurse_data_length(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, uint32_t *result_flags)
  2091. {
  2092. int length = 1;
  2093. int size, offset;
  2094. PCRE2_SPTR alternative;
  2095. uint32_t recurse_flags = 0;
  2096. memset(common->recurse_bitset, 0, common->recurse_bitset_size);
  2097. #if defined DEBUG_FORCE_CONTROL_HEAD && DEBUG_FORCE_CONTROL_HEAD
  2098. SLJIT_ASSERT(common->control_head_ptr != 0);
  2099. recurse_flags |= recurse_flag_control_head_found;
  2100. #endif
  2101. /* Calculate the sum of the private machine words. */
  2102. while (cc < ccend)
  2103. {
  2104. size = 0;
  2105. switch(*cc)
  2106. {
  2107. case OP_SET_SOM:
  2108. SLJIT_ASSERT(common->has_set_som);
  2109. recurse_flags |= recurse_flag_setsom_found;
  2110. cc += 1;
  2111. break;
  2112. case OP_RECURSE:
  2113. if (common->has_set_som)
  2114. recurse_flags |= recurse_flag_setsom_found;
  2115. if (common->mark_ptr != 0)
  2116. recurse_flags |= recurse_flag_setmark_found;
  2117. if (common->capture_last_ptr != 0 && recurse_check_bit(common, common->capture_last_ptr))
  2118. length++;
  2119. cc += 1 + LINK_SIZE;
  2120. break;
  2121. case OP_KET:
  2122. offset = PRIVATE_DATA(cc);
  2123. if (offset != 0)
  2124. {
  2125. if (recurse_check_bit(common, offset))
  2126. length++;
  2127. SLJIT_ASSERT(PRIVATE_DATA(cc + 1) != 0);
  2128. cc += PRIVATE_DATA(cc + 1);
  2129. }
  2130. cc += 1 + LINK_SIZE;
  2131. break;
  2132. case OP_ASSERT:
  2133. case OP_ASSERT_NOT:
  2134. case OP_ASSERTBACK:
  2135. case OP_ASSERTBACK_NOT:
  2136. case OP_ASSERT_NA:
  2137. case OP_ASSERTBACK_NA:
  2138. case OP_ONCE:
  2139. case OP_SCRIPT_RUN:
  2140. case OP_BRAPOS:
  2141. case OP_SBRA:
  2142. case OP_SBRAPOS:
  2143. case OP_SCOND:
  2144. SLJIT_ASSERT(PRIVATE_DATA(cc) != 0);
  2145. if (recurse_check_bit(common, PRIVATE_DATA(cc)))
  2146. length++;
  2147. cc += 1 + LINK_SIZE;
  2148. break;
  2149. case OP_CBRA:
  2150. case OP_SCBRA:
  2151. offset = GET2(cc, 1 + LINK_SIZE);
  2152. if (recurse_check_bit(common, OVECTOR(offset << 1)))
  2153. {
  2154. SLJIT_ASSERT(recurse_check_bit(common, OVECTOR((offset << 1) + 1)));
  2155. length += 2;
  2156. }
  2157. if (common->optimized_cbracket[offset] == 0 && recurse_check_bit(common, OVECTOR_PRIV(offset)))
  2158. length++;
  2159. if (common->capture_last_ptr != 0 && recurse_check_bit(common, common->capture_last_ptr))
  2160. length++;
  2161. cc += 1 + LINK_SIZE + IMM2_SIZE;
  2162. break;
  2163. case OP_CBRAPOS:
  2164. case OP_SCBRAPOS:
  2165. offset = GET2(cc, 1 + LINK_SIZE);
  2166. if (recurse_check_bit(common, OVECTOR(offset << 1)))
  2167. {
  2168. SLJIT_ASSERT(recurse_check_bit(common, OVECTOR((offset << 1) + 1)));
  2169. length += 2;
  2170. }
  2171. if (recurse_check_bit(common, OVECTOR_PRIV(offset)))
  2172. length++;
  2173. if (recurse_check_bit(common, PRIVATE_DATA(cc)))
  2174. length++;
  2175. if (common->capture_last_ptr != 0 && recurse_check_bit(common, common->capture_last_ptr))
  2176. length++;
  2177. cc += 1 + LINK_SIZE + IMM2_SIZE;
  2178. break;
  2179. case OP_COND:
  2180. /* Might be a hidden SCOND. */
  2181. alternative = cc + GET(cc, 1);
  2182. if ((*alternative == OP_KETRMAX || *alternative == OP_KETRMIN) && recurse_check_bit(common, PRIVATE_DATA(cc)))
  2183. length++;
  2184. cc += 1 + LINK_SIZE;
  2185. break;
  2186. CASE_ITERATOR_PRIVATE_DATA_1
  2187. offset = PRIVATE_DATA(cc);
  2188. if (offset != 0 && recurse_check_bit(common, offset))
  2189. length++;
  2190. cc += 2;
  2191. #ifdef SUPPORT_UNICODE
  2192. if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
  2193. #endif
  2194. break;
  2195. CASE_ITERATOR_PRIVATE_DATA_2A
  2196. offset = PRIVATE_DATA(cc);
  2197. if (offset != 0 && recurse_check_bit(common, offset))
  2198. {
  2199. SLJIT_ASSERT(recurse_check_bit(common, offset + sizeof(sljit_sw)));
  2200. length += 2;
  2201. }
  2202. cc += 2;
  2203. #ifdef SUPPORT_UNICODE
  2204. if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
  2205. #endif
  2206. break;
  2207. CASE_ITERATOR_PRIVATE_DATA_2B
  2208. offset = PRIVATE_DATA(cc);
  2209. if (offset != 0 && recurse_check_bit(common, offset))
  2210. {
  2211. SLJIT_ASSERT(recurse_check_bit(common, offset + sizeof(sljit_sw)));
  2212. length += 2;
  2213. }
  2214. cc += 2 + IMM2_SIZE;
  2215. #ifdef SUPPORT_UNICODE
  2216. if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
  2217. #endif
  2218. break;
  2219. CASE_ITERATOR_TYPE_PRIVATE_DATA_1
  2220. offset = PRIVATE_DATA(cc);
  2221. if (offset != 0 && recurse_check_bit(common, offset))
  2222. length++;
  2223. cc += 1;
  2224. break;
  2225. CASE_ITERATOR_TYPE_PRIVATE_DATA_2A
  2226. offset = PRIVATE_DATA(cc);
  2227. if (offset != 0 && recurse_check_bit(common, offset))
  2228. {
  2229. SLJIT_ASSERT(recurse_check_bit(common, offset + sizeof(sljit_sw)));
  2230. length += 2;
  2231. }
  2232. cc += 1;
  2233. break;
  2234. CASE_ITERATOR_TYPE_PRIVATE_DATA_2B
  2235. offset = PRIVATE_DATA(cc);
  2236. if (offset != 0 && recurse_check_bit(common, offset))
  2237. {
  2238. SLJIT_ASSERT(recurse_check_bit(common, offset + sizeof(sljit_sw)));
  2239. length += 2;
  2240. }
  2241. cc += 1 + IMM2_SIZE;
  2242. break;
  2243. case OP_CLASS:
  2244. case OP_NCLASS:
  2245. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
  2246. case OP_XCLASS:
  2247. size = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(PCRE2_UCHAR);
  2248. #else
  2249. size = 1 + 32 / (int)sizeof(PCRE2_UCHAR);
  2250. #endif
  2251. offset = PRIVATE_DATA(cc);
  2252. if (offset != 0 && recurse_check_bit(common, offset))
  2253. length += get_class_iterator_size(cc + size);
  2254. cc += size;
  2255. break;
  2256. case OP_MARK:
  2257. case OP_COMMIT_ARG:
  2258. case OP_PRUNE_ARG:
  2259. case OP_THEN_ARG:
  2260. SLJIT_ASSERT(common->mark_ptr != 0);
  2261. recurse_flags |= recurse_flag_setmark_found;
  2262. if (common->control_head_ptr != 0)
  2263. recurse_flags |= recurse_flag_control_head_found;
  2264. if (*cc != OP_MARK)
  2265. recurse_flags |= recurse_flag_quit_found;
  2266. cc += 1 + 2 + cc[1];
  2267. break;
  2268. case OP_PRUNE:
  2269. case OP_SKIP:
  2270. case OP_COMMIT:
  2271. recurse_flags |= recurse_flag_quit_found;
  2272. cc++;
  2273. break;
  2274. case OP_SKIP_ARG:
  2275. recurse_flags |= recurse_flag_quit_found;
  2276. cc += 1 + 2 + cc[1];
  2277. break;
  2278. case OP_THEN:
  2279. SLJIT_ASSERT(common->control_head_ptr != 0);
  2280. recurse_flags |= recurse_flag_quit_found | recurse_flag_control_head_found;
  2281. cc++;
  2282. break;
  2283. case OP_ACCEPT:
  2284. case OP_ASSERT_ACCEPT:
  2285. recurse_flags |= recurse_flag_accept_found;
  2286. cc++;
  2287. break;
  2288. default:
  2289. cc = next_opcode(common, cc);
  2290. SLJIT_ASSERT(cc != NULL);
  2291. break;
  2292. }
  2293. }
  2294. SLJIT_ASSERT(cc == ccend);
  2295. if (recurse_flags & recurse_flag_control_head_found)
  2296. length++;
  2297. if (recurse_flags & recurse_flag_quit_found)
  2298. {
  2299. if (recurse_flags & recurse_flag_setsom_found)
  2300. length++;
  2301. if (recurse_flags & recurse_flag_setmark_found)
  2302. length++;
  2303. }
  2304. *result_flags = recurse_flags;
  2305. return length;
  2306. }
  2307. enum copy_recurse_data_types {
  2308. recurse_copy_from_global,
  2309. recurse_copy_private_to_global,
  2310. recurse_copy_shared_to_global,
  2311. recurse_copy_kept_shared_to_global,
  2312. recurse_swap_global
  2313. };
  2314. static void copy_recurse_data(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend,
  2315. int type, int stackptr, int stacktop, uint32_t recurse_flags)
  2316. {
  2317. delayed_mem_copy_status status;
  2318. PCRE2_SPTR alternative;
  2319. sljit_sw private_srcw[2];
  2320. sljit_sw shared_srcw[3];
  2321. sljit_sw kept_shared_srcw[2];
  2322. int private_count, shared_count, kept_shared_count;
  2323. int from_sp, base_reg, offset, i;
  2324. memset(common->recurse_bitset, 0, common->recurse_bitset_size);
  2325. #if defined DEBUG_FORCE_CONTROL_HEAD && DEBUG_FORCE_CONTROL_HEAD
  2326. SLJIT_ASSERT(common->control_head_ptr != 0);
  2327. recurse_check_bit(common, common->control_head_ptr);
  2328. #endif
  2329. switch (type)
  2330. {
  2331. case recurse_copy_from_global:
  2332. from_sp = TRUE;
  2333. base_reg = STACK_TOP;
  2334. break;
  2335. case recurse_copy_private_to_global:
  2336. case recurse_copy_shared_to_global:
  2337. case recurse_copy_kept_shared_to_global:
  2338. from_sp = FALSE;
  2339. base_reg = STACK_TOP;
  2340. break;
  2341. default:
  2342. SLJIT_ASSERT(type == recurse_swap_global);
  2343. from_sp = FALSE;
  2344. base_reg = TMP2;
  2345. break;
  2346. }
  2347. stackptr = STACK(stackptr);
  2348. stacktop = STACK(stacktop);
  2349. status.tmp_regs[0] = TMP1;
  2350. status.saved_tmp_regs[0] = TMP1;
  2351. if (base_reg != TMP2)
  2352. {
  2353. status.tmp_regs[1] = TMP2;
  2354. status.saved_tmp_regs[1] = TMP2;
  2355. }
  2356. else
  2357. {
  2358. status.saved_tmp_regs[1] = RETURN_ADDR;
  2359. if (HAS_VIRTUAL_REGISTERS)
  2360. status.tmp_regs[1] = STR_PTR;
  2361. else
  2362. status.tmp_regs[1] = RETURN_ADDR;
  2363. }
  2364. status.saved_tmp_regs[2] = TMP3;
  2365. if (HAS_VIRTUAL_REGISTERS)
  2366. status.tmp_regs[2] = STR_END;
  2367. else
  2368. status.tmp_regs[2] = TMP3;
  2369. delayed_mem_copy_init(&status, common);
  2370. if (type != recurse_copy_shared_to_global && type != recurse_copy_kept_shared_to_global)
  2371. {
  2372. SLJIT_ASSERT(type == recurse_copy_from_global || type == recurse_copy_private_to_global || type == recurse_swap_global);
  2373. if (!from_sp)
  2374. delayed_mem_copy_move(&status, base_reg, stackptr, SLJIT_SP, common->recursive_head_ptr);
  2375. if (from_sp || type == recurse_swap_global)
  2376. delayed_mem_copy_move(&status, SLJIT_SP, common->recursive_head_ptr, base_reg, stackptr);
  2377. }
  2378. stackptr += sizeof(sljit_sw);
  2379. #if defined DEBUG_FORCE_CONTROL_HEAD && DEBUG_FORCE_CONTROL_HEAD
  2380. if (type != recurse_copy_shared_to_global)
  2381. {
  2382. if (!from_sp)
  2383. delayed_mem_copy_move(&status, base_reg, stackptr, SLJIT_SP, common->control_head_ptr);
  2384. if (from_sp || type == recurse_swap_global)
  2385. delayed_mem_copy_move(&status, SLJIT_SP, common->control_head_ptr, base_reg, stackptr);
  2386. }
  2387. stackptr += sizeof(sljit_sw);
  2388. #endif
  2389. while (cc < ccend)
  2390. {
  2391. private_count = 0;
  2392. shared_count = 0;
  2393. kept_shared_count = 0;
  2394. switch(*cc)
  2395. {
  2396. case OP_SET_SOM:
  2397. SLJIT_ASSERT(common->has_set_som);
  2398. if ((recurse_flags & recurse_flag_quit_found) && recurse_check_bit(common, OVECTOR(0)))
  2399. {
  2400. kept_shared_srcw[0] = OVECTOR(0);
  2401. kept_shared_count = 1;
  2402. }
  2403. cc += 1;
  2404. break;
  2405. case OP_RECURSE:
  2406. if (recurse_flags & recurse_flag_quit_found)
  2407. {
  2408. if (common->has_set_som && recurse_check_bit(common, OVECTOR(0)))
  2409. {
  2410. kept_shared_srcw[0] = OVECTOR(0);
  2411. kept_shared_count = 1;
  2412. }
  2413. if (common->mark_ptr != 0 && recurse_check_bit(common, common->mark_ptr))
  2414. {
  2415. kept_shared_srcw[kept_shared_count] = common->mark_ptr;
  2416. kept_shared_count++;
  2417. }
  2418. }
  2419. if (common->capture_last_ptr != 0 && recurse_check_bit(common, common->capture_last_ptr))
  2420. {
  2421. shared_srcw[0] = common->capture_last_ptr;
  2422. shared_count = 1;
  2423. }
  2424. cc += 1 + LINK_SIZE;
  2425. break;
  2426. case OP_KET:
  2427. private_srcw[0] = PRIVATE_DATA(cc);
  2428. if (private_srcw[0] != 0)
  2429. {
  2430. if (recurse_check_bit(common, private_srcw[0]))
  2431. private_count = 1;
  2432. SLJIT_ASSERT(PRIVATE_DATA(cc + 1) != 0);
  2433. cc += PRIVATE_DATA(cc + 1);
  2434. }
  2435. cc += 1 + LINK_SIZE;
  2436. break;
  2437. case OP_ASSERT:
  2438. case OP_ASSERT_NOT:
  2439. case OP_ASSERTBACK:
  2440. case OP_ASSERTBACK_NOT:
  2441. case OP_ASSERT_NA:
  2442. case OP_ASSERTBACK_NA:
  2443. case OP_ONCE:
  2444. case OP_SCRIPT_RUN:
  2445. case OP_BRAPOS:
  2446. case OP_SBRA:
  2447. case OP_SBRAPOS:
  2448. case OP_SCOND:
  2449. private_srcw[0] = PRIVATE_DATA(cc);
  2450. if (recurse_check_bit(common, private_srcw[0]))
  2451. private_count = 1;
  2452. cc += 1 + LINK_SIZE;
  2453. break;
  2454. case OP_CBRA:
  2455. case OP_SCBRA:
  2456. offset = GET2(cc, 1 + LINK_SIZE);
  2457. shared_srcw[0] = OVECTOR(offset << 1);
  2458. if (recurse_check_bit(common, shared_srcw[0]))
  2459. {
  2460. shared_srcw[1] = shared_srcw[0] + sizeof(sljit_sw);
  2461. SLJIT_ASSERT(recurse_check_bit(common, shared_srcw[1]));
  2462. shared_count = 2;
  2463. }
  2464. if (common->capture_last_ptr != 0 && recurse_check_bit(common, common->capture_last_ptr))
  2465. {
  2466. shared_srcw[shared_count] = common->capture_last_ptr;
  2467. shared_count++;
  2468. }
  2469. if (common->optimized_cbracket[offset] == 0)
  2470. {
  2471. private_srcw[0] = OVECTOR_PRIV(offset);
  2472. if (recurse_check_bit(common, private_srcw[0]))
  2473. private_count = 1;
  2474. }
  2475. cc += 1 + LINK_SIZE + IMM2_SIZE;
  2476. break;
  2477. case OP_CBRAPOS:
  2478. case OP_SCBRAPOS:
  2479. offset = GET2(cc, 1 + LINK_SIZE);
  2480. shared_srcw[0] = OVECTOR(offset << 1);
  2481. if (recurse_check_bit(common, shared_srcw[0]))
  2482. {
  2483. shared_srcw[1] = shared_srcw[0] + sizeof(sljit_sw);
  2484. SLJIT_ASSERT(recurse_check_bit(common, shared_srcw[1]));
  2485. shared_count = 2;
  2486. }
  2487. if (common->capture_last_ptr != 0 && recurse_check_bit(common, common->capture_last_ptr))
  2488. {
  2489. shared_srcw[shared_count] = common->capture_last_ptr;
  2490. shared_count++;
  2491. }
  2492. private_srcw[0] = PRIVATE_DATA(cc);
  2493. if (recurse_check_bit(common, private_srcw[0]))
  2494. private_count = 1;
  2495. offset = OVECTOR_PRIV(offset);
  2496. if (recurse_check_bit(common, offset))
  2497. {
  2498. private_srcw[private_count] = offset;
  2499. private_count++;
  2500. }
  2501. cc += 1 + LINK_SIZE + IMM2_SIZE;
  2502. break;
  2503. case OP_COND:
  2504. /* Might be a hidden SCOND. */
  2505. alternative = cc + GET(cc, 1);
  2506. if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN)
  2507. {
  2508. private_srcw[0] = PRIVATE_DATA(cc);
  2509. if (recurse_check_bit(common, private_srcw[0]))
  2510. private_count = 1;
  2511. }
  2512. cc += 1 + LINK_SIZE;
  2513. break;
  2514. CASE_ITERATOR_PRIVATE_DATA_1
  2515. private_srcw[0] = PRIVATE_DATA(cc);
  2516. if (private_srcw[0] != 0 && recurse_check_bit(common, private_srcw[0]))
  2517. private_count = 1;
  2518. cc += 2;
  2519. #ifdef SUPPORT_UNICODE
  2520. if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
  2521. #endif
  2522. break;
  2523. CASE_ITERATOR_PRIVATE_DATA_2A
  2524. private_srcw[0] = PRIVATE_DATA(cc);
  2525. if (private_srcw[0] != 0 && recurse_check_bit(common, private_srcw[0]))
  2526. {
  2527. private_count = 2;
  2528. private_srcw[1] = private_srcw[0] + sizeof(sljit_sw);
  2529. SLJIT_ASSERT(recurse_check_bit(common, private_srcw[1]));
  2530. }
  2531. cc += 2;
  2532. #ifdef SUPPORT_UNICODE
  2533. if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
  2534. #endif
  2535. break;
  2536. CASE_ITERATOR_PRIVATE_DATA_2B
  2537. private_srcw[0] = PRIVATE_DATA(cc);
  2538. if (private_srcw[0] != 0 && recurse_check_bit(common, private_srcw[0]))
  2539. {
  2540. private_count = 2;
  2541. private_srcw[1] = private_srcw[0] + sizeof(sljit_sw);
  2542. SLJIT_ASSERT(recurse_check_bit(common, private_srcw[1]));
  2543. }
  2544. cc += 2 + IMM2_SIZE;
  2545. #ifdef SUPPORT_UNICODE
  2546. if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
  2547. #endif
  2548. break;
  2549. CASE_ITERATOR_TYPE_PRIVATE_DATA_1
  2550. private_srcw[0] = PRIVATE_DATA(cc);
  2551. if (private_srcw[0] != 0 && recurse_check_bit(common, private_srcw[0]))
  2552. private_count = 1;
  2553. cc += 1;
  2554. break;
  2555. CASE_ITERATOR_TYPE_PRIVATE_DATA_2A
  2556. private_srcw[0] = PRIVATE_DATA(cc);
  2557. if (private_srcw[0] != 0 && recurse_check_bit(common, private_srcw[0]))
  2558. {
  2559. private_count = 2;
  2560. private_srcw[1] = private_srcw[0] + sizeof(sljit_sw);
  2561. SLJIT_ASSERT(recurse_check_bit(common, private_srcw[1]));
  2562. }
  2563. cc += 1;
  2564. break;
  2565. CASE_ITERATOR_TYPE_PRIVATE_DATA_2B
  2566. private_srcw[0] = PRIVATE_DATA(cc);
  2567. if (private_srcw[0] != 0 && recurse_check_bit(common, private_srcw[0]))
  2568. {
  2569. private_count = 2;
  2570. private_srcw[1] = private_srcw[0] + sizeof(sljit_sw);
  2571. SLJIT_ASSERT(recurse_check_bit(common, private_srcw[1]));
  2572. }
  2573. cc += 1 + IMM2_SIZE;
  2574. break;
  2575. case OP_CLASS:
  2576. case OP_NCLASS:
  2577. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
  2578. case OP_XCLASS:
  2579. i = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(PCRE2_UCHAR);
  2580. #else
  2581. i = 1 + 32 / (int)sizeof(PCRE2_UCHAR);
  2582. #endif
  2583. if (PRIVATE_DATA(cc) != 0)
  2584. {
  2585. private_count = 1;
  2586. private_srcw[0] = PRIVATE_DATA(cc);
  2587. switch(get_class_iterator_size(cc + i))
  2588. {
  2589. case 1:
  2590. break;
  2591. case 2:
  2592. if (recurse_check_bit(common, private_srcw[0]))
  2593. {
  2594. private_count = 2;
  2595. private_srcw[1] = private_srcw[0] + sizeof(sljit_sw);
  2596. SLJIT_ASSERT(recurse_check_bit(common, private_srcw[1]));
  2597. }
  2598. break;
  2599. default:
  2600. SLJIT_UNREACHABLE();
  2601. break;
  2602. }
  2603. }
  2604. cc += i;
  2605. break;
  2606. case OP_MARK:
  2607. case OP_COMMIT_ARG:
  2608. case OP_PRUNE_ARG:
  2609. case OP_THEN_ARG:
  2610. SLJIT_ASSERT(common->mark_ptr != 0);
  2611. if ((recurse_flags & recurse_flag_quit_found) && recurse_check_bit(common, common->mark_ptr))
  2612. {
  2613. kept_shared_srcw[0] = common->mark_ptr;
  2614. kept_shared_count = 1;
  2615. }
  2616. if (common->control_head_ptr != 0 && recurse_check_bit(common, common->control_head_ptr))
  2617. {
  2618. private_srcw[0] = common->control_head_ptr;
  2619. private_count = 1;
  2620. }
  2621. cc += 1 + 2 + cc[1];
  2622. break;
  2623. case OP_THEN:
  2624. SLJIT_ASSERT(common->control_head_ptr != 0);
  2625. if (recurse_check_bit(common, common->control_head_ptr))
  2626. {
  2627. private_srcw[0] = common->control_head_ptr;
  2628. private_count = 1;
  2629. }
  2630. cc++;
  2631. break;
  2632. default:
  2633. cc = next_opcode(common, cc);
  2634. SLJIT_ASSERT(cc != NULL);
  2635. continue;
  2636. }
  2637. if (type != recurse_copy_shared_to_global && type != recurse_copy_kept_shared_to_global)
  2638. {
  2639. SLJIT_ASSERT(type == recurse_copy_from_global || type == recurse_copy_private_to_global || type == recurse_swap_global);
  2640. for (i = 0; i < private_count; i++)
  2641. {
  2642. SLJIT_ASSERT(private_srcw[i] != 0);
  2643. if (!from_sp)
  2644. delayed_mem_copy_move(&status, base_reg, stackptr, SLJIT_SP, private_srcw[i]);
  2645. if (from_sp || type == recurse_swap_global)
  2646. delayed_mem_copy_move(&status, SLJIT_SP, private_srcw[i], base_reg, stackptr);
  2647. stackptr += sizeof(sljit_sw);
  2648. }
  2649. }
  2650. else
  2651. stackptr += sizeof(sljit_sw) * private_count;
  2652. if (type != recurse_copy_private_to_global && type != recurse_copy_kept_shared_to_global)
  2653. {
  2654. SLJIT_ASSERT(type == recurse_copy_from_global || type == recurse_copy_shared_to_global || type == recurse_swap_global);
  2655. for (i = 0; i < shared_count; i++)
  2656. {
  2657. SLJIT_ASSERT(shared_srcw[i] != 0);
  2658. if (!from_sp)
  2659. delayed_mem_copy_move(&status, base_reg, stackptr, SLJIT_SP, shared_srcw[i]);
  2660. if (from_sp || type == recurse_swap_global)
  2661. delayed_mem_copy_move(&status, SLJIT_SP, shared_srcw[i], base_reg, stackptr);
  2662. stackptr += sizeof(sljit_sw);
  2663. }
  2664. }
  2665. else
  2666. stackptr += sizeof(sljit_sw) * shared_count;
  2667. if (type != recurse_copy_private_to_global && type != recurse_swap_global)
  2668. {
  2669. SLJIT_ASSERT(type == recurse_copy_from_global || type == recurse_copy_shared_to_global || type == recurse_copy_kept_shared_to_global);
  2670. for (i = 0; i < kept_shared_count; i++)
  2671. {
  2672. SLJIT_ASSERT(kept_shared_srcw[i] != 0);
  2673. if (!from_sp)
  2674. delayed_mem_copy_move(&status, base_reg, stackptr, SLJIT_SP, kept_shared_srcw[i]);
  2675. if (from_sp || type == recurse_swap_global)
  2676. delayed_mem_copy_move(&status, SLJIT_SP, kept_shared_srcw[i], base_reg, stackptr);
  2677. stackptr += sizeof(sljit_sw);
  2678. }
  2679. }
  2680. else
  2681. stackptr += sizeof(sljit_sw) * kept_shared_count;
  2682. }
  2683. SLJIT_ASSERT(cc == ccend && stackptr == stacktop);
  2684. delayed_mem_copy_finish(&status);
  2685. }
  2686. static SLJIT_INLINE PCRE2_SPTR set_then_offsets(compiler_common *common, PCRE2_SPTR cc, sljit_u8 *current_offset)
  2687. {
  2688. PCRE2_SPTR end = bracketend(cc);
  2689. BOOL has_alternatives = cc[GET(cc, 1)] == OP_ALT;
  2690. /* Assert captures then. */
  2691. if (*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NA)
  2692. current_offset = NULL;
  2693. /* Conditional block does not. */
  2694. if (*cc == OP_COND || *cc == OP_SCOND)
  2695. has_alternatives = FALSE;
  2696. cc = next_opcode(common, cc);
  2697. if (has_alternatives)
  2698. current_offset = common->then_offsets + (cc - common->start);
  2699. while (cc < end)
  2700. {
  2701. if ((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NA) || (*cc >= OP_ONCE && *cc <= OP_SCOND))
  2702. cc = set_then_offsets(common, cc, current_offset);
  2703. else
  2704. {
  2705. if (*cc == OP_ALT && has_alternatives)
  2706. current_offset = common->then_offsets + (cc + 1 + LINK_SIZE - common->start);
  2707. if (*cc >= OP_THEN && *cc <= OP_THEN_ARG && current_offset != NULL)
  2708. *current_offset = 1;
  2709. cc = next_opcode(common, cc);
  2710. }
  2711. }
  2712. return end;
  2713. }
  2714. #undef CASE_ITERATOR_PRIVATE_DATA_1
  2715. #undef CASE_ITERATOR_PRIVATE_DATA_2A
  2716. #undef CASE_ITERATOR_PRIVATE_DATA_2B
  2717. #undef CASE_ITERATOR_TYPE_PRIVATE_DATA_1
  2718. #undef CASE_ITERATOR_TYPE_PRIVATE_DATA_2A
  2719. #undef CASE_ITERATOR_TYPE_PRIVATE_DATA_2B
  2720. static SLJIT_INLINE BOOL is_powerof2(unsigned int value)
  2721. {
  2722. return (value & (value - 1)) == 0;
  2723. }
  2724. static SLJIT_INLINE void set_jumps(jump_list *list, struct sljit_label *label)
  2725. {
  2726. while (list)
  2727. {
  2728. /* sljit_set_label is clever enough to do nothing
  2729. if either the jump or the label is NULL. */
  2730. SET_LABEL(list->jump, label);
  2731. list = list->next;
  2732. }
  2733. }
  2734. static SLJIT_INLINE void add_jump(struct sljit_compiler *compiler, jump_list **list, struct sljit_jump *jump)
  2735. {
  2736. jump_list *list_item = sljit_alloc_memory(compiler, sizeof(jump_list));
  2737. if (list_item)
  2738. {
  2739. list_item->next = *list;
  2740. list_item->jump = jump;
  2741. *list = list_item;
  2742. }
  2743. }
  2744. static void add_stub(compiler_common *common, struct sljit_jump *start)
  2745. {
  2746. DEFINE_COMPILER;
  2747. stub_list *list_item = sljit_alloc_memory(compiler, sizeof(stub_list));
  2748. if (list_item)
  2749. {
  2750. list_item->start = start;
  2751. list_item->quit = LABEL();
  2752. list_item->next = common->stubs;
  2753. common->stubs = list_item;
  2754. }
  2755. }
  2756. static void flush_stubs(compiler_common *common)
  2757. {
  2758. DEFINE_COMPILER;
  2759. stub_list *list_item = common->stubs;
  2760. while (list_item)
  2761. {
  2762. JUMPHERE(list_item->start);
  2763. add_jump(compiler, &common->stackalloc, JUMP(SLJIT_FAST_CALL));
  2764. JUMPTO(SLJIT_JUMP, list_item->quit);
  2765. list_item = list_item->next;
  2766. }
  2767. common->stubs = NULL;
  2768. }
  2769. static SLJIT_INLINE void count_match(compiler_common *common)
  2770. {
  2771. DEFINE_COMPILER;
  2772. OP2(SLJIT_SUB | SLJIT_SET_Z, COUNT_MATCH, 0, COUNT_MATCH, 0, SLJIT_IMM, 1);
  2773. add_jump(compiler, &common->calllimit, JUMP(SLJIT_ZERO));
  2774. }
  2775. static SLJIT_INLINE void allocate_stack(compiler_common *common, int size)
  2776. {
  2777. /* May destroy all locals and registers except TMP2. */
  2778. DEFINE_COMPILER;
  2779. SLJIT_ASSERT(size > 0);
  2780. OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw));
  2781. #ifdef DESTROY_REGISTERS
  2782. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 12345);
  2783. OP1(SLJIT_MOV, TMP3, 0, TMP1, 0);
  2784. OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0);
  2785. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, TMP1, 0);
  2786. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP1, 0);
  2787. #endif
  2788. add_stub(common, CMP(SLJIT_LESS, STACK_TOP, 0, STACK_LIMIT, 0));
  2789. }
  2790. static SLJIT_INLINE void free_stack(compiler_common *common, int size)
  2791. {
  2792. DEFINE_COMPILER;
  2793. SLJIT_ASSERT(size > 0);
  2794. OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw));
  2795. }
  2796. static sljit_uw * allocate_read_only_data(compiler_common *common, sljit_uw size)
  2797. {
  2798. DEFINE_COMPILER;
  2799. sljit_uw *result;
  2800. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  2801. return NULL;
  2802. result = (sljit_uw *)SLJIT_MALLOC(size + sizeof(sljit_uw), compiler->allocator_data);
  2803. if (SLJIT_UNLIKELY(result == NULL))
  2804. {
  2805. sljit_set_compiler_memory_error(compiler);
  2806. return NULL;
  2807. }
  2808. *(void**)result = common->read_only_data_head;
  2809. common->read_only_data_head = (void *)result;
  2810. return result + 1;
  2811. }
  2812. static SLJIT_INLINE void reset_ovector(compiler_common *common, int length)
  2813. {
  2814. DEFINE_COMPILER;
  2815. struct sljit_label *loop;
  2816. sljit_s32 i;
  2817. /* At this point we can freely use all temporary registers. */
  2818. SLJIT_ASSERT(length > 1);
  2819. /* TMP1 returns with begin - 1. */
  2820. OP2(SLJIT_SUB, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(jit_arguments, begin), SLJIT_IMM, IN_UCHARS(1));
  2821. if (length < 8)
  2822. {
  2823. for (i = 1; i < length; i++)
  2824. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(i), SLJIT_R0, 0);
  2825. }
  2826. else
  2827. {
  2828. if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_PRE, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw)) == SLJIT_SUCCESS)
  2829. {
  2830. GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START);
  2831. OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1);
  2832. loop = LABEL();
  2833. sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw));
  2834. OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1);
  2835. JUMPTO(SLJIT_NOT_ZERO, loop);
  2836. }
  2837. else
  2838. {
  2839. GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START + sizeof(sljit_sw));
  2840. OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1);
  2841. loop = LABEL();
  2842. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0);
  2843. OP2(SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_sw));
  2844. OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1);
  2845. JUMPTO(SLJIT_NOT_ZERO, loop);
  2846. }
  2847. }
  2848. }
  2849. static SLJIT_INLINE void reset_early_fail(compiler_common *common)
  2850. {
  2851. DEFINE_COMPILER;
  2852. sljit_u32 size = (sljit_u32)(common->early_fail_end_ptr - common->early_fail_start_ptr);
  2853. sljit_u32 uncleared_size;
  2854. sljit_s32 src = SLJIT_IMM;
  2855. sljit_s32 i;
  2856. struct sljit_label *loop;
  2857. SLJIT_ASSERT(common->early_fail_start_ptr < common->early_fail_end_ptr);
  2858. if (size == sizeof(sljit_sw))
  2859. {
  2860. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->early_fail_start_ptr, SLJIT_IMM, 0);
  2861. return;
  2862. }
  2863. if (sljit_get_register_index(TMP3) >= 0 && !sljit_has_cpu_feature(SLJIT_HAS_ZERO_REGISTER))
  2864. {
  2865. OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0);
  2866. src = TMP3;
  2867. }
  2868. if (size <= 6 * sizeof(sljit_sw))
  2869. {
  2870. for (i = common->early_fail_start_ptr; i < common->early_fail_end_ptr; i += sizeof(sljit_sw))
  2871. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), i, src, 0);
  2872. return;
  2873. }
  2874. GET_LOCAL_BASE(TMP1, 0, common->early_fail_start_ptr);
  2875. uncleared_size = ((size / sizeof(sljit_sw)) % 3) * sizeof(sljit_sw);
  2876. OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, size - uncleared_size);
  2877. loop = LABEL();
  2878. OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), 0, src, 0);
  2879. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 3 * sizeof(sljit_sw));
  2880. OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), -2 * (sljit_sw)sizeof(sljit_sw), src, 0);
  2881. OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), -1 * (sljit_sw)sizeof(sljit_sw), src, 0);
  2882. CMPTO(SLJIT_LESS, TMP1, 0, TMP2, 0, loop);
  2883. if (uncleared_size >= sizeof(sljit_sw))
  2884. OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), 0, src, 0);
  2885. if (uncleared_size >= 2 * sizeof(sljit_sw))
  2886. OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), sizeof(sljit_sw), src, 0);
  2887. }
  2888. static SLJIT_INLINE void do_reset_match(compiler_common *common, int length)
  2889. {
  2890. DEFINE_COMPILER;
  2891. struct sljit_label *loop;
  2892. int i;
  2893. SLJIT_ASSERT(length > 1);
  2894. /* OVECTOR(1) contains the "string begin - 1" constant. */
  2895. if (length > 2)
  2896. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));
  2897. if (length < 8)
  2898. {
  2899. for (i = 2; i < length; i++)
  2900. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(i), TMP1, 0);
  2901. }
  2902. else
  2903. {
  2904. if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_PRE, TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw)) == SLJIT_SUCCESS)
  2905. {
  2906. GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + sizeof(sljit_sw));
  2907. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2);
  2908. loop = LABEL();
  2909. sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
  2910. OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1);
  2911. JUMPTO(SLJIT_NOT_ZERO, loop);
  2912. }
  2913. else
  2914. {
  2915. GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + 2 * sizeof(sljit_sw));
  2916. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2);
  2917. loop = LABEL();
  2918. OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, TMP1, 0);
  2919. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, sizeof(sljit_sw));
  2920. OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1);
  2921. JUMPTO(SLJIT_NOT_ZERO, loop);
  2922. }
  2923. }
  2924. if (!HAS_VIRTUAL_REGISTERS)
  2925. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, stack));
  2926. else
  2927. OP1(SLJIT_MOV, STACK_TOP, 0, ARGUMENTS, 0);
  2928. if (common->mark_ptr != 0)
  2929. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, SLJIT_IMM, 0);
  2930. if (common->control_head_ptr != 0)
  2931. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
  2932. if (HAS_VIRTUAL_REGISTERS)
  2933. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(jit_arguments, stack));
  2934. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
  2935. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct sljit_stack, end));
  2936. }
  2937. static sljit_sw SLJIT_FUNC do_search_mark(sljit_sw *current, PCRE2_SPTR skip_arg)
  2938. {
  2939. while (current != NULL)
  2940. {
  2941. switch (current[1])
  2942. {
  2943. case type_then_trap:
  2944. break;
  2945. case type_mark:
  2946. if (PRIV(strcmp)(skip_arg, (PCRE2_SPTR)current[2]) == 0)
  2947. return current[3];
  2948. break;
  2949. default:
  2950. SLJIT_UNREACHABLE();
  2951. break;
  2952. }
  2953. SLJIT_ASSERT(current[0] == 0 || current < (sljit_sw*)current[0]);
  2954. current = (sljit_sw*)current[0];
  2955. }
  2956. return 0;
  2957. }
  2958. static SLJIT_INLINE void copy_ovector(compiler_common *common, int topbracket)
  2959. {
  2960. DEFINE_COMPILER;
  2961. struct sljit_label *loop;
  2962. BOOL has_pre;
  2963. /* At this point we can freely use all registers. */
  2964. OP1(SLJIT_MOV, SLJIT_S2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));
  2965. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(1), STR_PTR, 0);
  2966. if (HAS_VIRTUAL_REGISTERS)
  2967. {
  2968. OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0);
  2969. OP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
  2970. if (common->mark_ptr != 0)
  2971. OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);
  2972. OP1(SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, oveccount));
  2973. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_S0, 0);
  2974. if (common->mark_ptr != 0)
  2975. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R2, 0);
  2976. OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, match_data),
  2977. SLJIT_IMM, SLJIT_OFFSETOF(pcre2_match_data, ovector) - sizeof(PCRE2_SIZE));
  2978. }
  2979. else
  2980. {
  2981. OP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
  2982. OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, match_data));
  2983. if (common->mark_ptr != 0)
  2984. OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);
  2985. OP1(SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, oveccount));
  2986. OP1(SLJIT_MOV, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_S0, 0);
  2987. if (common->mark_ptr != 0)
  2988. OP1(SLJIT_MOV, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R0, 0);
  2989. OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, SLJIT_OFFSETOF(pcre2_match_data, ovector) - sizeof(PCRE2_SIZE));
  2990. }
  2991. has_pre = sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)) == SLJIT_SUCCESS;
  2992. GET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START - (has_pre ? sizeof(sljit_sw) : 0));
  2993. OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? SLJIT_R0 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
  2994. loop = LABEL();
  2995. if (has_pre)
  2996. sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw));
  2997. else
  2998. {
  2999. OP1(SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 0);
  3000. OP2(SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw));
  3001. }
  3002. OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, sizeof(PCRE2_SIZE));
  3003. OP2(SLJIT_SUB, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_R0, 0);
  3004. /* Copy the integer value to the output buffer */
  3005. #if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  3006. OP2(SLJIT_ASHR, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, UCHAR_SHIFT);
  3007. #endif
  3008. SLJIT_ASSERT(sizeof(PCRE2_SIZE) == 4 || sizeof(PCRE2_SIZE) == 8);
  3009. OP1(((sizeof(PCRE2_SIZE) == 4) ? SLJIT_MOV_U32 : SLJIT_MOV), SLJIT_MEM1(SLJIT_R2), 0, SLJIT_S1, 0);
  3010. OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
  3011. JUMPTO(SLJIT_NOT_ZERO, loop);
  3012. /* Calculate the return value, which is the maximum ovector value. */
  3013. if (topbracket > 1)
  3014. {
  3015. if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_R2, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw))) == SLJIT_SUCCESS)
  3016. {
  3017. GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + topbracket * 2 * sizeof(sljit_sw));
  3018. OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1);
  3019. /* OVECTOR(0) is never equal to SLJIT_S2. */
  3020. loop = LABEL();
  3021. sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_R2, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw)));
  3022. OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
  3023. CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop);
  3024. OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_R1, 0);
  3025. }
  3026. else
  3027. {
  3028. GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + (topbracket - 1) * 2 * sizeof(sljit_sw));
  3029. OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1);
  3030. /* OVECTOR(0) is never equal to SLJIT_S2. */
  3031. loop = LABEL();
  3032. OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), 0);
  3033. OP2(SLJIT_SUB, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2 * (sljit_sw)sizeof(sljit_sw));
  3034. OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
  3035. CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop);
  3036. OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_R1, 0);
  3037. }
  3038. }
  3039. else
  3040. OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1);
  3041. }
  3042. static SLJIT_INLINE void return_with_partial_match(compiler_common *common, struct sljit_label *quit)
  3043. {
  3044. DEFINE_COMPILER;
  3045. sljit_s32 mov_opcode;
  3046. sljit_s32 arguments_reg = !HAS_VIRTUAL_REGISTERS ? ARGUMENTS : SLJIT_R1;
  3047. SLJIT_COMPILE_ASSERT(STR_END == SLJIT_S0, str_end_must_be_saved_reg0);
  3048. SLJIT_ASSERT(common->start_used_ptr != 0 && common->start_ptr != 0
  3049. && (common->mode == PCRE2_JIT_PARTIAL_SOFT ? common->hit_start != 0 : common->hit_start == 0));
  3050. if (arguments_reg != ARGUMENTS)
  3051. OP1(SLJIT_MOV, arguments_reg, 0, ARGUMENTS, 0);
  3052. OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP),
  3053. common->mode == PCRE2_JIT_PARTIAL_SOFT ? common->hit_start : common->start_ptr);
  3054. OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_PARTIAL);
  3055. /* Store match begin and end. */
  3056. OP1(SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(arguments_reg), SLJIT_OFFSETOF(jit_arguments, begin));
  3057. OP1(SLJIT_MOV, SLJIT_MEM1(arguments_reg), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_R2, 0);
  3058. OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_MEM1(arguments_reg), SLJIT_OFFSETOF(jit_arguments, match_data));
  3059. mov_opcode = (sizeof(PCRE2_SIZE) == 4) ? SLJIT_MOV_U32 : SLJIT_MOV;
  3060. OP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_S1, 0);
  3061. #if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  3062. OP2(SLJIT_ASHR, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, UCHAR_SHIFT);
  3063. #endif
  3064. OP1(mov_opcode, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(pcre2_match_data, ovector), SLJIT_R2, 0);
  3065. OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_S1, 0);
  3066. #if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  3067. OP2(SLJIT_ASHR, STR_END, 0, STR_END, 0, SLJIT_IMM, UCHAR_SHIFT);
  3068. #endif
  3069. OP1(mov_opcode, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(pcre2_match_data, ovector) + sizeof(PCRE2_SIZE), STR_END, 0);
  3070. JUMPTO(SLJIT_JUMP, quit);
  3071. }
  3072. static SLJIT_INLINE void check_start_used_ptr(compiler_common *common)
  3073. {
  3074. /* May destroy TMP1. */
  3075. DEFINE_COMPILER;
  3076. struct sljit_jump *jump;
  3077. if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
  3078. {
  3079. /* The value of -1 must be kept for start_used_ptr! */
  3080. OP2(SLJIT_ADD, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, 1);
  3081. /* Jumps if start_used_ptr < STR_PTR, or start_used_ptr == -1. Although overwriting
  3082. is not necessary if start_used_ptr == STR_PTR, it does not hurt as well. */
  3083. jump = CMP(SLJIT_LESS_EQUAL, TMP1, 0, STR_PTR, 0);
  3084. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
  3085. JUMPHERE(jump);
  3086. }
  3087. else if (common->mode == PCRE2_JIT_PARTIAL_HARD)
  3088. {
  3089. jump = CMP(SLJIT_LESS_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
  3090. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
  3091. JUMPHERE(jump);
  3092. }
  3093. }
  3094. static SLJIT_INLINE BOOL char_has_othercase(compiler_common *common, PCRE2_SPTR cc)
  3095. {
  3096. /* Detects if the character has an othercase. */
  3097. unsigned int c;
  3098. #ifdef SUPPORT_UNICODE
  3099. if (common->utf || common->ucp)
  3100. {
  3101. if (common->utf)
  3102. {
  3103. GETCHAR(c, cc);
  3104. }
  3105. else
  3106. c = *cc;
  3107. if (c > 127)
  3108. return c != UCD_OTHERCASE(c);
  3109. return common->fcc[c] != c;
  3110. }
  3111. else
  3112. #endif
  3113. c = *cc;
  3114. return MAX_255(c) ? common->fcc[c] != c : FALSE;
  3115. }
  3116. static SLJIT_INLINE unsigned int char_othercase(compiler_common *common, unsigned int c)
  3117. {
  3118. /* Returns with the othercase. */
  3119. #ifdef SUPPORT_UNICODE
  3120. if ((common->utf || common->ucp) && c > 127)
  3121. return UCD_OTHERCASE(c);
  3122. #endif
  3123. return TABLE_GET(c, common->fcc, c);
  3124. }
  3125. static unsigned int char_get_othercase_bit(compiler_common *common, PCRE2_SPTR cc)
  3126. {
  3127. /* Detects if the character and its othercase has only 1 bit difference. */
  3128. unsigned int c, oc, bit;
  3129. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  3130. int n;
  3131. #endif
  3132. #ifdef SUPPORT_UNICODE
  3133. if (common->utf || common->ucp)
  3134. {
  3135. if (common->utf)
  3136. {
  3137. GETCHAR(c, cc);
  3138. }
  3139. else
  3140. c = *cc;
  3141. if (c <= 127)
  3142. oc = common->fcc[c];
  3143. else
  3144. oc = UCD_OTHERCASE(c);
  3145. }
  3146. else
  3147. {
  3148. c = *cc;
  3149. oc = TABLE_GET(c, common->fcc, c);
  3150. }
  3151. #else
  3152. c = *cc;
  3153. oc = TABLE_GET(c, common->fcc, c);
  3154. #endif
  3155. SLJIT_ASSERT(c != oc);
  3156. bit = c ^ oc;
  3157. /* Optimized for English alphabet. */
  3158. if (c <= 127 && bit == 0x20)
  3159. return (0 << 8) | 0x20;
  3160. /* Since c != oc, they must have at least 1 bit difference. */
  3161. if (!is_powerof2(bit))
  3162. return 0;
  3163. #if PCRE2_CODE_UNIT_WIDTH == 8
  3164. #ifdef SUPPORT_UNICODE
  3165. if (common->utf && c > 127)
  3166. {
  3167. n = GET_EXTRALEN(*cc);
  3168. while ((bit & 0x3f) == 0)
  3169. {
  3170. n--;
  3171. bit >>= 6;
  3172. }
  3173. return (n << 8) | bit;
  3174. }
  3175. #endif /* SUPPORT_UNICODE */
  3176. return (0 << 8) | bit;
  3177. #elif PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  3178. #ifdef SUPPORT_UNICODE
  3179. if (common->utf && c > 65535)
  3180. {
  3181. if (bit >= (1u << 10))
  3182. bit >>= 10;
  3183. else
  3184. return (bit < 256) ? ((2 << 8) | bit) : ((3 << 8) | (bit >> 8));
  3185. }
  3186. #endif /* SUPPORT_UNICODE */
  3187. return (bit < 256) ? ((0u << 8) | bit) : ((1u << 8) | (bit >> 8));
  3188. #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
  3189. }
  3190. static void check_partial(compiler_common *common, BOOL force)
  3191. {
  3192. /* Checks whether a partial matching is occurred. Does not modify registers. */
  3193. DEFINE_COMPILER;
  3194. struct sljit_jump *jump = NULL;
  3195. SLJIT_ASSERT(!force || common->mode != PCRE2_JIT_COMPLETE);
  3196. if (common->mode == PCRE2_JIT_COMPLETE)
  3197. return;
  3198. if (!force && !common->allow_empty_partial)
  3199. jump = CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
  3200. else if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
  3201. jump = CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1);
  3202. if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
  3203. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);
  3204. else
  3205. {
  3206. if (common->partialmatchlabel != NULL)
  3207. JUMPTO(SLJIT_JUMP, common->partialmatchlabel);
  3208. else
  3209. add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP));
  3210. }
  3211. if (jump != NULL)
  3212. JUMPHERE(jump);
  3213. }
  3214. static void check_str_end(compiler_common *common, jump_list **end_reached)
  3215. {
  3216. /* Does not affect registers. Usually used in a tight spot. */
  3217. DEFINE_COMPILER;
  3218. struct sljit_jump *jump;
  3219. if (common->mode == PCRE2_JIT_COMPLETE)
  3220. {
  3221. add_jump(compiler, end_reached, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
  3222. return;
  3223. }
  3224. jump = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
  3225. if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
  3226. {
  3227. add_jump(compiler, end_reached, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));
  3228. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);
  3229. add_jump(compiler, end_reached, JUMP(SLJIT_JUMP));
  3230. }
  3231. else
  3232. {
  3233. add_jump(compiler, end_reached, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));
  3234. if (common->partialmatchlabel != NULL)
  3235. JUMPTO(SLJIT_JUMP, common->partialmatchlabel);
  3236. else
  3237. add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP));
  3238. }
  3239. JUMPHERE(jump);
  3240. }
  3241. static void detect_partial_match(compiler_common *common, jump_list **backtracks)
  3242. {
  3243. DEFINE_COMPILER;
  3244. struct sljit_jump *jump;
  3245. if (common->mode == PCRE2_JIT_COMPLETE)
  3246. {
  3247. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
  3248. return;
  3249. }
  3250. /* Partial matching mode. */
  3251. jump = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
  3252. if (!common->allow_empty_partial)
  3253. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));
  3254. else if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
  3255. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1));
  3256. if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
  3257. {
  3258. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);
  3259. add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
  3260. }
  3261. else
  3262. {
  3263. if (common->partialmatchlabel != NULL)
  3264. JUMPTO(SLJIT_JUMP, common->partialmatchlabel);
  3265. else
  3266. add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP));
  3267. }
  3268. JUMPHERE(jump);
  3269. }
  3270. static void process_partial_match(compiler_common *common)
  3271. {
  3272. DEFINE_COMPILER;
  3273. struct sljit_jump *jump;
  3274. /* Partial matching mode. */
  3275. if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
  3276. {
  3277. jump = CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
  3278. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);
  3279. JUMPHERE(jump);
  3280. }
  3281. else if (common->mode == PCRE2_JIT_PARTIAL_HARD)
  3282. {
  3283. if (common->partialmatchlabel != NULL)
  3284. CMPTO(SLJIT_LESS, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0, common->partialmatchlabel);
  3285. else
  3286. add_jump(compiler, &common->partialmatch, CMP(SLJIT_LESS, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));
  3287. }
  3288. }
  3289. static void detect_partial_match_to(compiler_common *common, struct sljit_label *label)
  3290. {
  3291. DEFINE_COMPILER;
  3292. CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, label);
  3293. process_partial_match(common);
  3294. }
  3295. static void peek_char(compiler_common *common, sljit_u32 max, sljit_s32 dst, sljit_sw dstw, jump_list **backtracks)
  3296. {
  3297. /* Reads the character into TMP1, keeps STR_PTR.
  3298. Does not check STR_END. TMP2, dst, RETURN_ADDR Destroyed. */
  3299. DEFINE_COMPILER;
  3300. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  3301. struct sljit_jump *jump;
  3302. #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */
  3303. SLJIT_UNUSED_ARG(max);
  3304. SLJIT_UNUSED_ARG(dst);
  3305. SLJIT_UNUSED_ARG(dstw);
  3306. SLJIT_UNUSED_ARG(backtracks);
  3307. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  3308. #ifdef SUPPORT_UNICODE
  3309. #if PCRE2_CODE_UNIT_WIDTH == 8
  3310. if (common->utf)
  3311. {
  3312. if (max < 128) return;
  3313. jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x80);
  3314. OP1(SLJIT_MOV, dst, dstw, STR_PTR, 0);
  3315. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3316. add_jump(compiler, common->invalid_utf ? &common->utfreadchar_invalid : &common->utfreadchar, JUMP(SLJIT_FAST_CALL));
  3317. OP1(SLJIT_MOV, STR_PTR, 0, dst, dstw);
  3318. if (backtracks && common->invalid_utf)
  3319. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR));
  3320. JUMPHERE(jump);
  3321. }
  3322. #elif PCRE2_CODE_UNIT_WIDTH == 16
  3323. if (common->utf)
  3324. {
  3325. if (max < 0xd800) return;
  3326. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  3327. if (common->invalid_utf)
  3328. {
  3329. jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800);
  3330. OP1(SLJIT_MOV, dst, dstw, STR_PTR, 0);
  3331. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3332. add_jump(compiler, &common->utfreadchar_invalid, JUMP(SLJIT_FAST_CALL));
  3333. OP1(SLJIT_MOV, STR_PTR, 0, dst, dstw);
  3334. if (backtracks && common->invalid_utf)
  3335. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR));
  3336. }
  3337. else
  3338. {
  3339. /* TMP2 contains the high surrogate. */
  3340. jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800);
  3341. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  3342. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10);
  3343. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000 - 0xdc00);
  3344. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  3345. }
  3346. JUMPHERE(jump);
  3347. }
  3348. #elif PCRE2_CODE_UNIT_WIDTH == 32
  3349. if (common->invalid_utf)
  3350. {
  3351. if (max < 0xd800) return;
  3352. if (backtracks != NULL)
  3353. {
  3354. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  3355. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000));
  3356. add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800));
  3357. }
  3358. else
  3359. {
  3360. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  3361. OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000);
  3362. CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
  3363. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800);
  3364. CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
  3365. }
  3366. }
  3367. #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
  3368. #endif /* SUPPORT_UNICODE */
  3369. }
  3370. static void peek_char_back(compiler_common *common, sljit_u32 max, jump_list **backtracks)
  3371. {
  3372. /* Reads one character back without moving STR_PTR. TMP2 must
  3373. contain the start of the subject buffer. Affects TMP1, TMP2, and RETURN_ADDR. */
  3374. DEFINE_COMPILER;
  3375. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  3376. struct sljit_jump *jump;
  3377. #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */
  3378. SLJIT_UNUSED_ARG(max);
  3379. SLJIT_UNUSED_ARG(backtracks);
  3380. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
  3381. #ifdef SUPPORT_UNICODE
  3382. #if PCRE2_CODE_UNIT_WIDTH == 8
  3383. if (common->utf)
  3384. {
  3385. if (max < 128) return;
  3386. jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x80);
  3387. if (common->invalid_utf)
  3388. {
  3389. add_jump(compiler, &common->utfpeakcharback_invalid, JUMP(SLJIT_FAST_CALL));
  3390. if (backtracks != NULL)
  3391. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR));
  3392. }
  3393. else
  3394. add_jump(compiler, &common->utfpeakcharback, JUMP(SLJIT_FAST_CALL));
  3395. JUMPHERE(jump);
  3396. }
  3397. #elif PCRE2_CODE_UNIT_WIDTH == 16
  3398. if (common->utf)
  3399. {
  3400. if (max < 0xd800) return;
  3401. if (common->invalid_utf)
  3402. {
  3403. jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800);
  3404. add_jump(compiler, &common->utfpeakcharback_invalid, JUMP(SLJIT_FAST_CALL));
  3405. if (backtracks != NULL)
  3406. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR));
  3407. }
  3408. else
  3409. {
  3410. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xdc00);
  3411. jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xe000 - 0xdc00);
  3412. /* TMP2 contains the low surrogate. */
  3413. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));
  3414. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x10000);
  3415. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  3416. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 10);
  3417. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  3418. }
  3419. JUMPHERE(jump);
  3420. }
  3421. #elif PCRE2_CODE_UNIT_WIDTH == 32
  3422. if (common->invalid_utf)
  3423. {
  3424. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  3425. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000));
  3426. add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800));
  3427. }
  3428. #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
  3429. #endif /* SUPPORT_UNICODE */
  3430. }
  3431. #define READ_CHAR_UPDATE_STR_PTR 0x1
  3432. #define READ_CHAR_UTF8_NEWLINE 0x2
  3433. #define READ_CHAR_NEWLINE (READ_CHAR_UPDATE_STR_PTR | READ_CHAR_UTF8_NEWLINE)
  3434. #define READ_CHAR_VALID_UTF 0x4
  3435. static void read_char(compiler_common *common, sljit_u32 min, sljit_u32 max,
  3436. jump_list **backtracks, sljit_u32 options)
  3437. {
  3438. /* Reads the precise value of a character into TMP1, if the character is
  3439. between min and max (c >= min && c <= max). Otherwise it returns with a value
  3440. outside the range. Does not check STR_END. */
  3441. DEFINE_COMPILER;
  3442. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  3443. struct sljit_jump *jump;
  3444. #endif
  3445. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  3446. struct sljit_jump *jump2;
  3447. #endif
  3448. SLJIT_UNUSED_ARG(min);
  3449. SLJIT_UNUSED_ARG(max);
  3450. SLJIT_UNUSED_ARG(backtracks);
  3451. SLJIT_UNUSED_ARG(options);
  3452. SLJIT_ASSERT(min <= max);
  3453. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  3454. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3455. #ifdef SUPPORT_UNICODE
  3456. #if PCRE2_CODE_UNIT_WIDTH == 8
  3457. if (common->utf)
  3458. {
  3459. if (max < 128 && !(options & READ_CHAR_UPDATE_STR_PTR)) return;
  3460. if (common->invalid_utf && !(options & READ_CHAR_VALID_UTF))
  3461. {
  3462. jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x80);
  3463. if (options & READ_CHAR_UTF8_NEWLINE)
  3464. add_jump(compiler, &common->utfreadnewline_invalid, JUMP(SLJIT_FAST_CALL));
  3465. else
  3466. add_jump(compiler, &common->utfreadchar_invalid, JUMP(SLJIT_FAST_CALL));
  3467. if (backtracks != NULL)
  3468. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR));
  3469. JUMPHERE(jump);
  3470. return;
  3471. }
  3472. jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);
  3473. if (min >= 0x10000)
  3474. {
  3475. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xf0);
  3476. if (options & READ_CHAR_UPDATE_STR_PTR)
  3477. OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
  3478. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  3479. jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0x7);
  3480. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);
  3481. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);
  3482. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  3483. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  3484. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  3485. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);
  3486. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  3487. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2));
  3488. if (!(options & READ_CHAR_UPDATE_STR_PTR))
  3489. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3));
  3490. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  3491. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);
  3492. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  3493. JUMPHERE(jump2);
  3494. if (options & READ_CHAR_UPDATE_STR_PTR)
  3495. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0);
  3496. }
  3497. else if (min >= 0x800 && max <= 0xffff)
  3498. {
  3499. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xe0);
  3500. if (options & READ_CHAR_UPDATE_STR_PTR)
  3501. OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
  3502. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  3503. jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xf);
  3504. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);
  3505. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);
  3506. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  3507. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  3508. if (!(options & READ_CHAR_UPDATE_STR_PTR))
  3509. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  3510. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  3511. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);
  3512. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  3513. JUMPHERE(jump2);
  3514. if (options & READ_CHAR_UPDATE_STR_PTR)
  3515. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0);
  3516. }
  3517. else if (max >= 0x800)
  3518. {
  3519. add_jump(compiler, &common->utfreadchar, JUMP(SLJIT_FAST_CALL));
  3520. }
  3521. else if (max < 128)
  3522. {
  3523. OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
  3524. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
  3525. }
  3526. else
  3527. {
  3528. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  3529. if (!(options & READ_CHAR_UPDATE_STR_PTR))
  3530. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3531. else
  3532. OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
  3533. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);
  3534. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  3535. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);
  3536. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  3537. if (options & READ_CHAR_UPDATE_STR_PTR)
  3538. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0);
  3539. }
  3540. JUMPHERE(jump);
  3541. }
  3542. #elif PCRE2_CODE_UNIT_WIDTH == 16
  3543. if (common->utf)
  3544. {
  3545. if (max < 0xd800 && !(options & READ_CHAR_UPDATE_STR_PTR)) return;
  3546. if (common->invalid_utf && !(options & READ_CHAR_VALID_UTF))
  3547. {
  3548. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  3549. jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800);
  3550. if (options & READ_CHAR_UTF8_NEWLINE)
  3551. add_jump(compiler, &common->utfreadnewline_invalid, JUMP(SLJIT_FAST_CALL));
  3552. else
  3553. add_jump(compiler, &common->utfreadchar_invalid, JUMP(SLJIT_FAST_CALL));
  3554. if (backtracks != NULL)
  3555. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR));
  3556. JUMPHERE(jump);
  3557. return;
  3558. }
  3559. if (max >= 0x10000)
  3560. {
  3561. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  3562. jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800);
  3563. /* TMP2 contains the high surrogate. */
  3564. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  3565. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10);
  3566. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3567. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000 - 0xdc00);
  3568. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  3569. JUMPHERE(jump);
  3570. return;
  3571. }
  3572. /* Skip low surrogate if necessary. */
  3573. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  3574. if (sljit_has_cpu_feature(SLJIT_HAS_CMOV) && !HAS_VIRTUAL_REGISTERS)
  3575. {
  3576. if (options & READ_CHAR_UPDATE_STR_PTR)
  3577. OP2(SLJIT_ADD, RETURN_ADDR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3578. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP2, 0, SLJIT_IMM, 0x400);
  3579. if (options & READ_CHAR_UPDATE_STR_PTR)
  3580. CMOV(SLJIT_LESS, STR_PTR, RETURN_ADDR, 0);
  3581. if (max >= 0xd800)
  3582. CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, 0x10000);
  3583. }
  3584. else
  3585. {
  3586. jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x400);
  3587. if (options & READ_CHAR_UPDATE_STR_PTR)
  3588. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3589. if (max >= 0xd800)
  3590. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0x10000);
  3591. JUMPHERE(jump);
  3592. }
  3593. }
  3594. #elif PCRE2_CODE_UNIT_WIDTH == 32
  3595. if (common->invalid_utf)
  3596. {
  3597. if (backtracks != NULL)
  3598. {
  3599. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  3600. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000));
  3601. add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800));
  3602. }
  3603. else
  3604. {
  3605. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  3606. OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000);
  3607. CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
  3608. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800);
  3609. CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
  3610. }
  3611. }
  3612. #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
  3613. #endif /* SUPPORT_UNICODE */
  3614. }
  3615. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  3616. static BOOL is_char7_bitset(const sljit_u8 *bitset, BOOL nclass)
  3617. {
  3618. /* Tells whether the character codes below 128 are enough
  3619. to determine a match. */
  3620. const sljit_u8 value = nclass ? 0xff : 0;
  3621. const sljit_u8 *end = bitset + 32;
  3622. bitset += 16;
  3623. do
  3624. {
  3625. if (*bitset++ != value)
  3626. return FALSE;
  3627. }
  3628. while (bitset < end);
  3629. return TRUE;
  3630. }
  3631. static void read_char7_type(compiler_common *common, jump_list **backtracks, BOOL negated)
  3632. {
  3633. /* Reads the precise character type of a character into TMP1, if the character
  3634. is less than 128. Otherwise it returns with zero. Does not check STR_END. The
  3635. full_read argument tells whether characters above max are accepted or not. */
  3636. DEFINE_COMPILER;
  3637. struct sljit_jump *jump;
  3638. SLJIT_ASSERT(common->utf);
  3639. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0);
  3640. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3641. /* All values > 127 are zero in ctypes. */
  3642. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);
  3643. if (negated)
  3644. {
  3645. jump = CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0x80);
  3646. if (common->invalid_utf)
  3647. {
  3648. add_jump(compiler, &common->utfreadchar_invalid, JUMP(SLJIT_FAST_CALL));
  3649. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR));
  3650. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
  3651. }
  3652. else
  3653. {
  3654. OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(utf8_table4) - 0xc0);
  3655. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
  3656. }
  3657. JUMPHERE(jump);
  3658. }
  3659. }
  3660. #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 */
  3661. static void read_char8_type(compiler_common *common, jump_list **backtracks, BOOL negated)
  3662. {
  3663. /* Reads the character type into TMP1, updates STR_PTR. Does not check STR_END. */
  3664. DEFINE_COMPILER;
  3665. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
  3666. struct sljit_jump *jump;
  3667. #endif
  3668. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  3669. struct sljit_jump *jump2;
  3670. #endif
  3671. SLJIT_UNUSED_ARG(backtracks);
  3672. SLJIT_UNUSED_ARG(negated);
  3673. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0);
  3674. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3675. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  3676. if (common->utf)
  3677. {
  3678. /* The result of this read may be unused, but saves an "else" part. */
  3679. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);
  3680. jump = CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0x80);
  3681. if (!negated)
  3682. {
  3683. if (common->invalid_utf)
  3684. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
  3685. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  3686. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3687. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2);
  3688. if (common->invalid_utf)
  3689. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xe0 - 0xc2));
  3690. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);
  3691. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
  3692. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x80);
  3693. if (common->invalid_utf)
  3694. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40));
  3695. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
  3696. jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 255);
  3697. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);
  3698. JUMPHERE(jump2);
  3699. }
  3700. else if (common->invalid_utf)
  3701. {
  3702. add_jump(compiler, &common->utfreadchar_invalid, JUMP(SLJIT_FAST_CALL));
  3703. OP1(SLJIT_MOV, TMP2, 0, TMP1, 0);
  3704. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR));
  3705. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
  3706. jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 255);
  3707. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);
  3708. JUMPHERE(jump2);
  3709. }
  3710. else
  3711. add_jump(compiler, &common->utfreadtype8, JUMP(SLJIT_FAST_CALL));
  3712. JUMPHERE(jump);
  3713. return;
  3714. }
  3715. #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 */
  3716. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 32
  3717. if (common->invalid_utf && negated)
  3718. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x110000));
  3719. #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 32 */
  3720. #if PCRE2_CODE_UNIT_WIDTH != 8
  3721. /* The ctypes array contains only 256 values. */
  3722. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
  3723. jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 255);
  3724. #endif /* PCRE2_CODE_UNIT_WIDTH != 8 */
  3725. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);
  3726. #if PCRE2_CODE_UNIT_WIDTH != 8
  3727. JUMPHERE(jump);
  3728. #endif /* PCRE2_CODE_UNIT_WIDTH != 8 */
  3729. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16
  3730. if (common->utf && negated)
  3731. {
  3732. /* Skip low surrogate if necessary. */
  3733. if (!common->invalid_utf)
  3734. {
  3735. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xd800);
  3736. if (sljit_has_cpu_feature(SLJIT_HAS_CMOV) && !HAS_VIRTUAL_REGISTERS)
  3737. {
  3738. OP2(SLJIT_ADD, RETURN_ADDR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3739. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP2, 0, SLJIT_IMM, 0x400);
  3740. CMOV(SLJIT_LESS, STR_PTR, RETURN_ADDR, 0);
  3741. }
  3742. else
  3743. {
  3744. jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x400);
  3745. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3746. JUMPHERE(jump);
  3747. }
  3748. return;
  3749. }
  3750. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xd800);
  3751. jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800);
  3752. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x400));
  3753. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
  3754. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  3755. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3756. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xdc00);
  3757. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x400));
  3758. JUMPHERE(jump);
  3759. return;
  3760. }
  3761. #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16 */
  3762. }
  3763. static void move_back(compiler_common *common, jump_list **backtracks, BOOL must_be_valid)
  3764. {
  3765. /* Goes one character back. Affects STR_PTR and TMP1. If must_be_valid is TRUE,
  3766. TMP2 is not used. Otherwise TMP2 must contain the start of the subject buffer,
  3767. and it is destroyed. Does not modify STR_PTR for invalid character sequences. */
  3768. DEFINE_COMPILER;
  3769. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  3770. struct sljit_jump *jump;
  3771. #endif
  3772. #ifdef SUPPORT_UNICODE
  3773. #if PCRE2_CODE_UNIT_WIDTH == 8
  3774. struct sljit_label *label;
  3775. if (common->utf)
  3776. {
  3777. if (!must_be_valid && common->invalid_utf)
  3778. {
  3779. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1));
  3780. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3781. jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x80);
  3782. add_jump(compiler, &common->utfmoveback_invalid, JUMP(SLJIT_FAST_CALL));
  3783. if (backtracks != NULL)
  3784. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0));
  3785. JUMPHERE(jump);
  3786. return;
  3787. }
  3788. label = LABEL();
  3789. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1));
  3790. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3791. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);
  3792. CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, label);
  3793. return;
  3794. }
  3795. #elif PCRE2_CODE_UNIT_WIDTH == 16
  3796. if (common->utf)
  3797. {
  3798. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1));
  3799. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3800. if (!must_be_valid && common->invalid_utf)
  3801. {
  3802. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  3803. jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xe000 - 0xd800);
  3804. add_jump(compiler, &common->utfmoveback_invalid, JUMP(SLJIT_FAST_CALL));
  3805. if (backtracks != NULL)
  3806. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0));
  3807. JUMPHERE(jump);
  3808. return;
  3809. }
  3810. /* Skip low surrogate if necessary. */
  3811. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);
  3812. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0xdc00);
  3813. OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);
  3814. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);
  3815. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
  3816. return;
  3817. }
  3818. #elif PCRE2_CODE_UNIT_WIDTH == 32
  3819. if (common->invalid_utf && !must_be_valid)
  3820. {
  3821. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1));
  3822. if (backtracks != NULL)
  3823. {
  3824. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000));
  3825. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3826. return;
  3827. }
  3828. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x110000);
  3829. OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_LESS);
  3830. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);
  3831. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
  3832. return;
  3833. }
  3834. #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
  3835. #endif /* SUPPORT_UNICODE */
  3836. SLJIT_UNUSED_ARG(backtracks);
  3837. SLJIT_UNUSED_ARG(must_be_valid);
  3838. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3839. }
  3840. static void check_newlinechar(compiler_common *common, int nltype, jump_list **backtracks, BOOL jumpifmatch)
  3841. {
  3842. /* Character comes in TMP1. Checks if it is a newline. TMP2 may be destroyed. */
  3843. DEFINE_COMPILER;
  3844. struct sljit_jump *jump;
  3845. if (nltype == NLTYPE_ANY)
  3846. {
  3847. add_jump(compiler, &common->anynewline, JUMP(SLJIT_FAST_CALL));
  3848. sljit_set_current_flags(compiler, SLJIT_SET_Z);
  3849. add_jump(compiler, backtracks, JUMP(jumpifmatch ? SLJIT_NOT_ZERO : SLJIT_ZERO));
  3850. }
  3851. else if (nltype == NLTYPE_ANYCRLF)
  3852. {
  3853. if (jumpifmatch)
  3854. {
  3855. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR));
  3856. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL));
  3857. }
  3858. else
  3859. {
  3860. jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR);
  3861. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL));
  3862. JUMPHERE(jump);
  3863. }
  3864. }
  3865. else
  3866. {
  3867. SLJIT_ASSERT(nltype == NLTYPE_FIXED && common->newline < 256);
  3868. add_jump(compiler, backtracks, CMP(jumpifmatch ? SLJIT_EQUAL : SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline));
  3869. }
  3870. }
  3871. #ifdef SUPPORT_UNICODE
  3872. #if PCRE2_CODE_UNIT_WIDTH == 8
  3873. static void do_utfreadchar(compiler_common *common)
  3874. {
  3875. /* Fast decoding a UTF-8 character. TMP1 contains the first byte
  3876. of the character (>= 0xc0). Return char value in TMP1. */
  3877. DEFINE_COMPILER;
  3878. struct sljit_jump *jump;
  3879. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  3880. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  3881. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  3882. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);
  3883. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  3884. /* Searching for the first zero. */
  3885. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x800);
  3886. jump = JUMP(SLJIT_NOT_ZERO);
  3887. /* Two byte sequence. */
  3888. OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3000);
  3889. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3890. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  3891. JUMPHERE(jump);
  3892. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  3893. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  3894. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);
  3895. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  3896. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x10000);
  3897. jump = JUMP(SLJIT_NOT_ZERO);
  3898. /* Three byte sequence. */
  3899. OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0000);
  3900. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  3901. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  3902. /* Four byte sequence. */
  3903. JUMPHERE(jump);
  3904. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2));
  3905. OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xf0000);
  3906. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3));
  3907. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  3908. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);
  3909. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  3910. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  3911. }
  3912. static void do_utfreadtype8(compiler_common *common)
  3913. {
  3914. /* Fast decoding a UTF-8 character type. TMP2 contains the first byte
  3915. of the character (>= 0xc0). Return value in TMP1. */
  3916. DEFINE_COMPILER;
  3917. struct sljit_jump *jump;
  3918. struct sljit_jump *compare;
  3919. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  3920. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, 0x20);
  3921. jump = JUMP(SLJIT_NOT_ZERO);
  3922. /* Two byte sequence. */
  3923. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  3924. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  3925. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x1f);
  3926. /* The upper 5 bits are known at this point. */
  3927. compare = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0x3);
  3928. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);
  3929. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);
  3930. OP2(SLJIT_OR, TMP2, 0, TMP2, 0, TMP1, 0);
  3931. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);
  3932. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  3933. JUMPHERE(compare);
  3934. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
  3935. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  3936. /* We only have types for characters less than 256. */
  3937. JUMPHERE(jump);
  3938. OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(utf8_table4) - 0xc0);
  3939. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
  3940. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
  3941. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  3942. }
  3943. static void do_utfreadchar_invalid(compiler_common *common)
  3944. {
  3945. /* Slow decoding a UTF-8 character. TMP1 contains the first byte
  3946. of the character (>= 0xc0). Return char value in TMP1. STR_PTR is
  3947. undefined for invalid characters. */
  3948. DEFINE_COMPILER;
  3949. sljit_s32 i;
  3950. sljit_s32 has_cmov = sljit_has_cpu_feature(SLJIT_HAS_CMOV);
  3951. struct sljit_jump *jump;
  3952. struct sljit_jump *buffer_end_close;
  3953. struct sljit_label *three_byte_entry;
  3954. struct sljit_label *exit_invalid_label;
  3955. struct sljit_jump *exit_invalid[11];
  3956. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  3957. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc2);
  3958. /* Usually more than 3 characters remained in the subject buffer. */
  3959. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3));
  3960. /* Not a valid start of a multi-byte sequence, no more bytes read. */
  3961. exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xf5 - 0xc2);
  3962. buffer_end_close = CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0);
  3963. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-3));
  3964. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  3965. /* If TMP2 is in 0x80-0xbf range, TMP1 is also increased by (0x2 << 6). */
  3966. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  3967. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80);
  3968. exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
  3969. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x800);
  3970. jump = JUMP(SLJIT_NOT_ZERO);
  3971. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  3972. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  3973. JUMPHERE(jump);
  3974. /* Three-byte sequence. */
  3975. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));
  3976. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  3977. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80);
  3978. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  3979. if (has_cmov)
  3980. {
  3981. OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
  3982. CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, 0x20000);
  3983. exit_invalid[2] = NULL;
  3984. }
  3985. else
  3986. exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
  3987. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x10000);
  3988. jump = JUMP(SLJIT_NOT_ZERO);
  3989. three_byte_entry = LABEL();
  3990. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x2d800);
  3991. if (has_cmov)
  3992. {
  3993. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x800);
  3994. CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0xd800);
  3995. exit_invalid[3] = NULL;
  3996. }
  3997. else
  3998. exit_invalid[3] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x800);
  3999. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  4000. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4001. if (has_cmov)
  4002. {
  4003. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x800);
  4004. CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
  4005. exit_invalid[4] = NULL;
  4006. }
  4007. else
  4008. exit_invalid[4] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x800);
  4009. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4010. JUMPHERE(jump);
  4011. /* Four-byte sequence. */
  4012. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
  4013. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  4014. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80);
  4015. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  4016. if (has_cmov)
  4017. {
  4018. OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
  4019. CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, 0);
  4020. exit_invalid[5] = NULL;
  4021. }
  4022. else
  4023. exit_invalid[5] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
  4024. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc10000);
  4025. if (has_cmov)
  4026. {
  4027. OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x100000);
  4028. CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0x10000);
  4029. exit_invalid[6] = NULL;
  4030. }
  4031. else
  4032. exit_invalid[6] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x100000);
  4033. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000);
  4034. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4035. JUMPHERE(buffer_end_close);
  4036. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  4037. exit_invalid[7] = CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0);
  4038. /* Two-byte sequence. */
  4039. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
  4040. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  4041. /* If TMP2 is in 0x80-0xbf range, TMP1 is also increased by (0x2 << 6). */
  4042. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  4043. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80);
  4044. exit_invalid[8] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
  4045. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x800);
  4046. jump = JUMP(SLJIT_NOT_ZERO);
  4047. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4048. /* Three-byte sequence. */
  4049. JUMPHERE(jump);
  4050. exit_invalid[9] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  4051. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  4052. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  4053. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80);
  4054. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  4055. if (has_cmov)
  4056. {
  4057. OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
  4058. CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
  4059. exit_invalid[10] = NULL;
  4060. }
  4061. else
  4062. exit_invalid[10] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
  4063. /* One will be substracted from STR_PTR later. */
  4064. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  4065. /* Four byte sequences are not possible. */
  4066. CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x30000, three_byte_entry);
  4067. exit_invalid_label = LABEL();
  4068. for (i = 0; i < 11; i++)
  4069. sljit_set_label(exit_invalid[i], exit_invalid_label);
  4070. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
  4071. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4072. }
  4073. static void do_utfreadnewline_invalid(compiler_common *common)
  4074. {
  4075. /* Slow decoding a UTF-8 character, specialized for newlines.
  4076. TMP1 contains the first byte of the character (>= 0xc0). Return
  4077. char value in TMP1. */
  4078. DEFINE_COMPILER;
  4079. struct sljit_label *loop;
  4080. struct sljit_label *skip_start;
  4081. struct sljit_label *three_byte_exit;
  4082. struct sljit_jump *jump[5];
  4083. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  4084. if (common->nltype != NLTYPE_ANY)
  4085. {
  4086. SLJIT_ASSERT(common->nltype != NLTYPE_FIXED || common->newline < 128);
  4087. /* All newlines are ascii, just skip intermediate octets. */
  4088. jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  4089. loop = LABEL();
  4090. if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, TMP2, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)) == SLJIT_SUCCESS)
  4091. sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, TMP2, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  4092. else
  4093. {
  4094. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  4095. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4096. }
  4097. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc0);
  4098. CMPTO(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0x80, loop);
  4099. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4100. JUMPHERE(jump[0]);
  4101. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
  4102. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4103. return;
  4104. }
  4105. jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  4106. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  4107. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4108. jump[1] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xc2);
  4109. jump[2] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xe2);
  4110. skip_start = LABEL();
  4111. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc0);
  4112. jump[3] = CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0x80);
  4113. /* Skip intermediate octets. */
  4114. loop = LABEL();
  4115. jump[4] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  4116. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  4117. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4118. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc0);
  4119. CMPTO(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0x80, loop);
  4120. JUMPHERE(jump[3]);
  4121. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4122. three_byte_exit = LABEL();
  4123. JUMPHERE(jump[0]);
  4124. JUMPHERE(jump[4]);
  4125. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
  4126. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4127. /* Two byte long newline: 0x85. */
  4128. JUMPHERE(jump[1]);
  4129. CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0x85, skip_start);
  4130. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0x85);
  4131. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4132. /* Three byte long newlines: 0x2028 and 0x2029. */
  4133. JUMPHERE(jump[2]);
  4134. CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0x80, skip_start);
  4135. CMPTO(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0, three_byte_exit);
  4136. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  4137. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4138. OP2(SLJIT_SUB, TMP1, 0, TMP2, 0, SLJIT_IMM, 0x80);
  4139. CMPTO(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x40, skip_start);
  4140. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0x2000);
  4141. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  4142. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4143. }
  4144. static void do_utfmoveback_invalid(compiler_common *common)
  4145. {
  4146. /* Goes one character back. */
  4147. DEFINE_COMPILER;
  4148. sljit_s32 i;
  4149. struct sljit_jump *jump;
  4150. struct sljit_jump *buffer_start_close;
  4151. struct sljit_label *exit_ok_label;
  4152. struct sljit_label *exit_invalid_label;
  4153. struct sljit_jump *exit_invalid[7];
  4154. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  4155. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3));
  4156. exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xc0);
  4157. /* Two-byte sequence. */
  4158. buffer_start_close = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0);
  4159. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2));
  4160. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);
  4161. jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x20);
  4162. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1);
  4163. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  4164. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4165. /* Three-byte sequence. */
  4166. JUMPHERE(jump);
  4167. exit_invalid[1] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, -0x40);
  4168. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  4169. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0);
  4170. jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x10);
  4171. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1);
  4172. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4173. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4174. /* Four-byte sequence. */
  4175. JUMPHERE(jump);
  4176. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0 - 0x80);
  4177. exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x40);
  4178. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  4179. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xf0);
  4180. exit_invalid[3] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x05);
  4181. exit_ok_label = LABEL();
  4182. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1);
  4183. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4184. /* Two-byte sequence. */
  4185. JUMPHERE(buffer_start_close);
  4186. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  4187. exit_invalid[4] = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0);
  4188. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  4189. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);
  4190. CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x20, exit_ok_label);
  4191. /* Three-byte sequence. */
  4192. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4193. exit_invalid[5] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, -0x40);
  4194. exit_invalid[6] = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0);
  4195. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  4196. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0);
  4197. CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x10, exit_ok_label);
  4198. /* Four-byte sequences are not possible. */
  4199. exit_invalid_label = LABEL();
  4200. sljit_set_label(exit_invalid[5], exit_invalid_label);
  4201. sljit_set_label(exit_invalid[6], exit_invalid_label);
  4202. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
  4203. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3));
  4204. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4205. JUMPHERE(exit_invalid[4]);
  4206. /* -2 + 4 = 2 */
  4207. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  4208. exit_invalid_label = LABEL();
  4209. for (i = 0; i < 4; i++)
  4210. sljit_set_label(exit_invalid[i], exit_invalid_label);
  4211. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
  4212. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(4));
  4213. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4214. }
  4215. static void do_utfpeakcharback(compiler_common *common)
  4216. {
  4217. /* Peak a character back. Does not modify STR_PTR. */
  4218. DEFINE_COMPILER;
  4219. struct sljit_jump *jump[2];
  4220. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  4221. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));
  4222. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);
  4223. jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x20);
  4224. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-3));
  4225. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0);
  4226. jump[1] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x10);
  4227. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-4));
  4228. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0 - 0x80);
  4229. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf0);
  4230. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);
  4231. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  4232. JUMPHERE(jump[1]);
  4233. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));
  4234. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  4235. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80);
  4236. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  4237. JUMPHERE(jump[0]);
  4238. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
  4239. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
  4240. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80);
  4241. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  4242. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4243. }
  4244. static void do_utfpeakcharback_invalid(compiler_common *common)
  4245. {
  4246. /* Peak a character back. Does not modify STR_PTR. */
  4247. DEFINE_COMPILER;
  4248. sljit_s32 i;
  4249. sljit_s32 has_cmov = sljit_has_cpu_feature(SLJIT_HAS_CMOV);
  4250. struct sljit_jump *jump[2];
  4251. struct sljit_label *two_byte_entry;
  4252. struct sljit_label *three_byte_entry;
  4253. struct sljit_label *exit_invalid_label;
  4254. struct sljit_jump *exit_invalid[8];
  4255. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  4256. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(3));
  4257. exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xc0);
  4258. jump[0] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, STR_PTR, 0);
  4259. /* Two-byte sequence. */
  4260. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));
  4261. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2);
  4262. jump[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x1e);
  4263. two_byte_entry = LABEL();
  4264. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);
  4265. /* If TMP1 is in 0x80-0xbf range, TMP1 is also increased by (0x2 << 6). */
  4266. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  4267. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4268. JUMPHERE(jump[1]);
  4269. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2 - 0x80);
  4270. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x80);
  4271. exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
  4272. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);
  4273. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  4274. /* Three-byte sequence. */
  4275. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-3));
  4276. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xe0);
  4277. jump[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x10);
  4278. three_byte_entry = LABEL();
  4279. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 12);
  4280. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  4281. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  4282. if (has_cmov)
  4283. {
  4284. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x800);
  4285. CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, -0xd800);
  4286. exit_invalid[2] = NULL;
  4287. }
  4288. else
  4289. exit_invalid[2] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x800);
  4290. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  4291. if (has_cmov)
  4292. {
  4293. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x800);
  4294. CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
  4295. exit_invalid[3] = NULL;
  4296. }
  4297. else
  4298. exit_invalid[3] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x800);
  4299. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4300. JUMPHERE(jump[1]);
  4301. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xe0 - 0x80);
  4302. exit_invalid[4] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
  4303. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 12);
  4304. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  4305. /* Four-byte sequence. */
  4306. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-4));
  4307. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000);
  4308. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf0);
  4309. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 18);
  4310. /* ADD is used instead of OR because of the SUB 0x10000 above. */
  4311. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  4312. if (has_cmov)
  4313. {
  4314. OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x100000);
  4315. CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0x10000);
  4316. exit_invalid[5] = NULL;
  4317. }
  4318. else
  4319. exit_invalid[5] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x100000);
  4320. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000);
  4321. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4322. JUMPHERE(jump[0]);
  4323. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
  4324. jump[0] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, STR_PTR, 0);
  4325. /* Two-byte sequence. */
  4326. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));
  4327. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2);
  4328. CMPTO(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0x1e, two_byte_entry);
  4329. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2 - 0x80);
  4330. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x80);
  4331. exit_invalid[6] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
  4332. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);
  4333. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
  4334. /* Three-byte sequence. */
  4335. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-3));
  4336. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xe0);
  4337. CMPTO(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0x10, three_byte_entry);
  4338. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
  4339. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4340. JUMPHERE(jump[0]);
  4341. exit_invalid[7] = CMP(SLJIT_GREATER, TMP2, 0, STR_PTR, 0);
  4342. /* Two-byte sequence. */
  4343. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));
  4344. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2);
  4345. CMPTO(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0x1e, two_byte_entry);
  4346. exit_invalid_label = LABEL();
  4347. for (i = 0; i < 8; i++)
  4348. sljit_set_label(exit_invalid[i], exit_invalid_label);
  4349. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
  4350. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4351. }
  4352. #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
  4353. #if PCRE2_CODE_UNIT_WIDTH == 16
  4354. static void do_utfreadchar_invalid(compiler_common *common)
  4355. {
  4356. /* Slow decoding a UTF-16 character. TMP1 contains the first half
  4357. of the character (>= 0xd800). Return char value in TMP1. STR_PTR is
  4358. undefined for invalid characters. */
  4359. DEFINE_COMPILER;
  4360. struct sljit_jump *exit_invalid[3];
  4361. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  4362. /* TMP2 contains the high surrogate. */
  4363. exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00);
  4364. exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  4365. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  4366. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10);
  4367. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4368. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xdc00);
  4369. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x10000);
  4370. exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x400);
  4371. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  4372. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4373. JUMPHERE(exit_invalid[0]);
  4374. JUMPHERE(exit_invalid[1]);
  4375. JUMPHERE(exit_invalid[2]);
  4376. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
  4377. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4378. }
  4379. static void do_utfreadnewline_invalid(compiler_common *common)
  4380. {
  4381. /* Slow decoding a UTF-16 character, specialized for newlines.
  4382. TMP1 contains the first half of the character (>= 0xd800). Return
  4383. char value in TMP1. */
  4384. DEFINE_COMPILER;
  4385. struct sljit_jump *exit_invalid[2];
  4386. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  4387. /* TMP2 contains the high surrogate. */
  4388. exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  4389. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  4390. exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00);
  4391. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xdc00);
  4392. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP2, 0, SLJIT_IMM, 0x400);
  4393. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS);
  4394. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0x10000);
  4395. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCHAR_SHIFT);
  4396. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
  4397. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4398. JUMPHERE(exit_invalid[0]);
  4399. JUMPHERE(exit_invalid[1]);
  4400. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
  4401. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4402. }
  4403. static void do_utfmoveback_invalid(compiler_common *common)
  4404. {
  4405. /* Goes one character back. */
  4406. DEFINE_COMPILER;
  4407. struct sljit_jump *exit_invalid[3];
  4408. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  4409. exit_invalid[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x400);
  4410. exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, STR_PTR, 0);
  4411. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
  4412. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  4413. exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x400);
  4414. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4415. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1);
  4416. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4417. JUMPHERE(exit_invalid[0]);
  4418. JUMPHERE(exit_invalid[1]);
  4419. JUMPHERE(exit_invalid[2]);
  4420. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4421. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
  4422. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4423. }
  4424. static void do_utfpeakcharback_invalid(compiler_common *common)
  4425. {
  4426. /* Peak a character back. Does not modify STR_PTR. */
  4427. DEFINE_COMPILER;
  4428. struct sljit_jump *jump;
  4429. struct sljit_jump *exit_invalid[3];
  4430. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  4431. jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xe000);
  4432. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
  4433. exit_invalid[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xdc00);
  4434. exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, STR_PTR, 0);
  4435. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));
  4436. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000 - 0xdc00);
  4437. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xd800);
  4438. exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x400);
  4439. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10);
  4440. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  4441. JUMPHERE(jump);
  4442. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4443. JUMPHERE(exit_invalid[0]);
  4444. JUMPHERE(exit_invalid[1]);
  4445. JUMPHERE(exit_invalid[2]);
  4446. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
  4447. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4448. }
  4449. #endif /* PCRE2_CODE_UNIT_WIDTH == 16 */
  4450. /* UCD_BLOCK_SIZE must be 128 (see the assert below). */
  4451. #define UCD_BLOCK_MASK 127
  4452. #define UCD_BLOCK_SHIFT 7
  4453. static void do_getucd(compiler_common *common)
  4454. {
  4455. /* Search the UCD record for the character comes in TMP1.
  4456. Returns chartype in TMP1 and UCD offset in TMP2. */
  4457. DEFINE_COMPILER;
  4458. #if PCRE2_CODE_UNIT_WIDTH == 32
  4459. struct sljit_jump *jump;
  4460. #endif
  4461. #if defined SLJIT_DEBUG && SLJIT_DEBUG
  4462. /* dummy_ucd_record */
  4463. const ucd_record *record = GET_UCD(UNASSIGNED_UTF_CHAR);
  4464. SLJIT_ASSERT(record->script == ucp_Unknown && record->chartype == ucp_Cn && record->gbprop == ucp_gbOther);
  4465. SLJIT_ASSERT(record->caseset == 0 && record->other_case == 0);
  4466. #endif
  4467. SLJIT_ASSERT(UCD_BLOCK_SIZE == 128 && sizeof(ucd_record) == 12);
  4468. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  4469. #if PCRE2_CODE_UNIT_WIDTH == 32
  4470. if (!common->utf)
  4471. {
  4472. jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, MAX_UTF_CODE_POINT + 1);
  4473. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, UNASSIGNED_UTF_CHAR);
  4474. JUMPHERE(jump);
  4475. }
  4476. #endif
  4477. OP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);
  4478. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 1);
  4479. OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_stage1));
  4480. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_MASK);
  4481. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);
  4482. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  4483. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2));
  4484. OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1);
  4485. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4486. }
  4487. static void do_getucdtype(compiler_common *common)
  4488. {
  4489. /* Search the UCD record for the character comes in TMP1.
  4490. Returns chartype in TMP1 and UCD offset in TMP2. */
  4491. DEFINE_COMPILER;
  4492. #if PCRE2_CODE_UNIT_WIDTH == 32
  4493. struct sljit_jump *jump;
  4494. #endif
  4495. #if defined SLJIT_DEBUG && SLJIT_DEBUG
  4496. /* dummy_ucd_record */
  4497. const ucd_record *record = GET_UCD(UNASSIGNED_UTF_CHAR);
  4498. SLJIT_ASSERT(record->script == ucp_Unknown && record->chartype == ucp_Cn && record->gbprop == ucp_gbOther);
  4499. SLJIT_ASSERT(record->caseset == 0 && record->other_case == 0);
  4500. #endif
  4501. SLJIT_ASSERT(UCD_BLOCK_SIZE == 128 && sizeof(ucd_record) == 12);
  4502. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  4503. #if PCRE2_CODE_UNIT_WIDTH == 32
  4504. if (!common->utf)
  4505. {
  4506. jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, MAX_UTF_CODE_POINT + 1);
  4507. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, UNASSIGNED_UTF_CHAR);
  4508. JUMPHERE(jump);
  4509. }
  4510. #endif
  4511. OP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);
  4512. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 1);
  4513. OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_stage1));
  4514. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_MASK);
  4515. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);
  4516. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  4517. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2));
  4518. OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1);
  4519. /* TMP2 is multiplied by 12. Same as (TMP2 << 2) + ((TMP2 << 2) << 1). */
  4520. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
  4521. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 2);
  4522. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  4523. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 1);
  4524. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  4525. }
  4526. #endif /* SUPPORT_UNICODE */
  4527. static SLJIT_INLINE struct sljit_label *mainloop_entry(compiler_common *common)
  4528. {
  4529. DEFINE_COMPILER;
  4530. struct sljit_label *mainloop;
  4531. struct sljit_label *newlinelabel = NULL;
  4532. struct sljit_jump *start;
  4533. struct sljit_jump *end = NULL;
  4534. struct sljit_jump *end2 = NULL;
  4535. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  4536. struct sljit_label *loop;
  4537. struct sljit_jump *jump;
  4538. #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */
  4539. jump_list *newline = NULL;
  4540. sljit_u32 overall_options = common->re->overall_options;
  4541. BOOL hascrorlf = (common->re->flags & PCRE2_HASCRORLF) != 0;
  4542. BOOL newlinecheck = FALSE;
  4543. BOOL readuchar = FALSE;
  4544. if (!(hascrorlf || (overall_options & PCRE2_FIRSTLINE) != 0)
  4545. && (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF || common->newline > 255))
  4546. newlinecheck = TRUE;
  4547. SLJIT_ASSERT(common->abort_label == NULL);
  4548. if ((overall_options & PCRE2_FIRSTLINE) != 0)
  4549. {
  4550. /* Search for the end of the first line. */
  4551. SLJIT_ASSERT(common->match_end_ptr != 0);
  4552. OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);
  4553. if (common->nltype == NLTYPE_FIXED && common->newline > 255)
  4554. {
  4555. mainloop = LABEL();
  4556. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4557. end = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  4558. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
  4559. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  4560. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, mainloop);
  4561. CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff, mainloop);
  4562. JUMPHERE(end);
  4563. OP2(SLJIT_SUB, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4564. }
  4565. else
  4566. {
  4567. end = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  4568. mainloop = LABEL();
  4569. /* Continual stores does not cause data dependency. */
  4570. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0);
  4571. read_char(common, common->nlmin, common->nlmax, NULL, READ_CHAR_NEWLINE);
  4572. check_newlinechar(common, common->nltype, &newline, TRUE);
  4573. CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, mainloop);
  4574. JUMPHERE(end);
  4575. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0);
  4576. set_jumps(newline, LABEL());
  4577. }
  4578. OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
  4579. }
  4580. else if ((overall_options & PCRE2_USE_OFFSET_LIMIT) != 0)
  4581. {
  4582. /* Check whether offset limit is set and valid. */
  4583. SLJIT_ASSERT(common->match_end_ptr != 0);
  4584. if (HAS_VIRTUAL_REGISTERS)
  4585. {
  4586. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  4587. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, offset_limit));
  4588. }
  4589. else
  4590. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, offset_limit));
  4591. OP1(SLJIT_MOV, TMP2, 0, STR_END, 0);
  4592. end = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, (sljit_sw) PCRE2_UNSET);
  4593. if (HAS_VIRTUAL_REGISTERS)
  4594. OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
  4595. else
  4596. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
  4597. #if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  4598. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);
  4599. #endif /* PCRE2_CODE_UNIT_WIDTH == [16|32] */
  4600. if (HAS_VIRTUAL_REGISTERS)
  4601. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin));
  4602. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
  4603. end2 = CMP(SLJIT_LESS_EQUAL, TMP2, 0, STR_END, 0);
  4604. OP1(SLJIT_MOV, TMP2, 0, STR_END, 0);
  4605. JUMPHERE(end2);
  4606. OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_NOMATCH);
  4607. add_jump(compiler, &common->abort, CMP(SLJIT_LESS, TMP2, 0, STR_PTR, 0));
  4608. JUMPHERE(end);
  4609. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, TMP2, 0);
  4610. }
  4611. start = JUMP(SLJIT_JUMP);
  4612. if (newlinecheck)
  4613. {
  4614. newlinelabel = LABEL();
  4615. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4616. end = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  4617. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  4618. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, common->newline & 0xff);
  4619. OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);
  4620. #if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  4621. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);
  4622. #endif /* PCRE2_CODE_UNIT_WIDTH == [16|32] */
  4623. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
  4624. end2 = JUMP(SLJIT_JUMP);
  4625. }
  4626. mainloop = LABEL();
  4627. /* Increasing the STR_PTR here requires one less jump in the most common case. */
  4628. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  4629. if (common->utf && !common->invalid_utf) readuchar = TRUE;
  4630. #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */
  4631. if (newlinecheck) readuchar = TRUE;
  4632. if (readuchar)
  4633. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  4634. if (newlinecheck)
  4635. CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, newlinelabel);
  4636. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4637. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  4638. #if PCRE2_CODE_UNIT_WIDTH == 8
  4639. if (common->invalid_utf)
  4640. {
  4641. /* Skip continuation code units. */
  4642. loop = LABEL();
  4643. jump = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  4644. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  4645. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4646. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x80);
  4647. CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x40, loop);
  4648. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4649. JUMPHERE(jump);
  4650. }
  4651. else if (common->utf)
  4652. {
  4653. jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);
  4654. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
  4655. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
  4656. JUMPHERE(jump);
  4657. }
  4658. #elif PCRE2_CODE_UNIT_WIDTH == 16
  4659. if (common->invalid_utf)
  4660. {
  4661. /* Skip continuation code units. */
  4662. loop = LABEL();
  4663. jump = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  4664. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  4665. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4666. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xdc00);
  4667. CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x400, loop);
  4668. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4669. JUMPHERE(jump);
  4670. }
  4671. else if (common->utf)
  4672. {
  4673. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800);
  4674. if (sljit_has_cpu_feature(SLJIT_HAS_CMOV))
  4675. {
  4676. OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  4677. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x400);
  4678. CMOV(SLJIT_LESS, STR_PTR, TMP2, 0);
  4679. }
  4680. else
  4681. {
  4682. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x400);
  4683. OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_LESS);
  4684. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);
  4685. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
  4686. }
  4687. }
  4688. #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16] */
  4689. #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */
  4690. JUMPHERE(start);
  4691. if (newlinecheck)
  4692. {
  4693. JUMPHERE(end);
  4694. JUMPHERE(end2);
  4695. }
  4696. return mainloop;
  4697. }
  4698. static SLJIT_INLINE void add_prefix_char(PCRE2_UCHAR chr, fast_forward_char_data *chars, BOOL last)
  4699. {
  4700. sljit_u32 i, count = chars->count;
  4701. if (count == 255)
  4702. return;
  4703. if (count == 0)
  4704. {
  4705. chars->count = 1;
  4706. chars->chars[0] = chr;
  4707. if (last)
  4708. chars->last_count = 1;
  4709. return;
  4710. }
  4711. for (i = 0; i < count; i++)
  4712. if (chars->chars[i] == chr)
  4713. return;
  4714. if (count >= MAX_DIFF_CHARS)
  4715. {
  4716. chars->count = 255;
  4717. return;
  4718. }
  4719. chars->chars[count] = chr;
  4720. chars->count = count + 1;
  4721. if (last)
  4722. chars->last_count++;
  4723. }
  4724. static int scan_prefix(compiler_common *common, PCRE2_SPTR cc, fast_forward_char_data *chars, int max_chars, sljit_u32 *rec_count)
  4725. {
  4726. /* Recursive function, which scans prefix literals. */
  4727. BOOL last, any, class, caseless;
  4728. int len, repeat, len_save, consumed = 0;
  4729. sljit_u32 chr; /* Any unicode character. */
  4730. sljit_u8 *bytes, *bytes_end, byte;
  4731. PCRE2_SPTR alternative, cc_save, oc;
  4732. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  4733. PCRE2_UCHAR othercase[4];
  4734. #elif defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16
  4735. PCRE2_UCHAR othercase[2];
  4736. #else
  4737. PCRE2_UCHAR othercase[1];
  4738. #endif
  4739. repeat = 1;
  4740. while (TRUE)
  4741. {
  4742. if (*rec_count == 0)
  4743. return 0;
  4744. (*rec_count)--;
  4745. last = TRUE;
  4746. any = FALSE;
  4747. class = FALSE;
  4748. caseless = FALSE;
  4749. switch (*cc)
  4750. {
  4751. case OP_CHARI:
  4752. caseless = TRUE;
  4753. /* Fall through */
  4754. case OP_CHAR:
  4755. last = FALSE;
  4756. cc++;
  4757. break;
  4758. case OP_SOD:
  4759. case OP_SOM:
  4760. case OP_SET_SOM:
  4761. case OP_NOT_WORD_BOUNDARY:
  4762. case OP_WORD_BOUNDARY:
  4763. case OP_EODN:
  4764. case OP_EOD:
  4765. case OP_CIRC:
  4766. case OP_CIRCM:
  4767. case OP_DOLL:
  4768. case OP_DOLLM:
  4769. /* Zero width assertions. */
  4770. cc++;
  4771. continue;
  4772. case OP_ASSERT:
  4773. case OP_ASSERT_NOT:
  4774. case OP_ASSERTBACK:
  4775. case OP_ASSERTBACK_NOT:
  4776. case OP_ASSERT_NA:
  4777. case OP_ASSERTBACK_NA:
  4778. cc = bracketend(cc);
  4779. continue;
  4780. case OP_PLUSI:
  4781. case OP_MINPLUSI:
  4782. case OP_POSPLUSI:
  4783. caseless = TRUE;
  4784. /* Fall through */
  4785. case OP_PLUS:
  4786. case OP_MINPLUS:
  4787. case OP_POSPLUS:
  4788. cc++;
  4789. break;
  4790. case OP_EXACTI:
  4791. caseless = TRUE;
  4792. /* Fall through */
  4793. case OP_EXACT:
  4794. repeat = GET2(cc, 1);
  4795. last = FALSE;
  4796. cc += 1 + IMM2_SIZE;
  4797. break;
  4798. case OP_QUERYI:
  4799. case OP_MINQUERYI:
  4800. case OP_POSQUERYI:
  4801. caseless = TRUE;
  4802. /* Fall through */
  4803. case OP_QUERY:
  4804. case OP_MINQUERY:
  4805. case OP_POSQUERY:
  4806. len = 1;
  4807. cc++;
  4808. #ifdef SUPPORT_UNICODE
  4809. if (common->utf && HAS_EXTRALEN(*cc)) len += GET_EXTRALEN(*cc);
  4810. #endif
  4811. max_chars = scan_prefix(common, cc + len, chars, max_chars, rec_count);
  4812. if (max_chars == 0)
  4813. return consumed;
  4814. last = FALSE;
  4815. break;
  4816. case OP_KET:
  4817. cc += 1 + LINK_SIZE;
  4818. continue;
  4819. case OP_ALT:
  4820. cc += GET(cc, 1);
  4821. continue;
  4822. case OP_ONCE:
  4823. case OP_BRA:
  4824. case OP_BRAPOS:
  4825. case OP_CBRA:
  4826. case OP_CBRAPOS:
  4827. alternative = cc + GET(cc, 1);
  4828. while (*alternative == OP_ALT)
  4829. {
  4830. max_chars = scan_prefix(common, alternative + 1 + LINK_SIZE, chars, max_chars, rec_count);
  4831. if (max_chars == 0)
  4832. return consumed;
  4833. alternative += GET(alternative, 1);
  4834. }
  4835. if (*cc == OP_CBRA || *cc == OP_CBRAPOS)
  4836. cc += IMM2_SIZE;
  4837. cc += 1 + LINK_SIZE;
  4838. continue;
  4839. case OP_CLASS:
  4840. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  4841. if (common->utf && !is_char7_bitset((const sljit_u8 *)(cc + 1), FALSE))
  4842. return consumed;
  4843. #endif
  4844. class = TRUE;
  4845. break;
  4846. case OP_NCLASS:
  4847. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  4848. if (common->utf) return consumed;
  4849. #endif
  4850. class = TRUE;
  4851. break;
  4852. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
  4853. case OP_XCLASS:
  4854. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  4855. if (common->utf) return consumed;
  4856. #endif
  4857. any = TRUE;
  4858. cc += GET(cc, 1);
  4859. break;
  4860. #endif
  4861. case OP_DIGIT:
  4862. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  4863. if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_digit, FALSE))
  4864. return consumed;
  4865. #endif
  4866. any = TRUE;
  4867. cc++;
  4868. break;
  4869. case OP_WHITESPACE:
  4870. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  4871. if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_space, FALSE))
  4872. return consumed;
  4873. #endif
  4874. any = TRUE;
  4875. cc++;
  4876. break;
  4877. case OP_WORDCHAR:
  4878. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  4879. if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_word, FALSE))
  4880. return consumed;
  4881. #endif
  4882. any = TRUE;
  4883. cc++;
  4884. break;
  4885. case OP_NOT:
  4886. case OP_NOTI:
  4887. cc++;
  4888. /* Fall through. */
  4889. case OP_NOT_DIGIT:
  4890. case OP_NOT_WHITESPACE:
  4891. case OP_NOT_WORDCHAR:
  4892. case OP_ANY:
  4893. case OP_ALLANY:
  4894. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  4895. if (common->utf) return consumed;
  4896. #endif
  4897. any = TRUE;
  4898. cc++;
  4899. break;
  4900. #ifdef SUPPORT_UNICODE
  4901. case OP_NOTPROP:
  4902. case OP_PROP:
  4903. #if PCRE2_CODE_UNIT_WIDTH != 32
  4904. if (common->utf) return consumed;
  4905. #endif
  4906. any = TRUE;
  4907. cc += 1 + 2;
  4908. break;
  4909. #endif
  4910. case OP_TYPEEXACT:
  4911. repeat = GET2(cc, 1);
  4912. cc += 1 + IMM2_SIZE;
  4913. continue;
  4914. case OP_NOTEXACT:
  4915. case OP_NOTEXACTI:
  4916. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  4917. if (common->utf) return consumed;
  4918. #endif
  4919. any = TRUE;
  4920. repeat = GET2(cc, 1);
  4921. cc += 1 + IMM2_SIZE + 1;
  4922. break;
  4923. default:
  4924. return consumed;
  4925. }
  4926. if (any)
  4927. {
  4928. do
  4929. {
  4930. chars->count = 255;
  4931. consumed++;
  4932. if (--max_chars == 0)
  4933. return consumed;
  4934. chars++;
  4935. }
  4936. while (--repeat > 0);
  4937. repeat = 1;
  4938. continue;
  4939. }
  4940. if (class)
  4941. {
  4942. bytes = (sljit_u8*) (cc + 1);
  4943. cc += 1 + 32 / sizeof(PCRE2_UCHAR);
  4944. switch (*cc)
  4945. {
  4946. case OP_CRSTAR:
  4947. case OP_CRMINSTAR:
  4948. case OP_CRPOSSTAR:
  4949. case OP_CRQUERY:
  4950. case OP_CRMINQUERY:
  4951. case OP_CRPOSQUERY:
  4952. max_chars = scan_prefix(common, cc + 1, chars, max_chars, rec_count);
  4953. if (max_chars == 0)
  4954. return consumed;
  4955. break;
  4956. default:
  4957. case OP_CRPLUS:
  4958. case OP_CRMINPLUS:
  4959. case OP_CRPOSPLUS:
  4960. break;
  4961. case OP_CRRANGE:
  4962. case OP_CRMINRANGE:
  4963. case OP_CRPOSRANGE:
  4964. repeat = GET2(cc, 1);
  4965. if (repeat <= 0)
  4966. return consumed;
  4967. break;
  4968. }
  4969. do
  4970. {
  4971. if (bytes[31] & 0x80)
  4972. chars->count = 255;
  4973. else if (chars->count != 255)
  4974. {
  4975. bytes_end = bytes + 32;
  4976. chr = 0;
  4977. do
  4978. {
  4979. byte = *bytes++;
  4980. SLJIT_ASSERT((chr & 0x7) == 0);
  4981. if (byte == 0)
  4982. chr += 8;
  4983. else
  4984. {
  4985. do
  4986. {
  4987. if ((byte & 0x1) != 0)
  4988. add_prefix_char(chr, chars, TRUE);
  4989. byte >>= 1;
  4990. chr++;
  4991. }
  4992. while (byte != 0);
  4993. chr = (chr + 7) & ~7;
  4994. }
  4995. }
  4996. while (chars->count != 255 && bytes < bytes_end);
  4997. bytes = bytes_end - 32;
  4998. }
  4999. consumed++;
  5000. if (--max_chars == 0)
  5001. return consumed;
  5002. chars++;
  5003. }
  5004. while (--repeat > 0);
  5005. switch (*cc)
  5006. {
  5007. case OP_CRSTAR:
  5008. case OP_CRMINSTAR:
  5009. case OP_CRPOSSTAR:
  5010. return consumed;
  5011. case OP_CRQUERY:
  5012. case OP_CRMINQUERY:
  5013. case OP_CRPOSQUERY:
  5014. cc++;
  5015. break;
  5016. case OP_CRRANGE:
  5017. case OP_CRMINRANGE:
  5018. case OP_CRPOSRANGE:
  5019. if (GET2(cc, 1) != GET2(cc, 1 + IMM2_SIZE))
  5020. return consumed;
  5021. cc += 1 + 2 * IMM2_SIZE;
  5022. break;
  5023. }
  5024. repeat = 1;
  5025. continue;
  5026. }
  5027. len = 1;
  5028. #ifdef SUPPORT_UNICODE
  5029. if (common->utf && HAS_EXTRALEN(*cc)) len += GET_EXTRALEN(*cc);
  5030. #endif
  5031. if (caseless && char_has_othercase(common, cc))
  5032. {
  5033. #ifdef SUPPORT_UNICODE
  5034. if (common->utf)
  5035. {
  5036. GETCHAR(chr, cc);
  5037. if ((int)PRIV(ord2utf)(char_othercase(common, chr), othercase) != len)
  5038. return consumed;
  5039. }
  5040. else
  5041. #endif
  5042. {
  5043. chr = *cc;
  5044. #ifdef SUPPORT_UNICODE
  5045. if (common->ucp && chr > 127)
  5046. othercase[0] = UCD_OTHERCASE(chr);
  5047. else
  5048. #endif
  5049. othercase[0] = TABLE_GET(chr, common->fcc, chr);
  5050. }
  5051. }
  5052. else
  5053. {
  5054. caseless = FALSE;
  5055. othercase[0] = 0; /* Stops compiler warning - PH */
  5056. }
  5057. len_save = len;
  5058. cc_save = cc;
  5059. while (TRUE)
  5060. {
  5061. oc = othercase;
  5062. do
  5063. {
  5064. len--;
  5065. consumed++;
  5066. chr = *cc;
  5067. add_prefix_char(*cc, chars, len == 0);
  5068. if (caseless)
  5069. add_prefix_char(*oc, chars, len == 0);
  5070. if (--max_chars == 0)
  5071. return consumed;
  5072. chars++;
  5073. cc++;
  5074. oc++;
  5075. }
  5076. while (len > 0);
  5077. if (--repeat == 0)
  5078. break;
  5079. len = len_save;
  5080. cc = cc_save;
  5081. }
  5082. repeat = 1;
  5083. if (last)
  5084. return consumed;
  5085. }
  5086. }
  5087. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  5088. static void jumpto_if_not_utf_char_start(struct sljit_compiler *compiler, sljit_s32 reg, struct sljit_label *label)
  5089. {
  5090. #if PCRE2_CODE_UNIT_WIDTH == 8
  5091. OP2(SLJIT_AND, reg, 0, reg, 0, SLJIT_IMM, 0xc0);
  5092. CMPTO(SLJIT_EQUAL, reg, 0, SLJIT_IMM, 0x80, label);
  5093. #elif PCRE2_CODE_UNIT_WIDTH == 16
  5094. OP2(SLJIT_AND, reg, 0, reg, 0, SLJIT_IMM, 0xfc00);
  5095. CMPTO(SLJIT_EQUAL, reg, 0, SLJIT_IMM, 0xdc00, label);
  5096. #else
  5097. #error "Unknown code width"
  5098. #endif
  5099. }
  5100. #endif
  5101. #include "pcre2_jit_simd_inc.h"
  5102. #ifdef JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD
  5103. static BOOL check_fast_forward_char_pair_simd(compiler_common *common, fast_forward_char_data *chars, int max)
  5104. {
  5105. sljit_s32 i, j, max_i = 0, max_j = 0;
  5106. sljit_u32 max_pri = 0;
  5107. PCRE2_UCHAR a1, a2, a_pri, b1, b2, b_pri;
  5108. for (i = max - 1; i >= 1; i--)
  5109. {
  5110. if (chars[i].last_count > 2)
  5111. {
  5112. a1 = chars[i].chars[0];
  5113. a2 = chars[i].chars[1];
  5114. a_pri = chars[i].last_count;
  5115. j = i - max_fast_forward_char_pair_offset();
  5116. if (j < 0)
  5117. j = 0;
  5118. while (j < i)
  5119. {
  5120. b_pri = chars[j].last_count;
  5121. if (b_pri > 2 && a_pri + b_pri >= max_pri)
  5122. {
  5123. b1 = chars[j].chars[0];
  5124. b2 = chars[j].chars[1];
  5125. if (a1 != b1 && a1 != b2 && a2 != b1 && a2 != b2)
  5126. {
  5127. max_pri = a_pri + b_pri;
  5128. max_i = i;
  5129. max_j = j;
  5130. }
  5131. }
  5132. j++;
  5133. }
  5134. }
  5135. }
  5136. if (max_pri == 0)
  5137. return FALSE;
  5138. fast_forward_char_pair_simd(common, max_i, chars[max_i].chars[0], chars[max_i].chars[1], max_j, chars[max_j].chars[0], chars[max_j].chars[1]);
  5139. return TRUE;
  5140. }
  5141. #endif /* JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD */
  5142. static void fast_forward_first_char2(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset)
  5143. {
  5144. DEFINE_COMPILER;
  5145. struct sljit_label *start;
  5146. struct sljit_jump *match;
  5147. struct sljit_jump *partial_quit;
  5148. PCRE2_UCHAR mask;
  5149. BOOL has_match_end = (common->match_end_ptr != 0);
  5150. SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE || offset == 0);
  5151. if (has_match_end)
  5152. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
  5153. if (offset > 0)
  5154. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset));
  5155. if (has_match_end)
  5156. {
  5157. OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
  5158. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offset + 1));
  5159. OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_END, 0, TMP1, 0);
  5160. CMOV(SLJIT_GREATER, STR_END, TMP1, 0);
  5161. }
  5162. #ifdef JIT_HAS_FAST_FORWARD_CHAR_SIMD
  5163. if (JIT_HAS_FAST_FORWARD_CHAR_SIMD)
  5164. {
  5165. fast_forward_char_simd(common, char1, char2, offset);
  5166. if (offset > 0)
  5167. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset));
  5168. if (has_match_end)
  5169. OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
  5170. return;
  5171. }
  5172. #endif
  5173. start = LABEL();
  5174. partial_quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  5175. if (common->mode == PCRE2_JIT_COMPLETE)
  5176. add_jump(compiler, &common->failed_match, partial_quit);
  5177. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  5178. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5179. if (char1 == char2)
  5180. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, char1, start);
  5181. else
  5182. {
  5183. mask = char1 ^ char2;
  5184. if (is_powerof2(mask))
  5185. {
  5186. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, mask);
  5187. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, char1 | mask, start);
  5188. }
  5189. else
  5190. {
  5191. match = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, char1);
  5192. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, char2, start);
  5193. JUMPHERE(match);
  5194. }
  5195. }
  5196. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  5197. if (common->utf && offset > 0)
  5198. {
  5199. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-(offset + 1)));
  5200. jumpto_if_not_utf_char_start(compiler, TMP1, start);
  5201. }
  5202. #endif
  5203. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset + 1));
  5204. if (common->mode != PCRE2_JIT_COMPLETE)
  5205. JUMPHERE(partial_quit);
  5206. if (has_match_end)
  5207. OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
  5208. }
  5209. static SLJIT_INLINE BOOL fast_forward_first_n_chars(compiler_common *common)
  5210. {
  5211. DEFINE_COMPILER;
  5212. struct sljit_label *start;
  5213. struct sljit_jump *match;
  5214. fast_forward_char_data chars[MAX_N_CHARS];
  5215. sljit_s32 offset;
  5216. PCRE2_UCHAR mask;
  5217. PCRE2_UCHAR *char_set, *char_set_end;
  5218. int i, max, from;
  5219. int range_right = -1, range_len;
  5220. sljit_u8 *update_table = NULL;
  5221. BOOL in_range;
  5222. sljit_u32 rec_count;
  5223. for (i = 0; i < MAX_N_CHARS; i++)
  5224. {
  5225. chars[i].count = 0;
  5226. chars[i].last_count = 0;
  5227. }
  5228. rec_count = 10000;
  5229. max = scan_prefix(common, common->start, chars, MAX_N_CHARS, &rec_count);
  5230. if (max < 1)
  5231. return FALSE;
  5232. /* Convert last_count to priority. */
  5233. for (i = 0; i < max; i++)
  5234. {
  5235. SLJIT_ASSERT(chars[i].count > 0 && chars[i].last_count <= chars[i].count);
  5236. if (chars[i].count == 1)
  5237. {
  5238. chars[i].last_count = (chars[i].last_count == 1) ? 7 : 5;
  5239. /* Simplifies algorithms later. */
  5240. chars[i].chars[1] = chars[i].chars[0];
  5241. }
  5242. else if (chars[i].count == 2)
  5243. {
  5244. SLJIT_ASSERT(chars[i].chars[0] != chars[i].chars[1]);
  5245. if (is_powerof2(chars[i].chars[0] ^ chars[i].chars[1]))
  5246. chars[i].last_count = (chars[i].last_count == 2) ? 6 : 4;
  5247. else
  5248. chars[i].last_count = (chars[i].last_count == 2) ? 3 : 2;
  5249. }
  5250. else
  5251. chars[i].last_count = (chars[i].count == 255) ? 0 : 1;
  5252. }
  5253. #ifdef JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD
  5254. if (JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD && check_fast_forward_char_pair_simd(common, chars, max))
  5255. return TRUE;
  5256. #endif
  5257. in_range = FALSE;
  5258. /* Prevent compiler "uninitialized" warning */
  5259. from = 0;
  5260. range_len = 4 /* minimum length */ - 1;
  5261. for (i = 0; i <= max; i++)
  5262. {
  5263. if (in_range && (i - from) > range_len && (chars[i - 1].count < 255))
  5264. {
  5265. range_len = i - from;
  5266. range_right = i - 1;
  5267. }
  5268. if (i < max && chars[i].count < 255)
  5269. {
  5270. SLJIT_ASSERT(chars[i].count > 0);
  5271. if (!in_range)
  5272. {
  5273. in_range = TRUE;
  5274. from = i;
  5275. }
  5276. }
  5277. else
  5278. in_range = FALSE;
  5279. }
  5280. if (range_right >= 0)
  5281. {
  5282. update_table = (sljit_u8 *)allocate_read_only_data(common, 256);
  5283. if (update_table == NULL)
  5284. return TRUE;
  5285. memset(update_table, IN_UCHARS(range_len), 256);
  5286. for (i = 0; i < range_len; i++)
  5287. {
  5288. SLJIT_ASSERT(chars[range_right - i].count > 0 && chars[range_right - i].count < 255);
  5289. char_set = chars[range_right - i].chars;
  5290. char_set_end = char_set + chars[range_right - i].count;
  5291. do
  5292. {
  5293. if (update_table[(*char_set) & 0xff] > IN_UCHARS(i))
  5294. update_table[(*char_set) & 0xff] = IN_UCHARS(i);
  5295. char_set++;
  5296. }
  5297. while (char_set < char_set_end);
  5298. }
  5299. }
  5300. offset = -1;
  5301. /* Scan forward. */
  5302. for (i = 0; i < max; i++)
  5303. {
  5304. if (range_right == i)
  5305. continue;
  5306. if (offset == -1)
  5307. {
  5308. if (chars[i].last_count >= 2)
  5309. offset = i;
  5310. }
  5311. else if (chars[offset].last_count < chars[i].last_count)
  5312. offset = i;
  5313. }
  5314. SLJIT_ASSERT(offset == -1 || (chars[offset].count >= 1 && chars[offset].count <= 2));
  5315. if (range_right < 0)
  5316. {
  5317. if (offset < 0)
  5318. return FALSE;
  5319. /* Works regardless the value is 1 or 2. */
  5320. fast_forward_first_char2(common, chars[offset].chars[0], chars[offset].chars[1], offset);
  5321. return TRUE;
  5322. }
  5323. SLJIT_ASSERT(range_right != offset);
  5324. if (common->match_end_ptr != 0)
  5325. {
  5326. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
  5327. OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
  5328. OP2(SLJIT_SUB | SLJIT_SET_LESS, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));
  5329. add_jump(compiler, &common->failed_match, JUMP(SLJIT_LESS));
  5330. OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_END, 0, TMP1, 0);
  5331. CMOV(SLJIT_GREATER, STR_END, TMP1, 0);
  5332. }
  5333. else
  5334. {
  5335. OP2(SLJIT_SUB | SLJIT_SET_LESS, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));
  5336. add_jump(compiler, &common->failed_match, JUMP(SLJIT_LESS));
  5337. }
  5338. SLJIT_ASSERT(range_right >= 0);
  5339. if (!HAS_VIRTUAL_REGISTERS)
  5340. OP1(SLJIT_MOV, RETURN_ADDR, 0, SLJIT_IMM, (sljit_sw)update_table);
  5341. start = LABEL();
  5342. add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0));
  5343. #if PCRE2_CODE_UNIT_WIDTH == 8 || (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
  5344. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right));
  5345. #else
  5346. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right + 1) - 1);
  5347. #endif
  5348. if (!HAS_VIRTUAL_REGISTERS)
  5349. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(RETURN_ADDR, TMP1), 0);
  5350. else
  5351. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)update_table);
  5352. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
  5353. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, start);
  5354. if (offset >= 0)
  5355. {
  5356. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(offset));
  5357. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5358. if (chars[offset].count == 1)
  5359. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset].chars[0], start);
  5360. else
  5361. {
  5362. mask = chars[offset].chars[0] ^ chars[offset].chars[1];
  5363. if (is_powerof2(mask))
  5364. {
  5365. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, mask);
  5366. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset].chars[0] | mask, start);
  5367. }
  5368. else
  5369. {
  5370. match = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset].chars[0]);
  5371. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset].chars[1], start);
  5372. JUMPHERE(match);
  5373. }
  5374. }
  5375. }
  5376. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  5377. if (common->utf && offset != 0)
  5378. {
  5379. if (offset < 0)
  5380. {
  5381. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  5382. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5383. }
  5384. else
  5385. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
  5386. jumpto_if_not_utf_char_start(compiler, TMP1, start);
  5387. if (offset < 0)
  5388. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5389. }
  5390. #endif
  5391. if (offset >= 0)
  5392. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5393. if (common->match_end_ptr != 0)
  5394. OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
  5395. else
  5396. OP2(SLJIT_ADD, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));
  5397. return TRUE;
  5398. }
  5399. static SLJIT_INLINE void fast_forward_first_char(compiler_common *common)
  5400. {
  5401. PCRE2_UCHAR first_char = (PCRE2_UCHAR)(common->re->first_codeunit);
  5402. PCRE2_UCHAR oc;
  5403. oc = first_char;
  5404. if ((common->re->flags & PCRE2_FIRSTCASELESS) != 0)
  5405. {
  5406. oc = TABLE_GET(first_char, common->fcc, first_char);
  5407. #if defined SUPPORT_UNICODE
  5408. if (first_char > 127 && (common->utf || common->ucp))
  5409. oc = UCD_OTHERCASE(first_char);
  5410. #endif
  5411. }
  5412. fast_forward_first_char2(common, first_char, oc, 0);
  5413. }
  5414. static SLJIT_INLINE void fast_forward_newline(compiler_common *common)
  5415. {
  5416. DEFINE_COMPILER;
  5417. struct sljit_label *loop;
  5418. struct sljit_jump *lastchar = NULL;
  5419. struct sljit_jump *firstchar;
  5420. struct sljit_jump *quit = NULL;
  5421. struct sljit_jump *foundcr = NULL;
  5422. struct sljit_jump *notfoundnl;
  5423. jump_list *newline = NULL;
  5424. if (common->match_end_ptr != 0)
  5425. {
  5426. OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
  5427. OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
  5428. }
  5429. if (common->nltype == NLTYPE_FIXED && common->newline > 255)
  5430. {
  5431. #ifdef JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD
  5432. if (JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD && common->mode == PCRE2_JIT_COMPLETE)
  5433. {
  5434. if (HAS_VIRTUAL_REGISTERS)
  5435. {
  5436. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  5437. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
  5438. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
  5439. }
  5440. else
  5441. {
  5442. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str));
  5443. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
  5444. }
  5445. firstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);
  5446. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5447. OP2U(SLJIT_SUB | SLJIT_SET_Z, STR_PTR, 0, TMP1, 0);
  5448. OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_NOT_EQUAL);
  5449. #if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  5450. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);
  5451. #endif
  5452. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
  5453. fast_forward_char_pair_simd(common, 1, common->newline & 0xff, common->newline & 0xff, 0, (common->newline >> 8) & 0xff, (common->newline >> 8) & 0xff);
  5454. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  5455. }
  5456. else
  5457. #endif /* JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD */
  5458. {
  5459. lastchar = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  5460. if (HAS_VIRTUAL_REGISTERS)
  5461. {
  5462. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  5463. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
  5464. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
  5465. }
  5466. else
  5467. {
  5468. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str));
  5469. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
  5470. }
  5471. firstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);
  5472. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(2));
  5473. OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, STR_PTR, 0, TMP1, 0);
  5474. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER_EQUAL);
  5475. #if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  5476. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCHAR_SHIFT);
  5477. #endif
  5478. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
  5479. loop = LABEL();
  5480. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5481. quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  5482. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));
  5483. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
  5484. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, loop);
  5485. CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff, loop);
  5486. JUMPHERE(quit);
  5487. JUMPHERE(lastchar);
  5488. }
  5489. JUMPHERE(firstchar);
  5490. if (common->match_end_ptr != 0)
  5491. OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
  5492. return;
  5493. }
  5494. if (HAS_VIRTUAL_REGISTERS)
  5495. {
  5496. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  5497. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
  5498. }
  5499. else
  5500. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str));
  5501. /* Example: match /^/ to \r\n from offset 1. */
  5502. firstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);
  5503. if (common->nltype == NLTYPE_ANY)
  5504. move_back(common, NULL, FALSE);
  5505. else
  5506. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5507. loop = LABEL();
  5508. common->ff_newline_shortcut = loop;
  5509. #ifdef JIT_HAS_FAST_FORWARD_CHAR_SIMD
  5510. if (JIT_HAS_FAST_FORWARD_CHAR_SIMD && (common->nltype == NLTYPE_FIXED || common->nltype == NLTYPE_ANYCRLF))
  5511. {
  5512. if (common->nltype == NLTYPE_ANYCRLF)
  5513. {
  5514. fast_forward_char_simd(common, CHAR_CR, CHAR_LF, 0);
  5515. if (common->mode != PCRE2_JIT_COMPLETE)
  5516. lastchar = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  5517. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  5518. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5519. quit = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR);
  5520. }
  5521. else
  5522. {
  5523. fast_forward_char_simd(common, common->newline, common->newline, 0);
  5524. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5525. if (common->mode != PCRE2_JIT_COMPLETE)
  5526. {
  5527. OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
  5528. CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
  5529. }
  5530. }
  5531. }
  5532. else
  5533. #endif /* JIT_HAS_FAST_FORWARD_CHAR_SIMD */
  5534. {
  5535. read_char(common, common->nlmin, common->nlmax, NULL, READ_CHAR_NEWLINE);
  5536. lastchar = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  5537. if (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF)
  5538. foundcr = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR);
  5539. check_newlinechar(common, common->nltype, &newline, FALSE);
  5540. set_jumps(newline, loop);
  5541. }
  5542. if (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF)
  5543. {
  5544. if (quit == NULL)
  5545. {
  5546. quit = JUMP(SLJIT_JUMP);
  5547. JUMPHERE(foundcr);
  5548. }
  5549. notfoundnl = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  5550. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  5551. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, CHAR_NL);
  5552. OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);
  5553. #if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  5554. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);
  5555. #endif
  5556. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
  5557. JUMPHERE(notfoundnl);
  5558. JUMPHERE(quit);
  5559. }
  5560. if (lastchar)
  5561. JUMPHERE(lastchar);
  5562. JUMPHERE(firstchar);
  5563. if (common->match_end_ptr != 0)
  5564. OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
  5565. }
  5566. static BOOL optimize_class(compiler_common *common, const sljit_u8 *bits, BOOL nclass, BOOL invert, jump_list **backtracks);
  5567. static SLJIT_INLINE void fast_forward_start_bits(compiler_common *common)
  5568. {
  5569. DEFINE_COMPILER;
  5570. const sljit_u8 *start_bits = common->re->start_bitmap;
  5571. struct sljit_label *start;
  5572. struct sljit_jump *partial_quit;
  5573. #if PCRE2_CODE_UNIT_WIDTH != 8
  5574. struct sljit_jump *found = NULL;
  5575. #endif
  5576. jump_list *matches = NULL;
  5577. if (common->match_end_ptr != 0)
  5578. {
  5579. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
  5580. OP1(SLJIT_MOV, RETURN_ADDR, 0, STR_END, 0);
  5581. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
  5582. OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_END, 0, TMP1, 0);
  5583. CMOV(SLJIT_GREATER, STR_END, TMP1, 0);
  5584. }
  5585. start = LABEL();
  5586. partial_quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  5587. if (common->mode == PCRE2_JIT_COMPLETE)
  5588. add_jump(compiler, &common->failed_match, partial_quit);
  5589. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  5590. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5591. if (!optimize_class(common, start_bits, (start_bits[31] & 0x80) != 0, FALSE, &matches))
  5592. {
  5593. #if PCRE2_CODE_UNIT_WIDTH != 8
  5594. if ((start_bits[31] & 0x80) != 0)
  5595. found = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 255);
  5596. else
  5597. CMPTO(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 255, start);
  5598. #elif defined SUPPORT_UNICODE
  5599. if (common->utf && is_char7_bitset(start_bits, FALSE))
  5600. CMPTO(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 127, start);
  5601. #endif
  5602. OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7);
  5603. OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);
  5604. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)start_bits);
  5605. if (!HAS_VIRTUAL_REGISTERS)
  5606. {
  5607. OP2(SLJIT_SHL, TMP3, 0, SLJIT_IMM, 1, TMP2, 0);
  5608. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, TMP3, 0);
  5609. }
  5610. else
  5611. {
  5612. OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0);
  5613. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, TMP2, 0);
  5614. }
  5615. JUMPTO(SLJIT_ZERO, start);
  5616. }
  5617. else
  5618. set_jumps(matches, start);
  5619. #if PCRE2_CODE_UNIT_WIDTH != 8
  5620. if (found != NULL)
  5621. JUMPHERE(found);
  5622. #endif
  5623. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5624. if (common->mode != PCRE2_JIT_COMPLETE)
  5625. JUMPHERE(partial_quit);
  5626. if (common->match_end_ptr != 0)
  5627. OP1(SLJIT_MOV, STR_END, 0, RETURN_ADDR, 0);
  5628. }
  5629. static SLJIT_INLINE jump_list *search_requested_char(compiler_common *common, PCRE2_UCHAR req_char, BOOL caseless, BOOL has_firstchar)
  5630. {
  5631. DEFINE_COMPILER;
  5632. struct sljit_label *loop;
  5633. struct sljit_jump *toolong;
  5634. struct sljit_jump *already_found;
  5635. struct sljit_jump *found;
  5636. struct sljit_jump *found_oc = NULL;
  5637. jump_list *not_found = NULL;
  5638. sljit_u32 oc, bit;
  5639. SLJIT_ASSERT(common->req_char_ptr != 0);
  5640. OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(REQ_CU_MAX) * 100);
  5641. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr);
  5642. toolong = CMP(SLJIT_LESS, TMP2, 0, STR_END, 0);
  5643. already_found = CMP(SLJIT_LESS, STR_PTR, 0, TMP1, 0);
  5644. if (has_firstchar)
  5645. OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  5646. else
  5647. OP1(SLJIT_MOV, TMP1, 0, STR_PTR, 0);
  5648. oc = req_char;
  5649. if (caseless)
  5650. {
  5651. oc = TABLE_GET(req_char, common->fcc, req_char);
  5652. #if defined SUPPORT_UNICODE
  5653. if (req_char > 127 && (common->utf || common->ucp))
  5654. oc = UCD_OTHERCASE(req_char);
  5655. #endif
  5656. }
  5657. #ifdef JIT_HAS_FAST_REQUESTED_CHAR_SIMD
  5658. if (JIT_HAS_FAST_REQUESTED_CHAR_SIMD)
  5659. {
  5660. not_found = fast_requested_char_simd(common, req_char, oc);
  5661. }
  5662. else
  5663. #endif
  5664. {
  5665. loop = LABEL();
  5666. add_jump(compiler, &not_found, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0));
  5667. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(TMP1), 0);
  5668. if (req_char == oc)
  5669. found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char);
  5670. else
  5671. {
  5672. bit = req_char ^ oc;
  5673. if (is_powerof2(bit))
  5674. {
  5675. OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, bit);
  5676. found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char | bit);
  5677. }
  5678. else
  5679. {
  5680. found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char);
  5681. found_oc = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, oc);
  5682. }
  5683. }
  5684. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
  5685. JUMPTO(SLJIT_JUMP, loop);
  5686. JUMPHERE(found);
  5687. if (found_oc)
  5688. JUMPHERE(found_oc);
  5689. }
  5690. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr, TMP1, 0);
  5691. JUMPHERE(already_found);
  5692. JUMPHERE(toolong);
  5693. return not_found;
  5694. }
  5695. static void do_revertframes(compiler_common *common)
  5696. {
  5697. DEFINE_COMPILER;
  5698. struct sljit_jump *jump;
  5699. struct sljit_label *mainloop;
  5700. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  5701. GET_LOCAL_BASE(TMP1, 0, 0);
  5702. /* Drop frames until we reach STACK_TOP. */
  5703. mainloop = LABEL();
  5704. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), -sizeof(sljit_sw));
  5705. jump = CMP(SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0);
  5706. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
  5707. if (HAS_VIRTUAL_REGISTERS)
  5708. {
  5709. OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -(2 * sizeof(sljit_sw)));
  5710. OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), sizeof(sljit_sw), SLJIT_MEM1(STACK_TOP), -(3 * sizeof(sljit_sw)));
  5711. OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 3 * sizeof(sljit_sw));
  5712. }
  5713. else
  5714. {
  5715. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), -(2 * sizeof(sljit_sw)));
  5716. OP1(SLJIT_MOV, TMP3, 0, SLJIT_MEM1(STACK_TOP), -(3 * sizeof(sljit_sw)));
  5717. OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 3 * sizeof(sljit_sw));
  5718. OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, TMP1, 0);
  5719. GET_LOCAL_BASE(TMP1, 0, 0);
  5720. OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), sizeof(sljit_sw), TMP3, 0);
  5721. }
  5722. JUMPTO(SLJIT_JUMP, mainloop);
  5723. JUMPHERE(jump);
  5724. jump = CMP(SLJIT_NOT_ZERO /* SIG_LESS */, TMP2, 0, SLJIT_IMM, 0);
  5725. /* End of reverting values. */
  5726. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  5727. JUMPHERE(jump);
  5728. OP2(SLJIT_SUB, TMP2, 0, SLJIT_IMM, 0, TMP2, 0);
  5729. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
  5730. if (HAS_VIRTUAL_REGISTERS)
  5731. {
  5732. OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -(2 * sizeof(sljit_sw)));
  5733. OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 2 * sizeof(sljit_sw));
  5734. }
  5735. else
  5736. {
  5737. OP1(SLJIT_MOV, TMP3, 0, SLJIT_MEM1(STACK_TOP), -(2 * sizeof(sljit_sw)));
  5738. OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 2 * sizeof(sljit_sw));
  5739. OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, TMP3, 0);
  5740. }
  5741. JUMPTO(SLJIT_JUMP, mainloop);
  5742. }
  5743. static void check_wordboundary(compiler_common *common)
  5744. {
  5745. DEFINE_COMPILER;
  5746. struct sljit_jump *skipread;
  5747. jump_list *skipread_list = NULL;
  5748. #ifdef SUPPORT_UNICODE
  5749. struct sljit_label *valid_utf;
  5750. jump_list *invalid_utf1 = NULL;
  5751. #endif /* SUPPORT_UNICODE */
  5752. jump_list *invalid_utf2 = NULL;
  5753. #if PCRE2_CODE_UNIT_WIDTH != 8 || defined SUPPORT_UNICODE
  5754. struct sljit_jump *jump;
  5755. #endif /* PCRE2_CODE_UNIT_WIDTH != 8 || SUPPORT_UNICODE */
  5756. SLJIT_COMPILE_ASSERT(ctype_word == 0x10, ctype_word_must_be_16);
  5757. sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  5758. /* Get type of the previous char, and put it to TMP3. */
  5759. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  5760. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
  5761. OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0);
  5762. skipread = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);
  5763. #ifdef SUPPORT_UNICODE
  5764. if (common->invalid_utf)
  5765. {
  5766. peek_char_back(common, READ_CHAR_MAX, &invalid_utf1);
  5767. if (common->mode != PCRE2_JIT_COMPLETE)
  5768. {
  5769. OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0);
  5770. OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
  5771. move_back(common, NULL, TRUE);
  5772. check_start_used_ptr(common);
  5773. OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
  5774. OP1(SLJIT_MOV, STR_PTR, 0, TMP2, 0);
  5775. }
  5776. }
  5777. else
  5778. #endif /* SUPPORT_UNICODE */
  5779. {
  5780. if (common->mode == PCRE2_JIT_COMPLETE)
  5781. peek_char_back(common, READ_CHAR_MAX, NULL);
  5782. else
  5783. {
  5784. move_back(common, NULL, TRUE);
  5785. check_start_used_ptr(common);
  5786. read_char(common, 0, READ_CHAR_MAX, NULL, READ_CHAR_UPDATE_STR_PTR);
  5787. }
  5788. }
  5789. /* Testing char type. */
  5790. #ifdef SUPPORT_UNICODE
  5791. if (common->ucp)
  5792. {
  5793. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1);
  5794. jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE);
  5795. add_jump(compiler, &common->getucdtype, JUMP(SLJIT_FAST_CALL));
  5796. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll);
  5797. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll);
  5798. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
  5799. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll);
  5800. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd);
  5801. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
  5802. JUMPHERE(jump);
  5803. OP1(SLJIT_MOV, TMP3, 0, TMP2, 0);
  5804. }
  5805. else
  5806. #endif /* SUPPORT_UNICODE */
  5807. {
  5808. #if PCRE2_CODE_UNIT_WIDTH != 8
  5809. jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
  5810. #elif defined SUPPORT_UNICODE
  5811. /* Here TMP3 has already been zeroed. */
  5812. jump = NULL;
  5813. if (common->utf)
  5814. jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
  5815. #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
  5816. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), common->ctypes);
  5817. OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 4 /* ctype_word */);
  5818. OP2(SLJIT_AND, TMP3, 0, TMP1, 0, SLJIT_IMM, 1);
  5819. #if PCRE2_CODE_UNIT_WIDTH != 8
  5820. JUMPHERE(jump);
  5821. #elif defined SUPPORT_UNICODE
  5822. if (jump != NULL)
  5823. JUMPHERE(jump);
  5824. #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
  5825. }
  5826. JUMPHERE(skipread);
  5827. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0);
  5828. check_str_end(common, &skipread_list);
  5829. peek_char(common, READ_CHAR_MAX, SLJIT_MEM1(SLJIT_SP), LOCALS1, &invalid_utf2);
  5830. /* Testing char type. This is a code duplication. */
  5831. #ifdef SUPPORT_UNICODE
  5832. valid_utf = LABEL();
  5833. if (common->ucp)
  5834. {
  5835. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1);
  5836. jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE);
  5837. add_jump(compiler, &common->getucdtype, JUMP(SLJIT_FAST_CALL));
  5838. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll);
  5839. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll);
  5840. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
  5841. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll);
  5842. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd);
  5843. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
  5844. JUMPHERE(jump);
  5845. }
  5846. else
  5847. #endif /* SUPPORT_UNICODE */
  5848. {
  5849. #if PCRE2_CODE_UNIT_WIDTH != 8
  5850. /* TMP2 may be destroyed by peek_char. */
  5851. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0);
  5852. jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
  5853. #elif defined SUPPORT_UNICODE
  5854. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0);
  5855. jump = NULL;
  5856. if (common->utf)
  5857. jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
  5858. #endif
  5859. OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), common->ctypes);
  5860. OP2(SLJIT_LSHR, TMP2, 0, TMP2, 0, SLJIT_IMM, 4 /* ctype_word */);
  5861. OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 1);
  5862. #if PCRE2_CODE_UNIT_WIDTH != 8
  5863. JUMPHERE(jump);
  5864. #elif defined SUPPORT_UNICODE
  5865. if (jump != NULL)
  5866. JUMPHERE(jump);
  5867. #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
  5868. }
  5869. set_jumps(skipread_list, LABEL());
  5870. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  5871. OP2(SLJIT_XOR | SLJIT_SET_Z, TMP2, 0, TMP2, 0, TMP3, 0);
  5872. OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
  5873. #ifdef SUPPORT_UNICODE
  5874. if (common->invalid_utf)
  5875. {
  5876. set_jumps(invalid_utf1, LABEL());
  5877. peek_char(common, READ_CHAR_MAX, SLJIT_MEM1(SLJIT_SP), LOCALS1, NULL);
  5878. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR, valid_utf);
  5879. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  5880. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, -1);
  5881. OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
  5882. set_jumps(invalid_utf2, LABEL());
  5883. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  5884. OP1(SLJIT_MOV, TMP2, 0, TMP3, 0);
  5885. OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
  5886. }
  5887. #endif /* SUPPORT_UNICODE */
  5888. }
  5889. static BOOL optimize_class_ranges(compiler_common *common, const sljit_u8 *bits, BOOL nclass, BOOL invert, jump_list **backtracks)
  5890. {
  5891. /* May destroy TMP1. */
  5892. DEFINE_COMPILER;
  5893. int ranges[MAX_CLASS_RANGE_SIZE];
  5894. sljit_u8 bit, cbit, all;
  5895. int i, byte, length = 0;
  5896. bit = bits[0] & 0x1;
  5897. /* All bits will be zero or one (since bit is zero or one). */
  5898. all = -bit;
  5899. for (i = 0; i < 256; )
  5900. {
  5901. byte = i >> 3;
  5902. if ((i & 0x7) == 0 && bits[byte] == all)
  5903. i += 8;
  5904. else
  5905. {
  5906. cbit = (bits[byte] >> (i & 0x7)) & 0x1;
  5907. if (cbit != bit)
  5908. {
  5909. if (length >= MAX_CLASS_RANGE_SIZE)
  5910. return FALSE;
  5911. ranges[length] = i;
  5912. length++;
  5913. bit = cbit;
  5914. all = -cbit;
  5915. }
  5916. i++;
  5917. }
  5918. }
  5919. if (((bit == 0) && nclass) || ((bit == 1) && !nclass))
  5920. {
  5921. if (length >= MAX_CLASS_RANGE_SIZE)
  5922. return FALSE;
  5923. ranges[length] = 256;
  5924. length++;
  5925. }
  5926. if (length < 0 || length > 4)
  5927. return FALSE;
  5928. bit = bits[0] & 0x1;
  5929. if (invert) bit ^= 0x1;
  5930. /* No character is accepted. */
  5931. if (length == 0 && bit == 0)
  5932. add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
  5933. switch(length)
  5934. {
  5935. case 0:
  5936. /* When bit != 0, all characters are accepted. */
  5937. return TRUE;
  5938. case 1:
  5939. add_jump(compiler, backtracks, CMP(bit == 0 ? SLJIT_LESS : SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0]));
  5940. return TRUE;
  5941. case 2:
  5942. if (ranges[0] + 1 != ranges[1])
  5943. {
  5944. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]);
  5945. add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_LESS : SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0]));
  5946. }
  5947. else
  5948. add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_EQUAL : SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0]));
  5949. return TRUE;
  5950. case 3:
  5951. if (bit != 0)
  5952. {
  5953. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[2]));
  5954. if (ranges[0] + 1 != ranges[1])
  5955. {
  5956. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]);
  5957. add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0]));
  5958. }
  5959. else
  5960. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0]));
  5961. return TRUE;
  5962. }
  5963. add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[0]));
  5964. if (ranges[1] + 1 != ranges[2])
  5965. {
  5966. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[1]);
  5967. add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[2] - ranges[1]));
  5968. }
  5969. else
  5970. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[1]));
  5971. return TRUE;
  5972. case 4:
  5973. if ((ranges[1] - ranges[0]) == (ranges[3] - ranges[2])
  5974. && (ranges[0] | (ranges[2] - ranges[0])) == ranges[2]
  5975. && (ranges[1] & (ranges[2] - ranges[0])) == 0
  5976. && is_powerof2(ranges[2] - ranges[0]))
  5977. {
  5978. SLJIT_ASSERT((ranges[0] & (ranges[2] - ranges[0])) == 0 && (ranges[2] & ranges[3] & (ranges[2] - ranges[0])) != 0);
  5979. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[2] - ranges[0]);
  5980. if (ranges[2] + 1 != ranges[3])
  5981. {
  5982. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[2]);
  5983. add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_LESS : SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[3] - ranges[2]));
  5984. }
  5985. else
  5986. add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_EQUAL : SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[2]));
  5987. return TRUE;
  5988. }
  5989. if (bit != 0)
  5990. {
  5991. i = 0;
  5992. if (ranges[0] + 1 != ranges[1])
  5993. {
  5994. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]);
  5995. add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0]));
  5996. i = ranges[0];
  5997. }
  5998. else
  5999. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0]));
  6000. if (ranges[2] + 1 != ranges[3])
  6001. {
  6002. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[2] - i);
  6003. add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[3] - ranges[2]));
  6004. }
  6005. else
  6006. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[2] - i));
  6007. return TRUE;
  6008. }
  6009. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]);
  6010. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[3] - ranges[0]));
  6011. if (ranges[1] + 1 != ranges[2])
  6012. {
  6013. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0]);
  6014. add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[2] - ranges[1]));
  6015. }
  6016. else
  6017. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0]));
  6018. return TRUE;
  6019. default:
  6020. SLJIT_UNREACHABLE();
  6021. return FALSE;
  6022. }
  6023. }
  6024. static BOOL optimize_class_chars(compiler_common *common, const sljit_u8 *bits, BOOL nclass, BOOL invert, jump_list **backtracks)
  6025. {
  6026. /* May destroy TMP1. */
  6027. DEFINE_COMPILER;
  6028. uint16_t char_list[MAX_CLASS_CHARS_SIZE];
  6029. uint8_t byte;
  6030. sljit_s32 type;
  6031. int i, j, k, len, c;
  6032. if (!sljit_has_cpu_feature(SLJIT_HAS_CMOV))
  6033. return FALSE;
  6034. len = 0;
  6035. for (i = 0; i < 32; i++)
  6036. {
  6037. byte = bits[i];
  6038. if (nclass)
  6039. byte = ~byte;
  6040. j = 0;
  6041. while (byte != 0)
  6042. {
  6043. if (byte & 0x1)
  6044. {
  6045. c = i * 8 + j;
  6046. k = len;
  6047. if ((c & 0x20) != 0)
  6048. {
  6049. for (k = 0; k < len; k++)
  6050. if (char_list[k] == c - 0x20)
  6051. {
  6052. char_list[k] |= 0x120;
  6053. break;
  6054. }
  6055. }
  6056. if (k == len)
  6057. {
  6058. if (len >= MAX_CLASS_CHARS_SIZE)
  6059. return FALSE;
  6060. char_list[len++] = (uint16_t) c;
  6061. }
  6062. }
  6063. byte >>= 1;
  6064. j++;
  6065. }
  6066. }
  6067. if (len == 0) return FALSE; /* Should never occur, but stops analyzers complaining. */
  6068. i = 0;
  6069. j = 0;
  6070. if (char_list[0] == 0)
  6071. {
  6072. i++;
  6073. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0);
  6074. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_ZERO);
  6075. }
  6076. else
  6077. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0);
  6078. while (i < len)
  6079. {
  6080. if ((char_list[i] & 0x100) != 0)
  6081. j++;
  6082. else
  6083. {
  6084. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, char_list[i]);
  6085. CMOV(SLJIT_ZERO, TMP2, TMP1, 0);
  6086. }
  6087. i++;
  6088. }
  6089. if (j != 0)
  6090. {
  6091. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x20);
  6092. for (i = 0; i < len; i++)
  6093. if ((char_list[i] & 0x100) != 0)
  6094. {
  6095. j--;
  6096. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, char_list[i] & 0xff);
  6097. CMOV(SLJIT_ZERO, TMP2, TMP1, 0);
  6098. }
  6099. }
  6100. if (invert)
  6101. nclass = !nclass;
  6102. type = nclass ? SLJIT_NOT_EQUAL : SLJIT_EQUAL;
  6103. add_jump(compiler, backtracks, CMP(type, TMP2, 0, SLJIT_IMM, 0));
  6104. return TRUE;
  6105. }
  6106. static BOOL optimize_class(compiler_common *common, const sljit_u8 *bits, BOOL nclass, BOOL invert, jump_list **backtracks)
  6107. {
  6108. /* May destroy TMP1. */
  6109. if (optimize_class_ranges(common, bits, nclass, invert, backtracks))
  6110. return TRUE;
  6111. return optimize_class_chars(common, bits, nclass, invert, backtracks);
  6112. }
  6113. static void check_anynewline(compiler_common *common)
  6114. {
  6115. /* Check whether TMP1 contains a newline character. TMP2 destroyed. */
  6116. DEFINE_COMPILER;
  6117. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  6118. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a);
  6119. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a);
  6120. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
  6121. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a);
  6122. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  6123. #if PCRE2_CODE_UNIT_WIDTH == 8
  6124. if (common->utf)
  6125. {
  6126. #endif
  6127. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  6128. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1);
  6129. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a);
  6130. #if PCRE2_CODE_UNIT_WIDTH == 8
  6131. }
  6132. #endif
  6133. #endif /* SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == [16|32] */
  6134. OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);
  6135. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  6136. }
  6137. static void check_hspace(compiler_common *common)
  6138. {
  6139. /* Check whether TMP1 contains a newline character. TMP2 destroyed. */
  6140. DEFINE_COMPILER;
  6141. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  6142. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x09);
  6143. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);
  6144. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x20);
  6145. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  6146. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0xa0);
  6147. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  6148. #if PCRE2_CODE_UNIT_WIDTH == 8
  6149. if (common->utf)
  6150. {
  6151. #endif
  6152. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  6153. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x1680);
  6154. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  6155. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x180e);
  6156. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  6157. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x2000);
  6158. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0x200A - 0x2000);
  6159. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
  6160. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x202f - 0x2000);
  6161. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  6162. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x205f - 0x2000);
  6163. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  6164. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x3000 - 0x2000);
  6165. #if PCRE2_CODE_UNIT_WIDTH == 8
  6166. }
  6167. #endif
  6168. #endif /* SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == [16|32] */
  6169. OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);
  6170. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  6171. }
  6172. static void check_vspace(compiler_common *common)
  6173. {
  6174. /* Check whether TMP1 contains a newline character. TMP2 destroyed. */
  6175. DEFINE_COMPILER;
  6176. sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
  6177. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a);
  6178. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a);
  6179. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
  6180. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a);
  6181. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  6182. #if PCRE2_CODE_UNIT_WIDTH == 8
  6183. if (common->utf)
  6184. {
  6185. #endif
  6186. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  6187. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1);
  6188. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a);
  6189. #if PCRE2_CODE_UNIT_WIDTH == 8
  6190. }
  6191. #endif
  6192. #endif /* SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == [16|32] */
  6193. OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);
  6194. OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
  6195. }
  6196. static void do_casefulcmp(compiler_common *common)
  6197. {
  6198. DEFINE_COMPILER;
  6199. struct sljit_jump *jump;
  6200. struct sljit_label *label;
  6201. int char1_reg;
  6202. int char2_reg;
  6203. if (HAS_VIRTUAL_REGISTERS)
  6204. {
  6205. char1_reg = STR_END;
  6206. char2_reg = STACK_TOP;
  6207. }
  6208. else
  6209. {
  6210. char1_reg = TMP3;
  6211. char2_reg = RETURN_ADDR;
  6212. }
  6213. sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  6214. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
  6215. if (char1_reg == STR_END)
  6216. {
  6217. OP1(SLJIT_MOV, TMP3, 0, char1_reg, 0);
  6218. OP1(SLJIT_MOV, RETURN_ADDR, 0, char2_reg, 0);
  6219. }
  6220. if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
  6221. {
  6222. label = LABEL();
  6223. sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));
  6224. sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  6225. jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
  6226. OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
  6227. JUMPTO(SLJIT_NOT_ZERO, label);
  6228. JUMPHERE(jump);
  6229. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  6230. }
  6231. else if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
  6232. {
  6233. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
  6234. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  6235. label = LABEL();
  6236. sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));
  6237. sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  6238. jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
  6239. OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
  6240. JUMPTO(SLJIT_NOT_ZERO, label);
  6241. JUMPHERE(jump);
  6242. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  6243. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  6244. }
  6245. else
  6246. {
  6247. label = LABEL();
  6248. OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0);
  6249. OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0);
  6250. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
  6251. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  6252. jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
  6253. OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
  6254. JUMPTO(SLJIT_NOT_ZERO, label);
  6255. JUMPHERE(jump);
  6256. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  6257. }
  6258. if (char1_reg == STR_END)
  6259. {
  6260. OP1(SLJIT_MOV, char1_reg, 0, TMP3, 0);
  6261. OP1(SLJIT_MOV, char2_reg, 0, RETURN_ADDR, 0);
  6262. }
  6263. OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
  6264. }
  6265. static void do_caselesscmp(compiler_common *common)
  6266. {
  6267. DEFINE_COMPILER;
  6268. struct sljit_jump *jump;
  6269. struct sljit_label *label;
  6270. int char1_reg = STR_END;
  6271. int char2_reg;
  6272. int lcc_table;
  6273. int opt_type = 0;
  6274. if (HAS_VIRTUAL_REGISTERS)
  6275. {
  6276. char2_reg = STACK_TOP;
  6277. lcc_table = STACK_LIMIT;
  6278. }
  6279. else
  6280. {
  6281. char2_reg = RETURN_ADDR;
  6282. lcc_table = TMP3;
  6283. }
  6284. if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
  6285. opt_type = 1;
  6286. else if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
  6287. opt_type = 2;
  6288. sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  6289. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
  6290. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, char1_reg, 0);
  6291. if (char2_reg == STACK_TOP)
  6292. {
  6293. OP1(SLJIT_MOV, TMP3, 0, char2_reg, 0);
  6294. OP1(SLJIT_MOV, RETURN_ADDR, 0, lcc_table, 0);
  6295. }
  6296. OP1(SLJIT_MOV, lcc_table, 0, SLJIT_IMM, common->lcc);
  6297. if (opt_type == 1)
  6298. {
  6299. label = LABEL();
  6300. sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));
  6301. sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  6302. }
  6303. else if (opt_type == 2)
  6304. {
  6305. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
  6306. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  6307. label = LABEL();
  6308. sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));
  6309. sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  6310. }
  6311. else
  6312. {
  6313. label = LABEL();
  6314. OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0);
  6315. OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0);
  6316. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
  6317. }
  6318. #if PCRE2_CODE_UNIT_WIDTH != 8
  6319. jump = CMP(SLJIT_GREATER, char1_reg, 0, SLJIT_IMM, 255);
  6320. #endif
  6321. OP1(SLJIT_MOV_U8, char1_reg, 0, SLJIT_MEM2(lcc_table, char1_reg), 0);
  6322. #if PCRE2_CODE_UNIT_WIDTH != 8
  6323. JUMPHERE(jump);
  6324. jump = CMP(SLJIT_GREATER, char2_reg, 0, SLJIT_IMM, 255);
  6325. #endif
  6326. OP1(SLJIT_MOV_U8, char2_reg, 0, SLJIT_MEM2(lcc_table, char2_reg), 0);
  6327. #if PCRE2_CODE_UNIT_WIDTH != 8
  6328. JUMPHERE(jump);
  6329. #endif
  6330. if (opt_type == 0)
  6331. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  6332. jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
  6333. OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
  6334. JUMPTO(SLJIT_NOT_ZERO, label);
  6335. JUMPHERE(jump);
  6336. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  6337. if (opt_type == 2)
  6338. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  6339. if (char2_reg == STACK_TOP)
  6340. {
  6341. OP1(SLJIT_MOV, char2_reg, 0, TMP3, 0);
  6342. OP1(SLJIT_MOV, lcc_table, 0, RETURN_ADDR, 0);
  6343. }
  6344. OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
  6345. OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
  6346. }
  6347. static PCRE2_SPTR byte_sequence_compare(compiler_common *common, BOOL caseless, PCRE2_SPTR cc,
  6348. compare_context *context, jump_list **backtracks)
  6349. {
  6350. DEFINE_COMPILER;
  6351. unsigned int othercasebit = 0;
  6352. PCRE2_SPTR othercasechar = NULL;
  6353. #ifdef SUPPORT_UNICODE
  6354. int utflength;
  6355. #endif
  6356. if (caseless && char_has_othercase(common, cc))
  6357. {
  6358. othercasebit = char_get_othercase_bit(common, cc);
  6359. SLJIT_ASSERT(othercasebit);
  6360. /* Extracting bit difference info. */
  6361. #if PCRE2_CODE_UNIT_WIDTH == 8
  6362. othercasechar = cc + (othercasebit >> 8);
  6363. othercasebit &= 0xff;
  6364. #elif PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  6365. /* Note that this code only handles characters in the BMP. If there
  6366. ever are characters outside the BMP whose othercase differs in only one
  6367. bit from itself (there currently are none), this code will need to be
  6368. revised for PCRE2_CODE_UNIT_WIDTH == 32. */
  6369. othercasechar = cc + (othercasebit >> 9);
  6370. if ((othercasebit & 0x100) != 0)
  6371. othercasebit = (othercasebit & 0xff) << 8;
  6372. else
  6373. othercasebit &= 0xff;
  6374. #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
  6375. }
  6376. if (context->sourcereg == -1)
  6377. {
  6378. #if PCRE2_CODE_UNIT_WIDTH == 8
  6379. #if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED
  6380. if (context->length >= 4)
  6381. OP1(SLJIT_MOV_S32, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);
  6382. else if (context->length >= 2)
  6383. OP1(SLJIT_MOV_U16, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);
  6384. else
  6385. #endif
  6386. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);
  6387. #elif PCRE2_CODE_UNIT_WIDTH == 16
  6388. #if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED
  6389. if (context->length >= 4)
  6390. OP1(SLJIT_MOV_S32, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);
  6391. else
  6392. #endif
  6393. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);
  6394. #elif PCRE2_CODE_UNIT_WIDTH == 32
  6395. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);
  6396. #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
  6397. context->sourcereg = TMP2;
  6398. }
  6399. #ifdef SUPPORT_UNICODE
  6400. utflength = 1;
  6401. if (common->utf && HAS_EXTRALEN(*cc))
  6402. utflength += GET_EXTRALEN(*cc);
  6403. do
  6404. {
  6405. #endif
  6406. context->length -= IN_UCHARS(1);
  6407. #if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED) && (PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16)
  6408. /* Unaligned read is supported. */
  6409. if (othercasebit != 0 && othercasechar == cc)
  6410. {
  6411. context->c.asuchars[context->ucharptr] = *cc | othercasebit;
  6412. context->oc.asuchars[context->ucharptr] = othercasebit;
  6413. }
  6414. else
  6415. {
  6416. context->c.asuchars[context->ucharptr] = *cc;
  6417. context->oc.asuchars[context->ucharptr] = 0;
  6418. }
  6419. context->ucharptr++;
  6420. #if PCRE2_CODE_UNIT_WIDTH == 8
  6421. if (context->ucharptr >= 4 || context->length == 0 || (context->ucharptr == 2 && context->length == 1))
  6422. #else
  6423. if (context->ucharptr >= 2 || context->length == 0)
  6424. #endif
  6425. {
  6426. if (context->length >= 4)
  6427. OP1(SLJIT_MOV_S32, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length);
  6428. else if (context->length >= 2)
  6429. OP1(SLJIT_MOV_U16, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length);
  6430. #if PCRE2_CODE_UNIT_WIDTH == 8
  6431. else if (context->length >= 1)
  6432. OP1(SLJIT_MOV_U8, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length);
  6433. #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
  6434. context->sourcereg = context->sourcereg == TMP1 ? TMP2 : TMP1;
  6435. switch(context->ucharptr)
  6436. {
  6437. case 4 / sizeof(PCRE2_UCHAR):
  6438. if (context->oc.asint != 0)
  6439. OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asint);
  6440. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asint | context->oc.asint));
  6441. break;
  6442. case 2 / sizeof(PCRE2_UCHAR):
  6443. if (context->oc.asushort != 0)
  6444. OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asushort);
  6445. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asushort | context->oc.asushort));
  6446. break;
  6447. #if PCRE2_CODE_UNIT_WIDTH == 8
  6448. case 1:
  6449. if (context->oc.asbyte != 0)
  6450. OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asbyte);
  6451. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asbyte | context->oc.asbyte));
  6452. break;
  6453. #endif
  6454. default:
  6455. SLJIT_UNREACHABLE();
  6456. break;
  6457. }
  6458. context->ucharptr = 0;
  6459. }
  6460. #else
  6461. /* Unaligned read is unsupported or in 32 bit mode. */
  6462. if (context->length >= 1)
  6463. OP1(MOV_UCHAR, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length);
  6464. context->sourcereg = context->sourcereg == TMP1 ? TMP2 : TMP1;
  6465. if (othercasebit != 0 && othercasechar == cc)
  6466. {
  6467. OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, othercasebit);
  6468. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, *cc | othercasebit));
  6469. }
  6470. else
  6471. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, *cc));
  6472. #endif
  6473. cc++;
  6474. #ifdef SUPPORT_UNICODE
  6475. utflength--;
  6476. }
  6477. while (utflength > 0);
  6478. #endif
  6479. return cc;
  6480. }
  6481. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
  6482. #define SET_TYPE_OFFSET(value) \
  6483. if ((value) != typeoffset) \
  6484. { \
  6485. if ((value) < typeoffset) \
  6486. OP2(SLJIT_ADD, typereg, 0, typereg, 0, SLJIT_IMM, typeoffset - (value)); \
  6487. else \
  6488. OP2(SLJIT_SUB, typereg, 0, typereg, 0, SLJIT_IMM, (value) - typeoffset); \
  6489. } \
  6490. typeoffset = (value);
  6491. #define SET_CHAR_OFFSET(value) \
  6492. if ((value) != charoffset) \
  6493. { \
  6494. if ((value) < charoffset) \
  6495. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(charoffset - (value))); \
  6496. else \
  6497. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)((value) - charoffset)); \
  6498. } \
  6499. charoffset = (value);
  6500. static PCRE2_SPTR compile_char1_matchingpath(compiler_common *common, PCRE2_UCHAR type, PCRE2_SPTR cc, jump_list **backtracks, BOOL check_str_ptr);
  6501. #ifdef SUPPORT_UNICODE
  6502. #define XCLASS_SAVE_CHAR 0x001
  6503. #define XCLASS_CHAR_SAVED 0x002
  6504. #define XCLASS_HAS_TYPE 0x004
  6505. #define XCLASS_HAS_SCRIPT 0x008
  6506. #define XCLASS_HAS_SCRIPT_EXTENSION 0x010
  6507. #define XCLASS_HAS_BOOL 0x020
  6508. #define XCLASS_HAS_BIDICL 0x040
  6509. #define XCLASS_NEEDS_UCD (XCLASS_HAS_TYPE | XCLASS_HAS_SCRIPT | XCLASS_HAS_SCRIPT_EXTENSION | XCLASS_HAS_BOOL | XCLASS_HAS_BIDICL)
  6510. #define XCLASS_SCRIPT_EXTENSION_NOTPROP 0x080
  6511. #define XCLASS_SCRIPT_EXTENSION_RESTORE_RETURN_ADDR 0x100
  6512. #define XCLASS_SCRIPT_EXTENSION_RESTORE_LOCALS0 0x200
  6513. #endif /* SUPPORT_UNICODE */
  6514. static void compile_xclass_matchingpath(compiler_common *common, PCRE2_SPTR cc, jump_list **backtracks)
  6515. {
  6516. DEFINE_COMPILER;
  6517. jump_list *found = NULL;
  6518. jump_list **list = (cc[0] & XCL_NOT) == 0 ? &found : backtracks;
  6519. sljit_uw c, charoffset, max = 256, min = READ_CHAR_MAX;
  6520. struct sljit_jump *jump = NULL;
  6521. PCRE2_SPTR ccbegin;
  6522. int compares, invertcmp, numberofcmps;
  6523. #if defined SUPPORT_UNICODE && (PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16)
  6524. BOOL utf = common->utf;
  6525. #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == [8|16] */
  6526. #ifdef SUPPORT_UNICODE
  6527. sljit_u32 unicode_status = 0;
  6528. int typereg = TMP1;
  6529. const sljit_u32 *other_cases;
  6530. sljit_uw typeoffset;
  6531. #endif /* SUPPORT_UNICODE */
  6532. /* Scanning the necessary info. */
  6533. cc++;
  6534. ccbegin = cc;
  6535. compares = 0;
  6536. if (cc[-1] & XCL_MAP)
  6537. {
  6538. min = 0;
  6539. cc += 32 / sizeof(PCRE2_UCHAR);
  6540. }
  6541. while (*cc != XCL_END)
  6542. {
  6543. compares++;
  6544. if (*cc == XCL_SINGLE)
  6545. {
  6546. cc ++;
  6547. GETCHARINCTEST(c, cc);
  6548. if (c > max) max = c;
  6549. if (c < min) min = c;
  6550. #ifdef SUPPORT_UNICODE
  6551. unicode_status |= XCLASS_SAVE_CHAR;
  6552. #endif /* SUPPORT_UNICODE */
  6553. }
  6554. else if (*cc == XCL_RANGE)
  6555. {
  6556. cc ++;
  6557. GETCHARINCTEST(c, cc);
  6558. if (c < min) min = c;
  6559. GETCHARINCTEST(c, cc);
  6560. if (c > max) max = c;
  6561. #ifdef SUPPORT_UNICODE
  6562. unicode_status |= XCLASS_SAVE_CHAR;
  6563. #endif /* SUPPORT_UNICODE */
  6564. }
  6565. #ifdef SUPPORT_UNICODE
  6566. else
  6567. {
  6568. SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
  6569. cc++;
  6570. if (*cc == PT_CLIST && cc[-1] == XCL_PROP)
  6571. {
  6572. other_cases = PRIV(ucd_caseless_sets) + cc[1];
  6573. while (*other_cases != NOTACHAR)
  6574. {
  6575. if (*other_cases > max) max = *other_cases;
  6576. if (*other_cases < min) min = *other_cases;
  6577. other_cases++;
  6578. }
  6579. }
  6580. else
  6581. {
  6582. max = READ_CHAR_MAX;
  6583. min = 0;
  6584. }
  6585. switch(*cc)
  6586. {
  6587. case PT_ANY:
  6588. /* Any either accepts everything or ignored. */
  6589. if (cc[-1] == XCL_PROP)
  6590. {
  6591. compile_char1_matchingpath(common, OP_ALLANY, cc, backtracks, FALSE);
  6592. if (list == backtracks)
  6593. add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
  6594. return;
  6595. }
  6596. break;
  6597. case PT_LAMP:
  6598. case PT_GC:
  6599. case PT_PC:
  6600. case PT_ALNUM:
  6601. unicode_status |= XCLASS_HAS_TYPE;
  6602. break;
  6603. case PT_SCX:
  6604. unicode_status |= XCLASS_HAS_SCRIPT_EXTENSION;
  6605. if (cc[-1] == XCL_NOTPROP)
  6606. {
  6607. unicode_status |= XCLASS_SCRIPT_EXTENSION_NOTPROP;
  6608. break;
  6609. }
  6610. compares++;
  6611. /* Fall through */
  6612. case PT_SC:
  6613. unicode_status |= XCLASS_HAS_SCRIPT;
  6614. break;
  6615. case PT_SPACE:
  6616. case PT_PXSPACE:
  6617. case PT_WORD:
  6618. case PT_PXGRAPH:
  6619. case PT_PXPRINT:
  6620. case PT_PXPUNCT:
  6621. unicode_status |= XCLASS_SAVE_CHAR | XCLASS_HAS_TYPE;
  6622. break;
  6623. case PT_CLIST:
  6624. case PT_UCNC:
  6625. unicode_status |= XCLASS_SAVE_CHAR;
  6626. break;
  6627. case PT_BOOL:
  6628. unicode_status |= XCLASS_HAS_BOOL;
  6629. break;
  6630. case PT_BIDICL:
  6631. unicode_status |= XCLASS_HAS_BIDICL;
  6632. break;
  6633. default:
  6634. SLJIT_UNREACHABLE();
  6635. break;
  6636. }
  6637. cc += 2;
  6638. }
  6639. #endif /* SUPPORT_UNICODE */
  6640. }
  6641. SLJIT_ASSERT(compares > 0);
  6642. /* We are not necessary in utf mode even in 8 bit mode. */
  6643. cc = ccbegin;
  6644. if ((cc[-1] & XCL_NOT) != 0)
  6645. read_char(common, min, max, backtracks, READ_CHAR_UPDATE_STR_PTR);
  6646. else
  6647. {
  6648. #ifdef SUPPORT_UNICODE
  6649. read_char(common, min, max, (unicode_status & XCLASS_NEEDS_UCD) ? backtracks : NULL, 0);
  6650. #else /* !SUPPORT_UNICODE */
  6651. read_char(common, min, max, NULL, 0);
  6652. #endif /* SUPPORT_UNICODE */
  6653. }
  6654. if ((cc[-1] & XCL_HASPROP) == 0)
  6655. {
  6656. if ((cc[-1] & XCL_MAP) != 0)
  6657. {
  6658. jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
  6659. if (!optimize_class(common, (const sljit_u8 *)cc, (((const sljit_u8 *)cc)[31] & 0x80) != 0, TRUE, &found))
  6660. {
  6661. OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7);
  6662. OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);
  6663. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc);
  6664. OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0);
  6665. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, TMP2, 0);
  6666. add_jump(compiler, &found, JUMP(SLJIT_NOT_ZERO));
  6667. }
  6668. add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
  6669. JUMPHERE(jump);
  6670. cc += 32 / sizeof(PCRE2_UCHAR);
  6671. }
  6672. else
  6673. {
  6674. OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, min);
  6675. add_jump(compiler, (cc[-1] & XCL_NOT) == 0 ? backtracks : &found, CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, max - min));
  6676. }
  6677. }
  6678. else if ((cc[-1] & XCL_MAP) != 0)
  6679. {
  6680. OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0);
  6681. #ifdef SUPPORT_UNICODE
  6682. unicode_status |= XCLASS_CHAR_SAVED;
  6683. #endif /* SUPPORT_UNICODE */
  6684. if (!optimize_class(common, (const sljit_u8 *)cc, FALSE, TRUE, list))
  6685. {
  6686. #if PCRE2_CODE_UNIT_WIDTH == 8
  6687. jump = NULL;
  6688. if (common->utf)
  6689. #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
  6690. jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
  6691. OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7);
  6692. OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);
  6693. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc);
  6694. OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0);
  6695. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, TMP2, 0);
  6696. add_jump(compiler, list, JUMP(SLJIT_NOT_ZERO));
  6697. #if PCRE2_CODE_UNIT_WIDTH == 8
  6698. if (common->utf)
  6699. #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
  6700. JUMPHERE(jump);
  6701. }
  6702. OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
  6703. cc += 32 / sizeof(PCRE2_UCHAR);
  6704. }
  6705. #ifdef SUPPORT_UNICODE
  6706. if (unicode_status & XCLASS_NEEDS_UCD)
  6707. {
  6708. if ((unicode_status & (XCLASS_SAVE_CHAR | XCLASS_CHAR_SAVED)) == XCLASS_SAVE_CHAR)
  6709. OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0);
  6710. #if PCRE2_CODE_UNIT_WIDTH == 32
  6711. if (!common->utf)
  6712. {
  6713. jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, MAX_UTF_CODE_POINT + 1);
  6714. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, UNASSIGNED_UTF_CHAR);
  6715. JUMPHERE(jump);
  6716. }
  6717. #endif /* PCRE2_CODE_UNIT_WIDTH == 32 */
  6718. OP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);
  6719. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 1);
  6720. OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_stage1));
  6721. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_MASK);
  6722. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);
  6723. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
  6724. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2));
  6725. OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1);
  6726. OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 3);
  6727. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 2);
  6728. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
  6729. ccbegin = cc;
  6730. if (unicode_status & XCLASS_HAS_BIDICL)
  6731. {
  6732. OP1(SLJIT_MOV_U16, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, scriptx_bidiclass));
  6733. OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BIDICLASS_SHIFT);
  6734. while (*cc != XCL_END)
  6735. {
  6736. if (*cc == XCL_SINGLE)
  6737. {
  6738. cc ++;
  6739. GETCHARINCTEST(c, cc);
  6740. }
  6741. else if (*cc == XCL_RANGE)
  6742. {
  6743. cc ++;
  6744. GETCHARINCTEST(c, cc);
  6745. GETCHARINCTEST(c, cc);
  6746. }
  6747. else
  6748. {
  6749. SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
  6750. cc++;
  6751. if (*cc == PT_BIDICL)
  6752. {
  6753. compares--;
  6754. invertcmp = (compares == 0 && list != backtracks);
  6755. if (cc[-1] == XCL_NOTPROP)
  6756. invertcmp ^= 0x1;
  6757. jump = CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (int)cc[1]);
  6758. add_jump(compiler, compares > 0 ? list : backtracks, jump);
  6759. }
  6760. cc += 2;
  6761. }
  6762. }
  6763. cc = ccbegin;
  6764. }
  6765. if (unicode_status & XCLASS_HAS_BOOL)
  6766. {
  6767. OP1(SLJIT_MOV_U16, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, bprops));
  6768. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BPROPS_MASK);
  6769. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 2);
  6770. while (*cc != XCL_END)
  6771. {
  6772. if (*cc == XCL_SINGLE)
  6773. {
  6774. cc ++;
  6775. GETCHARINCTEST(c, cc);
  6776. }
  6777. else if (*cc == XCL_RANGE)
  6778. {
  6779. cc ++;
  6780. GETCHARINCTEST(c, cc);
  6781. GETCHARINCTEST(c, cc);
  6782. }
  6783. else
  6784. {
  6785. SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
  6786. cc++;
  6787. if (*cc == PT_BOOL)
  6788. {
  6789. compares--;
  6790. invertcmp = (compares == 0 && list != backtracks);
  6791. if (cc[-1] == XCL_NOTPROP)
  6792. invertcmp ^= 0x1;
  6793. OP2U(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_MEM1(TMP1), (sljit_sw)(PRIV(ucd_boolprop_sets) + (cc[1] >> 5)), SLJIT_IMM, (sljit_sw)1 << (cc[1] & 0x1f));
  6794. add_jump(compiler, compares > 0 ? list : backtracks, JUMP(SLJIT_NOT_ZERO ^ invertcmp));
  6795. }
  6796. cc += 2;
  6797. }
  6798. }
  6799. cc = ccbegin;
  6800. }
  6801. if (unicode_status & XCLASS_HAS_SCRIPT)
  6802. {
  6803. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script));
  6804. while (*cc != XCL_END)
  6805. {
  6806. if (*cc == XCL_SINGLE)
  6807. {
  6808. cc ++;
  6809. GETCHARINCTEST(c, cc);
  6810. }
  6811. else if (*cc == XCL_RANGE)
  6812. {
  6813. cc ++;
  6814. GETCHARINCTEST(c, cc);
  6815. GETCHARINCTEST(c, cc);
  6816. }
  6817. else
  6818. {
  6819. SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
  6820. cc++;
  6821. switch (*cc)
  6822. {
  6823. case PT_SCX:
  6824. if (cc[-1] == XCL_NOTPROP)
  6825. break;
  6826. /* Fall through */
  6827. case PT_SC:
  6828. compares--;
  6829. invertcmp = (compares == 0 && list != backtracks);
  6830. if (cc[-1] == XCL_NOTPROP)
  6831. invertcmp ^= 0x1;
  6832. add_jump(compiler, compares > 0 ? list : backtracks, CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (int)cc[1]));
  6833. }
  6834. cc += 2;
  6835. }
  6836. }
  6837. cc = ccbegin;
  6838. }
  6839. if (unicode_status & XCLASS_HAS_SCRIPT_EXTENSION)
  6840. {
  6841. OP1(SLJIT_MOV_U16, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, scriptx_bidiclass));
  6842. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_SCRIPTX_MASK);
  6843. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 2);
  6844. if (unicode_status & XCLASS_SCRIPT_EXTENSION_NOTPROP)
  6845. {
  6846. if (unicode_status & XCLASS_HAS_TYPE)
  6847. {
  6848. if (unicode_status & XCLASS_SAVE_CHAR)
  6849. {
  6850. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, TMP2, 0);
  6851. unicode_status |= XCLASS_SCRIPT_EXTENSION_RESTORE_LOCALS0;
  6852. }
  6853. else
  6854. {
  6855. OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP2, 0);
  6856. unicode_status |= XCLASS_SCRIPT_EXTENSION_RESTORE_RETURN_ADDR;
  6857. }
  6858. }
  6859. OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script));
  6860. }
  6861. while (*cc != XCL_END)
  6862. {
  6863. if (*cc == XCL_SINGLE)
  6864. {
  6865. cc ++;
  6866. GETCHARINCTEST(c, cc);
  6867. }
  6868. else if (*cc == XCL_RANGE)
  6869. {
  6870. cc ++;
  6871. GETCHARINCTEST(c, cc);
  6872. GETCHARINCTEST(c, cc);
  6873. }
  6874. else
  6875. {
  6876. SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
  6877. cc++;
  6878. if (*cc == PT_SCX)
  6879. {
  6880. compares--;
  6881. invertcmp = (compares == 0 && list != backtracks);
  6882. jump = NULL;
  6883. if (cc[-1] == XCL_NOTPROP)
  6884. {
  6885. jump = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, (int)cc[1]);
  6886. if (invertcmp)
  6887. {
  6888. add_jump(compiler, backtracks, jump);
  6889. jump = NULL;
  6890. }
  6891. invertcmp ^= 0x1;
  6892. }
  6893. OP2U(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_MEM1(TMP1), (sljit_sw)(PRIV(ucd_script_sets) + (cc[1] >> 5)), SLJIT_IMM, (sljit_sw)1 << (cc[1] & 0x1f));
  6894. add_jump(compiler, compares > 0 ? list : backtracks, JUMP(SLJIT_NOT_ZERO ^ invertcmp));
  6895. if (jump != NULL)
  6896. JUMPHERE(jump);
  6897. }
  6898. cc += 2;
  6899. }
  6900. }
  6901. if (unicode_status & XCLASS_SCRIPT_EXTENSION_RESTORE_LOCALS0)
  6902. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  6903. else if (unicode_status & XCLASS_SCRIPT_EXTENSION_RESTORE_RETURN_ADDR)
  6904. OP1(SLJIT_MOV, TMP2, 0, RETURN_ADDR, 0);
  6905. cc = ccbegin;
  6906. }
  6907. if (unicode_status & XCLASS_SAVE_CHAR)
  6908. OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
  6909. if (unicode_status & XCLASS_HAS_TYPE)
  6910. {
  6911. if (unicode_status & XCLASS_SAVE_CHAR)
  6912. typereg = RETURN_ADDR;
  6913. OP1(SLJIT_MOV_U8, typereg, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
  6914. }
  6915. }
  6916. #endif /* SUPPORT_UNICODE */
  6917. /* Generating code. */
  6918. charoffset = 0;
  6919. numberofcmps = 0;
  6920. #ifdef SUPPORT_UNICODE
  6921. typeoffset = 0;
  6922. #endif /* SUPPORT_UNICODE */
  6923. while (*cc != XCL_END)
  6924. {
  6925. compares--;
  6926. invertcmp = (compares == 0 && list != backtracks);
  6927. jump = NULL;
  6928. if (*cc == XCL_SINGLE)
  6929. {
  6930. cc ++;
  6931. GETCHARINCTEST(c, cc);
  6932. if (numberofcmps < 3 && (*cc == XCL_SINGLE || *cc == XCL_RANGE))
  6933. {
  6934. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));
  6935. OP_FLAGS(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  6936. numberofcmps++;
  6937. }
  6938. else if (numberofcmps > 0)
  6939. {
  6940. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));
  6941. OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);
  6942. jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
  6943. numberofcmps = 0;
  6944. }
  6945. else
  6946. {
  6947. jump = CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));
  6948. numberofcmps = 0;
  6949. }
  6950. }
  6951. else if (*cc == XCL_RANGE)
  6952. {
  6953. cc ++;
  6954. GETCHARINCTEST(c, cc);
  6955. SET_CHAR_OFFSET(c);
  6956. GETCHARINCTEST(c, cc);
  6957. if (numberofcmps < 3 && (*cc == XCL_SINGLE || *cc == XCL_RANGE))
  6958. {
  6959. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));
  6960. OP_FLAGS(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
  6961. numberofcmps++;
  6962. }
  6963. else if (numberofcmps > 0)
  6964. {
  6965. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));
  6966. OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL);
  6967. jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
  6968. numberofcmps = 0;
  6969. }
  6970. else
  6971. {
  6972. jump = CMP(SLJIT_LESS_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));
  6973. numberofcmps = 0;
  6974. }
  6975. }
  6976. #ifdef SUPPORT_UNICODE
  6977. else
  6978. {
  6979. SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
  6980. if (*cc == XCL_NOTPROP)
  6981. invertcmp ^= 0x1;
  6982. cc++;
  6983. switch(*cc)
  6984. {
  6985. case PT_ANY:
  6986. if (!invertcmp)
  6987. jump = JUMP(SLJIT_JUMP);
  6988. break;
  6989. case PT_LAMP:
  6990. OP2U(SLJIT_SUB | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, ucp_Lu - typeoffset);
  6991. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);
  6992. OP2U(SLJIT_SUB | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, ucp_Ll - typeoffset);
  6993. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  6994. OP2U(SLJIT_SUB | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, ucp_Lt - typeoffset);
  6995. OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);
  6996. jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
  6997. break;
  6998. case PT_GC:
  6999. c = PRIV(ucp_typerange)[(int)cc[1] * 2];
  7000. SET_TYPE_OFFSET(c);
  7001. jump = CMP(SLJIT_LESS_EQUAL ^ invertcmp, typereg, 0, SLJIT_IMM, PRIV(ucp_typerange)[(int)cc[1] * 2 + 1] - c);
  7002. break;
  7003. case PT_PC:
  7004. jump = CMP(SLJIT_EQUAL ^ invertcmp, typereg, 0, SLJIT_IMM, (int)cc[1] - typeoffset);
  7005. break;
  7006. case PT_SC:
  7007. case PT_SCX:
  7008. case PT_BOOL:
  7009. case PT_BIDICL:
  7010. compares++;
  7011. /* Do nothing. */
  7012. break;
  7013. case PT_SPACE:
  7014. case PT_PXSPACE:
  7015. SET_CHAR_OFFSET(9);
  7016. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0xd - 0x9);
  7017. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
  7018. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x85 - 0x9);
  7019. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  7020. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x180e - 0x9);
  7021. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  7022. SET_TYPE_OFFSET(ucp_Zl);
  7023. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Zl);
  7024. OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL);
  7025. jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
  7026. break;
  7027. case PT_WORD:
  7028. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_UNDERSCORE - charoffset));
  7029. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);
  7030. /* Fall through. */
  7031. case PT_ALNUM:
  7032. SET_TYPE_OFFSET(ucp_Ll);
  7033. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, typereg, 0, SLJIT_IMM, ucp_Lu - ucp_Ll);
  7034. OP_FLAGS((*cc == PT_ALNUM) ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
  7035. SET_TYPE_OFFSET(ucp_Nd);
  7036. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, typereg, 0, SLJIT_IMM, ucp_No - ucp_Nd);
  7037. OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL);
  7038. jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
  7039. break;
  7040. case PT_CLIST:
  7041. other_cases = PRIV(ucd_caseless_sets) + cc[1];
  7042. /* At least three characters are required.
  7043. Otherwise this case would be handled by the normal code path. */
  7044. SLJIT_ASSERT(other_cases[0] != NOTACHAR && other_cases[1] != NOTACHAR && other_cases[2] != NOTACHAR);
  7045. SLJIT_ASSERT(other_cases[0] < other_cases[1] && other_cases[1] < other_cases[2]);
  7046. /* Optimizing character pairs, if their difference is power of 2. */
  7047. if (is_powerof2(other_cases[1] ^ other_cases[0]))
  7048. {
  7049. if (charoffset == 0)
  7050. OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, other_cases[1] ^ other_cases[0]);
  7051. else
  7052. {
  7053. OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)charoffset);
  7054. OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, other_cases[1] ^ other_cases[0]);
  7055. }
  7056. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, other_cases[1]);
  7057. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);
  7058. other_cases += 2;
  7059. }
  7060. else if (is_powerof2(other_cases[2] ^ other_cases[1]))
  7061. {
  7062. if (charoffset == 0)
  7063. OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, other_cases[2] ^ other_cases[1]);
  7064. else
  7065. {
  7066. OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)charoffset);
  7067. OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, other_cases[1] ^ other_cases[0]);
  7068. }
  7069. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, other_cases[2]);
  7070. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);
  7071. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, (sljit_sw)(other_cases[0] - charoffset));
  7072. OP_FLAGS(SLJIT_OR | ((other_cases[3] == NOTACHAR) ? SLJIT_SET_Z : 0), TMP2, 0, SLJIT_EQUAL);
  7073. other_cases += 3;
  7074. }
  7075. else
  7076. {
  7077. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, (sljit_sw)(*other_cases++ - charoffset));
  7078. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);
  7079. }
  7080. while (*other_cases != NOTACHAR)
  7081. {
  7082. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, (sljit_sw)(*other_cases++ - charoffset));
  7083. OP_FLAGS(SLJIT_OR | ((*other_cases == NOTACHAR) ? SLJIT_SET_Z : 0), TMP2, 0, SLJIT_EQUAL);
  7084. }
  7085. jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
  7086. break;
  7087. case PT_UCNC:
  7088. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_DOLLAR_SIGN - charoffset));
  7089. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);
  7090. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_COMMERCIAL_AT - charoffset));
  7091. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  7092. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_GRAVE_ACCENT - charoffset));
  7093. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  7094. SET_CHAR_OFFSET(0xa0);
  7095. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, (sljit_sw)(0xd7ff - charoffset));
  7096. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
  7097. SET_CHAR_OFFSET(0);
  7098. OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xe000 - 0);
  7099. OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_GREATER_EQUAL);
  7100. jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
  7101. break;
  7102. case PT_PXGRAPH:
  7103. /* C and Z groups are the farthest two groups. */
  7104. SET_TYPE_OFFSET(ucp_Ll);
  7105. OP2U(SLJIT_SUB | SLJIT_SET_GREATER, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll);
  7106. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER);
  7107. jump = CMP(SLJIT_NOT_EQUAL, typereg, 0, SLJIT_IMM, ucp_Cf - ucp_Ll);
  7108. /* In case of ucp_Cf, we overwrite the result. */
  7109. SET_CHAR_OFFSET(0x2066);
  7110. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066);
  7111. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
  7112. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x061c - 0x2066);
  7113. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  7114. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x180e - 0x2066);
  7115. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  7116. JUMPHERE(jump);
  7117. jump = CMP(SLJIT_ZERO ^ invertcmp, TMP2, 0, SLJIT_IMM, 0);
  7118. break;
  7119. case PT_PXPRINT:
  7120. /* C and Z groups are the farthest two groups. */
  7121. SET_TYPE_OFFSET(ucp_Ll);
  7122. OP2U(SLJIT_SUB | SLJIT_SET_GREATER, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll);
  7123. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER);
  7124. OP2U(SLJIT_SUB | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Ll);
  7125. OP_FLAGS(SLJIT_AND, TMP2, 0, SLJIT_NOT_EQUAL);
  7126. jump = CMP(SLJIT_NOT_EQUAL, typereg, 0, SLJIT_IMM, ucp_Cf - ucp_Ll);
  7127. /* In case of ucp_Cf, we overwrite the result. */
  7128. SET_CHAR_OFFSET(0x2066);
  7129. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066);
  7130. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
  7131. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x061c - 0x2066);
  7132. OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
  7133. JUMPHERE(jump);
  7134. jump = CMP(SLJIT_ZERO ^ invertcmp, TMP2, 0, SLJIT_IMM, 0);
  7135. break;
  7136. case PT_PXPUNCT:
  7137. SET_TYPE_OFFSET(ucp_Sc);
  7138. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, typereg, 0, SLJIT_IMM, ucp_So - ucp_Sc);
  7139. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
  7140. SET_CHAR_OFFSET(0);
  7141. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0x7f);
  7142. OP_FLAGS(SLJIT_AND, TMP2, 0, SLJIT_LESS_EQUAL);
  7143. SET_TYPE_OFFSET(ucp_Pc);
  7144. OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, typereg, 0, SLJIT_IMM, ucp_Ps - ucp_Pc);
  7145. OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL);
  7146. jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
  7147. break;
  7148. default:
  7149. SLJIT_UNREACHABLE();
  7150. break;
  7151. }
  7152. cc += 2;
  7153. }
  7154. #endif /* SUPPORT_UNICODE */
  7155. if (jump != NULL)
  7156. add_jump(compiler, compares > 0 ? list : backtracks, jump);
  7157. }
  7158. if (found != NULL)
  7159. set_jumps(found, LABEL());
  7160. }
  7161. #undef SET_TYPE_OFFSET
  7162. #undef SET_CHAR_OFFSET
  7163. #endif
  7164. static PCRE2_SPTR compile_simple_assertion_matchingpath(compiler_common *common, PCRE2_UCHAR type, PCRE2_SPTR cc, jump_list **backtracks)
  7165. {
  7166. DEFINE_COMPILER;
  7167. int length;
  7168. struct sljit_jump *jump[4];
  7169. #ifdef SUPPORT_UNICODE
  7170. struct sljit_label *label;
  7171. #endif /* SUPPORT_UNICODE */
  7172. switch(type)
  7173. {
  7174. case OP_SOD:
  7175. if (HAS_VIRTUAL_REGISTERS)
  7176. {
  7177. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  7178. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
  7179. }
  7180. else
  7181. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
  7182. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, TMP1, 0));
  7183. return cc;
  7184. case OP_SOM:
  7185. if (HAS_VIRTUAL_REGISTERS)
  7186. {
  7187. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  7188. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
  7189. }
  7190. else
  7191. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str));
  7192. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, TMP1, 0));
  7193. return cc;
  7194. case OP_NOT_WORD_BOUNDARY:
  7195. case OP_WORD_BOUNDARY:
  7196. add_jump(compiler, &common->wordboundary, JUMP(SLJIT_FAST_CALL));
  7197. #ifdef SUPPORT_UNICODE
  7198. if (common->invalid_utf)
  7199. {
  7200. add_jump(compiler, backtracks, CMP((type == OP_NOT_WORD_BOUNDARY) ? SLJIT_NOT_EQUAL : SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0));
  7201. return cc;
  7202. }
  7203. #endif /* SUPPORT_UNICODE */
  7204. sljit_set_current_flags(compiler, SLJIT_SET_Z);
  7205. add_jump(compiler, backtracks, JUMP(type == OP_NOT_WORD_BOUNDARY ? SLJIT_NOT_ZERO : SLJIT_ZERO));
  7206. return cc;
  7207. case OP_EODN:
  7208. /* Requires rather complex checks. */
  7209. jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  7210. if (common->nltype == NLTYPE_FIXED && common->newline > 255)
  7211. {
  7212. OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  7213. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  7214. if (common->mode == PCRE2_JIT_COMPLETE)
  7215. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_END, 0));
  7216. else
  7217. {
  7218. jump[1] = CMP(SLJIT_EQUAL, TMP2, 0, STR_END, 0);
  7219. OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP2, 0, STR_END, 0);
  7220. OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS);
  7221. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff);
  7222. OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_NOT_EQUAL);
  7223. add_jump(compiler, backtracks, JUMP(SLJIT_NOT_EQUAL));
  7224. check_partial(common, TRUE);
  7225. add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
  7226. JUMPHERE(jump[1]);
  7227. }
  7228. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  7229. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff));
  7230. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff));
  7231. }
  7232. else if (common->nltype == NLTYPE_FIXED)
  7233. {
  7234. OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  7235. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  7236. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_END, 0));
  7237. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline));
  7238. }
  7239. else
  7240. {
  7241. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  7242. jump[1] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR);
  7243. OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  7244. OP2U(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_GREATER, TMP2, 0, STR_END, 0);
  7245. jump[2] = JUMP(SLJIT_GREATER);
  7246. add_jump(compiler, backtracks, JUMP(SLJIT_NOT_EQUAL) /* LESS */);
  7247. /* Equal. */
  7248. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  7249. jump[3] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL);
  7250. add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
  7251. JUMPHERE(jump[1]);
  7252. if (common->nltype == NLTYPE_ANYCRLF)
  7253. {
  7254. OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  7255. add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, STR_END, 0));
  7256. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL));
  7257. }
  7258. else
  7259. {
  7260. OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);
  7261. read_char(common, common->nlmin, common->nlmax, backtracks, READ_CHAR_UPDATE_STR_PTR);
  7262. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, STR_END, 0));
  7263. add_jump(compiler, &common->anynewline, JUMP(SLJIT_FAST_CALL));
  7264. sljit_set_current_flags(compiler, SLJIT_SET_Z);
  7265. add_jump(compiler, backtracks, JUMP(SLJIT_ZERO));
  7266. OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
  7267. }
  7268. JUMPHERE(jump[2]);
  7269. JUMPHERE(jump[3]);
  7270. }
  7271. JUMPHERE(jump[0]);
  7272. if (common->mode != PCRE2_JIT_COMPLETE)
  7273. check_partial(common, TRUE);
  7274. return cc;
  7275. case OP_EOD:
  7276. add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0));
  7277. if (common->mode != PCRE2_JIT_COMPLETE)
  7278. check_partial(common, TRUE);
  7279. return cc;
  7280. case OP_DOLL:
  7281. if (HAS_VIRTUAL_REGISTERS)
  7282. {
  7283. OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
  7284. OP2U(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
  7285. }
  7286. else
  7287. OP2U(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
  7288. add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO));
  7289. if (!common->endonly)
  7290. compile_simple_assertion_matchingpath(common, OP_EODN, cc, backtracks);
  7291. else
  7292. {
  7293. add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0));
  7294. check_partial(common, FALSE);
  7295. }
  7296. return cc;
  7297. case OP_DOLLM:
  7298. jump[1] = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
  7299. if (HAS_VIRTUAL_REGISTERS)
  7300. {
  7301. OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
  7302. OP2U(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
  7303. }
  7304. else
  7305. OP2U(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
  7306. add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO));
  7307. check_partial(common, FALSE);
  7308. jump[0] = JUMP(SLJIT_JUMP);
  7309. JUMPHERE(jump[1]);
  7310. if (common->nltype == NLTYPE_FIXED && common->newline > 255)
  7311. {
  7312. OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  7313. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  7314. if (common->mode == PCRE2_JIT_COMPLETE)
  7315. add_jump(compiler, backtracks, CMP(SLJIT_GREATER, TMP2, 0, STR_END, 0));
  7316. else
  7317. {
  7318. jump[1] = CMP(SLJIT_LESS_EQUAL, TMP2, 0, STR_END, 0);
  7319. /* STR_PTR = STR_END - IN_UCHARS(1) */
  7320. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff));
  7321. check_partial(common, TRUE);
  7322. add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
  7323. JUMPHERE(jump[1]);
  7324. }
  7325. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
  7326. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff));
  7327. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff));
  7328. }
  7329. else
  7330. {
  7331. peek_char(common, common->nlmax, TMP3, 0, NULL);
  7332. check_newlinechar(common, common->nltype, backtracks, FALSE);
  7333. }
  7334. JUMPHERE(jump[0]);
  7335. return cc;
  7336. case OP_CIRC:
  7337. if (HAS_VIRTUAL_REGISTERS)
  7338. {
  7339. OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
  7340. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin));
  7341. add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0));
  7342. OP2U(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
  7343. add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO));
  7344. }
  7345. else
  7346. {
  7347. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
  7348. add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0));
  7349. OP2U(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
  7350. add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO));
  7351. }
  7352. return cc;
  7353. case OP_CIRCM:
  7354. /* TMP2 might be used by peek_char_back. */
  7355. if (HAS_VIRTUAL_REGISTERS)
  7356. {
  7357. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  7358. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
  7359. jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP2, 0);
  7360. OP2U(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
  7361. }
  7362. else
  7363. {
  7364. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
  7365. jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP2, 0);
  7366. OP2U(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
  7367. }
  7368. add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO));
  7369. jump[0] = JUMP(SLJIT_JUMP);
  7370. JUMPHERE(jump[1]);
  7371. if (!common->alt_circumflex)
  7372. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
  7373. if (common->nltype == NLTYPE_FIXED && common->newline > 255)
  7374. {
  7375. OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
  7376. add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, TMP2, 0));
  7377. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));
  7378. OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
  7379. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff));
  7380. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff));
  7381. }
  7382. else
  7383. {
  7384. peek_char_back(common, common->nlmax, backtracks);
  7385. check_newlinechar(common, common->nltype, backtracks, FALSE);
  7386. }
  7387. JUMPHERE(jump[0]);
  7388. return cc;
  7389. case OP_REVERSE:
  7390. length = GET(cc, 0);
  7391. if (length == 0)
  7392. return cc + LINK_SIZE;
  7393. if (HAS_VIRTUAL_REGISTERS)
  7394. {
  7395. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  7396. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
  7397. }
  7398. else
  7399. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
  7400. #ifdef SUPPORT_UNICODE
  7401. if (common->utf)
  7402. {
  7403. OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, length);
  7404. label = LABEL();
  7405. add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0));
  7406. move_back(common, backtracks, FALSE);
  7407. OP2(SLJIT_SUB | SLJIT_SET_Z, TMP3, 0, TMP3, 0, SLJIT_IMM, 1);
  7408. JUMPTO(SLJIT_NOT_ZERO, label);
  7409. }
  7410. else
  7411. #endif
  7412. {
  7413. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length));
  7414. add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0));
  7415. }
  7416. check_start_used_ptr(common);
  7417. return cc + LINK_SIZE;
  7418. }
  7419. SLJIT_UNREACHABLE();
  7420. return cc;
  7421. }
  7422. #ifdef SUPPORT_UNICODE
  7423. #if PCRE2_CODE_UNIT_WIDTH != 32
  7424. static PCRE2_SPTR SLJIT_FUNC do_extuni_utf(jit_arguments *args, PCRE2_SPTR cc)
  7425. {
  7426. PCRE2_SPTR start_subject = args->begin;
  7427. PCRE2_SPTR end_subject = args->end;
  7428. int lgb, rgb, ricount;
  7429. PCRE2_SPTR prevcc, endcc, bptr;
  7430. BOOL first = TRUE;
  7431. uint32_t c;
  7432. prevcc = cc;
  7433. endcc = NULL;
  7434. do
  7435. {
  7436. GETCHARINC(c, cc);
  7437. rgb = UCD_GRAPHBREAK(c);
  7438. if (first)
  7439. {
  7440. lgb = rgb;
  7441. endcc = cc;
  7442. first = FALSE;
  7443. continue;
  7444. }
  7445. if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0)
  7446. break;
  7447. /* Not breaking between Regional Indicators is allowed only if there
  7448. are an even number of preceding RIs. */
  7449. if (lgb == ucp_gbRegional_Indicator && rgb == ucp_gbRegional_Indicator)
  7450. {
  7451. ricount = 0;
  7452. bptr = prevcc;
  7453. /* bptr is pointing to the left-hand character */
  7454. while (bptr > start_subject)
  7455. {
  7456. bptr--;
  7457. BACKCHAR(bptr);
  7458. GETCHAR(c, bptr);
  7459. if (UCD_GRAPHBREAK(c) != ucp_gbRegional_Indicator)
  7460. break;
  7461. ricount++;
  7462. }
  7463. if ((ricount & 1) != 0) break; /* Grapheme break required */
  7464. }
  7465. /* If Extend or ZWJ follows Extended_Pictographic, do not update lgb; this
  7466. allows any number of them before a following Extended_Pictographic. */
  7467. if ((rgb != ucp_gbExtend && rgb != ucp_gbZWJ) ||
  7468. lgb != ucp_gbExtended_Pictographic)
  7469. lgb = rgb;
  7470. prevcc = endcc;
  7471. endcc = cc;
  7472. }
  7473. while (cc < end_subject);
  7474. return endcc;
  7475. }
  7476. #endif /* PCRE2_CODE_UNIT_WIDTH != 32 */
  7477. static PCRE2_SPTR SLJIT_FUNC do_extuni_utf_invalid(jit_arguments *args, PCRE2_SPTR cc)
  7478. {
  7479. PCRE2_SPTR start_subject = args->begin;
  7480. PCRE2_SPTR end_subject = args->end;
  7481. int lgb, rgb, ricount;
  7482. PCRE2_SPTR prevcc, endcc, bptr;
  7483. BOOL first = TRUE;
  7484. uint32_t c;
  7485. prevcc = cc;
  7486. endcc = NULL;
  7487. do
  7488. {
  7489. GETCHARINC_INVALID(c, cc, end_subject, break);
  7490. rgb = UCD_GRAPHBREAK(c);
  7491. if (first)
  7492. {
  7493. lgb = rgb;
  7494. endcc = cc;
  7495. first = FALSE;
  7496. continue;
  7497. }
  7498. if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0)
  7499. break;
  7500. /* Not breaking between Regional Indicators is allowed only if there
  7501. are an even number of preceding RIs. */
  7502. if (lgb == ucp_gbRegional_Indicator && rgb == ucp_gbRegional_Indicator)
  7503. {
  7504. ricount = 0;
  7505. bptr = prevcc;
  7506. /* bptr is pointing to the left-hand character */
  7507. while (bptr > start_subject)
  7508. {
  7509. GETCHARBACK_INVALID(c, bptr, start_subject, break);
  7510. if (UCD_GRAPHBREAK(c) != ucp_gbRegional_Indicator)
  7511. break;
  7512. ricount++;
  7513. }
  7514. if ((ricount & 1) != 0)
  7515. break; /* Grapheme break required */
  7516. }
  7517. /* If Extend or ZWJ follows Extended_Pictographic, do not update lgb; this
  7518. allows any number of them before a following Extended_Pictographic. */
  7519. if ((rgb != ucp_gbExtend && rgb != ucp_gbZWJ) ||
  7520. lgb != ucp_gbExtended_Pictographic)
  7521. lgb = rgb;
  7522. prevcc = endcc;
  7523. endcc = cc;
  7524. }
  7525. while (cc < end_subject);
  7526. return endcc;
  7527. }
  7528. static PCRE2_SPTR SLJIT_FUNC do_extuni_no_utf(jit_arguments *args, PCRE2_SPTR cc)
  7529. {
  7530. PCRE2_SPTR start_subject = args->begin;
  7531. PCRE2_SPTR end_subject = args->end;
  7532. int lgb, rgb, ricount;
  7533. PCRE2_SPTR bptr;
  7534. uint32_t c;
  7535. /* Patch by PH */
  7536. /* GETCHARINC(c, cc); */
  7537. c = *cc++;
  7538. #if PCRE2_CODE_UNIT_WIDTH == 32
  7539. if (c >= 0x110000)
  7540. return NULL;
  7541. #endif /* PCRE2_CODE_UNIT_WIDTH == 32 */
  7542. lgb = UCD_GRAPHBREAK(c);
  7543. while (cc < end_subject)
  7544. {
  7545. c = *cc;
  7546. #if PCRE2_CODE_UNIT_WIDTH == 32
  7547. if (c >= 0x110000)
  7548. break;
  7549. #endif /* PCRE2_CODE_UNIT_WIDTH == 32 */
  7550. rgb = UCD_GRAPHBREAK(c);
  7551. if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0)
  7552. break;
  7553. /* Not breaking between Regional Indicators is allowed only if there
  7554. are an even number of preceding RIs. */
  7555. if (lgb == ucp_gbRegional_Indicator && rgb == ucp_gbRegional_Indicator)
  7556. {
  7557. ricount = 0;
  7558. bptr = cc - 1;
  7559. /* bptr is pointing to the left-hand character */
  7560. while (bptr > start_subject)
  7561. {
  7562. bptr--;
  7563. c = *bptr;
  7564. #if PCRE2_CODE_UNIT_WIDTH == 32
  7565. if (c >= 0x110000)
  7566. break;
  7567. #endif /* PCRE2_CODE_UNIT_WIDTH == 32 */
  7568. if (UCD_GRAPHBREAK(c) != ucp_gbRegional_Indicator) break;
  7569. ricount++;
  7570. }
  7571. if ((ricount & 1) != 0)
  7572. break; /* Grapheme break required */
  7573. }
  7574. /* If Extend or ZWJ follows Extended_Pictographic, do not update lgb; this
  7575. allows any number of them before a following Extended_Pictographic. */
  7576. if ((rgb != ucp_gbExtend && rgb != ucp_gbZWJ) ||
  7577. lgb != ucp_gbExtended_Pictographic)
  7578. lgb = rgb;
  7579. cc++;
  7580. }
  7581. return cc;
  7582. }
  7583. #endif /* SUPPORT_UNICODE */
  7584. static PCRE2_SPTR compile_char1_matchingpath(compiler_common *common, PCRE2_UCHAR type, PCRE2_SPTR cc, jump_list **backtracks, BOOL check_str_ptr)
  7585. {
  7586. DEFINE_COMPILER;
  7587. int length;
  7588. unsigned int c, oc, bit;
  7589. compare_context context;
  7590. struct sljit_jump *jump[3];
  7591. jump_list *end_list;
  7592. #ifdef SUPPORT_UNICODE
  7593. PCRE2_UCHAR propdata[5];
  7594. #endif /* SUPPORT_UNICODE */
  7595. switch(type)
  7596. {
  7597. case OP_NOT_DIGIT:
  7598. case OP_DIGIT:
  7599. /* Digits are usually 0-9, so it is worth to optimize them. */
  7600. if (check_str_ptr)
  7601. detect_partial_match(common, backtracks);
  7602. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  7603. if (common->utf && is_char7_bitset((const sljit_u8*)common->ctypes - cbit_length + cbit_digit, FALSE))
  7604. read_char7_type(common, backtracks, type == OP_NOT_DIGIT);
  7605. else
  7606. #endif
  7607. read_char8_type(common, backtracks, type == OP_NOT_DIGIT);
  7608. /* Flip the starting bit in the negative case. */
  7609. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, ctype_digit);
  7610. add_jump(compiler, backtracks, JUMP(type == OP_DIGIT ? SLJIT_ZERO : SLJIT_NOT_ZERO));
  7611. return cc;
  7612. case OP_NOT_WHITESPACE:
  7613. case OP_WHITESPACE:
  7614. if (check_str_ptr)
  7615. detect_partial_match(common, backtracks);
  7616. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  7617. if (common->utf && is_char7_bitset((const sljit_u8*)common->ctypes - cbit_length + cbit_space, FALSE))
  7618. read_char7_type(common, backtracks, type == OP_NOT_WHITESPACE);
  7619. else
  7620. #endif
  7621. read_char8_type(common, backtracks, type == OP_NOT_WHITESPACE);
  7622. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, ctype_space);
  7623. add_jump(compiler, backtracks, JUMP(type == OP_WHITESPACE ? SLJIT_ZERO : SLJIT_NOT_ZERO));
  7624. return cc;
  7625. case OP_NOT_WORDCHAR:
  7626. case OP_WORDCHAR:
  7627. if (check_str_ptr)
  7628. detect_partial_match(common, backtracks);
  7629. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  7630. if (common->utf && is_char7_bitset((const sljit_u8*)common->ctypes - cbit_length + cbit_word, FALSE))
  7631. read_char7_type(common, backtracks, type == OP_NOT_WORDCHAR);
  7632. else
  7633. #endif
  7634. read_char8_type(common, backtracks, type == OP_NOT_WORDCHAR);
  7635. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, ctype_word);
  7636. add_jump(compiler, backtracks, JUMP(type == OP_WORDCHAR ? SLJIT_ZERO : SLJIT_NOT_ZERO));
  7637. return cc;
  7638. case OP_ANY:
  7639. if (check_str_ptr)
  7640. detect_partial_match(common, backtracks);
  7641. read_char(common, common->nlmin, common->nlmax, backtracks, READ_CHAR_UPDATE_STR_PTR);
  7642. if (common->nltype == NLTYPE_FIXED && common->newline > 255)
  7643. {
  7644. jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff);
  7645. end_list = NULL;
  7646. if (common->mode != PCRE2_JIT_PARTIAL_HARD)
  7647. add_jump(compiler, &end_list, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
  7648. else
  7649. check_str_end(common, &end_list);
  7650. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  7651. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline & 0xff));
  7652. set_jumps(end_list, LABEL());
  7653. JUMPHERE(jump[0]);
  7654. }
  7655. else
  7656. check_newlinechar(common, common->nltype, backtracks, TRUE);
  7657. return cc;
  7658. case OP_ALLANY:
  7659. if (check_str_ptr)
  7660. detect_partial_match(common, backtracks);
  7661. #ifdef SUPPORT_UNICODE
  7662. if (common->utf)
  7663. {
  7664. if (common->invalid_utf)
  7665. {
  7666. read_char(common, 0, READ_CHAR_MAX, backtracks, READ_CHAR_UPDATE_STR_PTR);
  7667. return cc;
  7668. }
  7669. #if PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16
  7670. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  7671. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  7672. #if PCRE2_CODE_UNIT_WIDTH == 8
  7673. jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);
  7674. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
  7675. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
  7676. #elif PCRE2_CODE_UNIT_WIDTH == 16
  7677. jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800);
  7678. OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);
  7679. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0xd800);
  7680. OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);
  7681. OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
  7682. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
  7683. #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
  7684. JUMPHERE(jump[0]);
  7685. return cc;
  7686. #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16] */
  7687. }
  7688. #endif /* SUPPORT_UNICODE */
  7689. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  7690. return cc;
  7691. case OP_ANYBYTE:
  7692. if (check_str_ptr)
  7693. detect_partial_match(common, backtracks);
  7694. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  7695. return cc;
  7696. #ifdef SUPPORT_UNICODE
  7697. case OP_NOTPROP:
  7698. case OP_PROP:
  7699. propdata[0] = XCL_HASPROP;
  7700. propdata[1] = type == OP_NOTPROP ? XCL_NOTPROP : XCL_PROP;
  7701. propdata[2] = cc[0];
  7702. propdata[3] = cc[1];
  7703. propdata[4] = XCL_END;
  7704. if (check_str_ptr)
  7705. detect_partial_match(common, backtracks);
  7706. compile_xclass_matchingpath(common, propdata, backtracks);
  7707. return cc + 2;
  7708. #endif
  7709. case OP_ANYNL:
  7710. if (check_str_ptr)
  7711. detect_partial_match(common, backtracks);
  7712. read_char(common, common->bsr_nlmin, common->bsr_nlmax, NULL, 0);
  7713. jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR);
  7714. /* We don't need to handle soft partial matching case. */
  7715. end_list = NULL;
  7716. if (common->mode != PCRE2_JIT_PARTIAL_HARD)
  7717. add_jump(compiler, &end_list, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
  7718. else
  7719. check_str_end(common, &end_list);
  7720. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  7721. jump[1] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL);
  7722. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  7723. jump[2] = JUMP(SLJIT_JUMP);
  7724. JUMPHERE(jump[0]);
  7725. check_newlinechar(common, common->bsr_nltype, backtracks, FALSE);
  7726. set_jumps(end_list, LABEL());
  7727. JUMPHERE(jump[1]);
  7728. JUMPHERE(jump[2]);
  7729. return cc;
  7730. case OP_NOT_HSPACE:
  7731. case OP_HSPACE:
  7732. if (check_str_ptr)
  7733. detect_partial_match(common, backtracks);
  7734. if (type == OP_NOT_HSPACE)
  7735. read_char(common, 0x9, 0x3000, backtracks, READ_CHAR_UPDATE_STR_PTR);
  7736. else
  7737. read_char(common, 0x9, 0x3000, NULL, 0);
  7738. add_jump(compiler, &common->hspace, JUMP(SLJIT_FAST_CALL));
  7739. sljit_set_current_flags(compiler, SLJIT_SET_Z);
  7740. add_jump(compiler, backtracks, JUMP(type == OP_NOT_HSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO));
  7741. return cc;
  7742. case OP_NOT_VSPACE:
  7743. case OP_VSPACE:
  7744. if (check_str_ptr)
  7745. detect_partial_match(common, backtracks);
  7746. if (type == OP_NOT_VSPACE)
  7747. read_char(common, 0xa, 0x2029, backtracks, READ_CHAR_UPDATE_STR_PTR);
  7748. else
  7749. read_char(common, 0xa, 0x2029, NULL, 0);
  7750. add_jump(compiler, &common->vspace, JUMP(SLJIT_FAST_CALL));
  7751. sljit_set_current_flags(compiler, SLJIT_SET_Z);
  7752. add_jump(compiler, backtracks, JUMP(type == OP_NOT_VSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO));
  7753. return cc;
  7754. #ifdef SUPPORT_UNICODE
  7755. case OP_EXTUNI:
  7756. if (check_str_ptr)
  7757. detect_partial_match(common, backtracks);
  7758. SLJIT_ASSERT(TMP1 == SLJIT_R0 && STR_PTR == SLJIT_R1);
  7759. OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0);
  7760. #if PCRE2_CODE_UNIT_WIDTH != 32
  7761. sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W), SLJIT_IMM,
  7762. common->utf ? (common->invalid_utf ? SLJIT_FUNC_ADDR(do_extuni_utf_invalid) : SLJIT_FUNC_ADDR(do_extuni_utf)) : SLJIT_FUNC_ADDR(do_extuni_no_utf));
  7763. if (common->invalid_utf)
  7764. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0));
  7765. #else
  7766. sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W), SLJIT_IMM,
  7767. common->invalid_utf ? SLJIT_FUNC_ADDR(do_extuni_utf_invalid) : SLJIT_FUNC_ADDR(do_extuni_no_utf));
  7768. if (!common->utf || common->invalid_utf)
  7769. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0));
  7770. #endif
  7771. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
  7772. if (common->mode == PCRE2_JIT_PARTIAL_HARD)
  7773. {
  7774. jump[0] = CMP(SLJIT_LESS, SLJIT_RETURN_REG, 0, STR_END, 0);
  7775. /* Since we successfully read a char above, partial matching must occure. */
  7776. check_partial(common, TRUE);
  7777. JUMPHERE(jump[0]);
  7778. }
  7779. return cc;
  7780. #endif
  7781. case OP_CHAR:
  7782. case OP_CHARI:
  7783. length = 1;
  7784. #ifdef SUPPORT_UNICODE
  7785. if (common->utf && HAS_EXTRALEN(*cc)) length += GET_EXTRALEN(*cc);
  7786. #endif
  7787. if (check_str_ptr && common->mode != PCRE2_JIT_COMPLETE)
  7788. detect_partial_match(common, backtracks);
  7789. if (type == OP_CHAR || !char_has_othercase(common, cc) || char_get_othercase_bit(common, cc) != 0)
  7790. {
  7791. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length));
  7792. if (length > 1 || (check_str_ptr && common->mode == PCRE2_JIT_COMPLETE))
  7793. add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0));
  7794. context.length = IN_UCHARS(length);
  7795. context.sourcereg = -1;
  7796. #if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED
  7797. context.ucharptr = 0;
  7798. #endif
  7799. return byte_sequence_compare(common, type == OP_CHARI, cc, &context, backtracks);
  7800. }
  7801. #ifdef SUPPORT_UNICODE
  7802. if (common->utf)
  7803. {
  7804. GETCHAR(c, cc);
  7805. }
  7806. else
  7807. #endif
  7808. c = *cc;
  7809. SLJIT_ASSERT(type == OP_CHARI && char_has_othercase(common, cc));
  7810. if (check_str_ptr && common->mode == PCRE2_JIT_COMPLETE)
  7811. add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
  7812. oc = char_othercase(common, c);
  7813. read_char(common, c < oc ? c : oc, c > oc ? c : oc, NULL, 0);
  7814. SLJIT_ASSERT(!is_powerof2(c ^ oc));
  7815. if (sljit_has_cpu_feature(SLJIT_HAS_CMOV))
  7816. {
  7817. OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, oc);
  7818. CMOV(SLJIT_EQUAL, TMP1, SLJIT_IMM, c);
  7819. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, c));
  7820. }
  7821. else
  7822. {
  7823. jump[0] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c);
  7824. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, oc));
  7825. JUMPHERE(jump[0]);
  7826. }
  7827. return cc + length;
  7828. case OP_NOT:
  7829. case OP_NOTI:
  7830. if (check_str_ptr)
  7831. detect_partial_match(common, backtracks);
  7832. length = 1;
  7833. #ifdef SUPPORT_UNICODE
  7834. if (common->utf)
  7835. {
  7836. #if PCRE2_CODE_UNIT_WIDTH == 8
  7837. c = *cc;
  7838. if (c < 128 && !common->invalid_utf)
  7839. {
  7840. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
  7841. if (type == OP_NOT || !char_has_othercase(common, cc))
  7842. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c));
  7843. else
  7844. {
  7845. /* Since UTF8 code page is fixed, we know that c is in [a-z] or [A-Z] range. */
  7846. OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x20);
  7847. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, c | 0x20));
  7848. }
  7849. /* Skip the variable-length character. */
  7850. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  7851. jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);
  7852. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
  7853. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
  7854. JUMPHERE(jump[0]);
  7855. return cc + 1;
  7856. }
  7857. else
  7858. #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
  7859. {
  7860. GETCHARLEN(c, cc, length);
  7861. }
  7862. }
  7863. else
  7864. #endif /* SUPPORT_UNICODE */
  7865. c = *cc;
  7866. if (type == OP_NOT || !char_has_othercase(common, cc))
  7867. {
  7868. read_char(common, c, c, backtracks, READ_CHAR_UPDATE_STR_PTR);
  7869. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c));
  7870. }
  7871. else
  7872. {
  7873. oc = char_othercase(common, c);
  7874. read_char(common, c < oc ? c : oc, c > oc ? c : oc, backtracks, READ_CHAR_UPDATE_STR_PTR);
  7875. bit = c ^ oc;
  7876. if (is_powerof2(bit))
  7877. {
  7878. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, bit);
  7879. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c | bit));
  7880. }
  7881. else
  7882. {
  7883. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c));
  7884. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, oc));
  7885. }
  7886. }
  7887. return cc + length;
  7888. case OP_CLASS:
  7889. case OP_NCLASS:
  7890. if (check_str_ptr)
  7891. detect_partial_match(common, backtracks);
  7892. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  7893. bit = (common->utf && is_char7_bitset((const sljit_u8 *)cc, type == OP_NCLASS)) ? 127 : 255;
  7894. if (type == OP_NCLASS)
  7895. read_char(common, 0, bit, backtracks, READ_CHAR_UPDATE_STR_PTR);
  7896. else
  7897. read_char(common, 0, bit, NULL, 0);
  7898. #else
  7899. if (type == OP_NCLASS)
  7900. read_char(common, 0, 255, backtracks, READ_CHAR_UPDATE_STR_PTR);
  7901. else
  7902. read_char(common, 0, 255, NULL, 0);
  7903. #endif
  7904. if (optimize_class(common, (const sljit_u8 *)cc, type == OP_NCLASS, FALSE, backtracks))
  7905. return cc + 32 / sizeof(PCRE2_UCHAR);
  7906. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
  7907. jump[0] = NULL;
  7908. if (common->utf)
  7909. {
  7910. jump[0] = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, bit);
  7911. if (type == OP_CLASS)
  7912. {
  7913. add_jump(compiler, backtracks, jump[0]);
  7914. jump[0] = NULL;
  7915. }
  7916. }
  7917. #elif PCRE2_CODE_UNIT_WIDTH != 8
  7918. jump[0] = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
  7919. if (type == OP_CLASS)
  7920. {
  7921. add_jump(compiler, backtracks, jump[0]);
  7922. jump[0] = NULL;
  7923. }
  7924. #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 */
  7925. OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7);
  7926. OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);
  7927. OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc);
  7928. OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0);
  7929. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP1, 0, TMP2, 0);
  7930. add_jump(compiler, backtracks, JUMP(SLJIT_ZERO));
  7931. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
  7932. if (jump[0] != NULL)
  7933. JUMPHERE(jump[0]);
  7934. #endif
  7935. return cc + 32 / sizeof(PCRE2_UCHAR);
  7936. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  7937. case OP_XCLASS:
  7938. if (check_str_ptr)
  7939. detect_partial_match(common, backtracks);
  7940. compile_xclass_matchingpath(common, cc + LINK_SIZE, backtracks);
  7941. return cc + GET(cc, 0) - 1;
  7942. #endif
  7943. }
  7944. SLJIT_UNREACHABLE();
  7945. return cc;
  7946. }
  7947. static SLJIT_INLINE PCRE2_SPTR compile_charn_matchingpath(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, jump_list **backtracks)
  7948. {
  7949. /* This function consumes at least one input character. */
  7950. /* To decrease the number of length checks, we try to concatenate the fixed length character sequences. */
  7951. DEFINE_COMPILER;
  7952. PCRE2_SPTR ccbegin = cc;
  7953. compare_context context;
  7954. int size;
  7955. context.length = 0;
  7956. do
  7957. {
  7958. if (cc >= ccend)
  7959. break;
  7960. if (*cc == OP_CHAR)
  7961. {
  7962. size = 1;
  7963. #ifdef SUPPORT_UNICODE
  7964. if (common->utf && HAS_EXTRALEN(cc[1]))
  7965. size += GET_EXTRALEN(cc[1]);
  7966. #endif
  7967. }
  7968. else if (*cc == OP_CHARI)
  7969. {
  7970. size = 1;
  7971. #ifdef SUPPORT_UNICODE
  7972. if (common->utf)
  7973. {
  7974. if (char_has_othercase(common, cc + 1) && char_get_othercase_bit(common, cc + 1) == 0)
  7975. size = 0;
  7976. else if (HAS_EXTRALEN(cc[1]))
  7977. size += GET_EXTRALEN(cc[1]);
  7978. }
  7979. else
  7980. #endif
  7981. if (char_has_othercase(common, cc + 1) && char_get_othercase_bit(common, cc + 1) == 0)
  7982. size = 0;
  7983. }
  7984. else
  7985. size = 0;
  7986. cc += 1 + size;
  7987. context.length += IN_UCHARS(size);
  7988. }
  7989. while (size > 0 && context.length <= 128);
  7990. cc = ccbegin;
  7991. if (context.length > 0)
  7992. {
  7993. /* We have a fixed-length byte sequence. */
  7994. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, context.length);
  7995. add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0));
  7996. context.sourcereg = -1;
  7997. #if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED
  7998. context.ucharptr = 0;
  7999. #endif
  8000. do cc = byte_sequence_compare(common, *cc == OP_CHARI, cc + 1, &context, backtracks); while (context.length > 0);
  8001. return cc;
  8002. }
  8003. /* A non-fixed length character will be checked if length == 0. */
  8004. return compile_char1_matchingpath(common, *cc, cc + 1, backtracks, TRUE);
  8005. }
  8006. /* Forward definitions. */
  8007. static void compile_matchingpath(compiler_common *, PCRE2_SPTR, PCRE2_SPTR, backtrack_common *);
  8008. static void compile_backtrackingpath(compiler_common *, struct backtrack_common *);
  8009. #define PUSH_BACKTRACK(size, ccstart, error) \
  8010. do \
  8011. { \
  8012. backtrack = sljit_alloc_memory(compiler, (size)); \
  8013. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \
  8014. return error; \
  8015. memset(backtrack, 0, size); \
  8016. backtrack->prev = parent->top; \
  8017. backtrack->cc = (ccstart); \
  8018. parent->top = backtrack; \
  8019. } \
  8020. while (0)
  8021. #define PUSH_BACKTRACK_NOVALUE(size, ccstart) \
  8022. do \
  8023. { \
  8024. backtrack = sljit_alloc_memory(compiler, (size)); \
  8025. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \
  8026. return; \
  8027. memset(backtrack, 0, size); \
  8028. backtrack->prev = parent->top; \
  8029. backtrack->cc = (ccstart); \
  8030. parent->top = backtrack; \
  8031. } \
  8032. while (0)
  8033. #define BACKTRACK_AS(type) ((type *)backtrack)
  8034. static void compile_dnref_search(compiler_common *common, PCRE2_SPTR cc, jump_list **backtracks)
  8035. {
  8036. /* The OVECTOR offset goes to TMP2. */
  8037. DEFINE_COMPILER;
  8038. int count = GET2(cc, 1 + IMM2_SIZE);
  8039. PCRE2_SPTR slot = common->name_table + GET2(cc, 1) * common->name_entry_size;
  8040. unsigned int offset;
  8041. jump_list *found = NULL;
  8042. SLJIT_ASSERT(*cc == OP_DNREF || *cc == OP_DNREFI);
  8043. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));
  8044. count--;
  8045. while (count-- > 0)
  8046. {
  8047. offset = GET2(slot, 0) << 1;
  8048. GET_LOCAL_BASE(TMP2, 0, OVECTOR(offset));
  8049. add_jump(compiler, &found, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0));
  8050. slot += common->name_entry_size;
  8051. }
  8052. offset = GET2(slot, 0) << 1;
  8053. GET_LOCAL_BASE(TMP2, 0, OVECTOR(offset));
  8054. if (backtracks != NULL && !common->unset_backref)
  8055. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0));
  8056. set_jumps(found, LABEL());
  8057. }
  8058. static void compile_ref_matchingpath(compiler_common *common, PCRE2_SPTR cc, jump_list **backtracks, BOOL withchecks, BOOL emptyfail)
  8059. {
  8060. DEFINE_COMPILER;
  8061. BOOL ref = (*cc == OP_REF || *cc == OP_REFI);
  8062. int offset = 0;
  8063. struct sljit_jump *jump = NULL;
  8064. struct sljit_jump *partial;
  8065. struct sljit_jump *nopartial;
  8066. #if defined SUPPORT_UNICODE
  8067. struct sljit_label *loop;
  8068. struct sljit_label *caseless_loop;
  8069. jump_list *no_match = NULL;
  8070. int source_reg = COUNT_MATCH;
  8071. int source_end_reg = ARGUMENTS;
  8072. int char1_reg = STACK_LIMIT;
  8073. #endif /* SUPPORT_UNICODE */
  8074. if (ref)
  8075. {
  8076. offset = GET2(cc, 1) << 1;
  8077. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));
  8078. /* OVECTOR(1) contains the "string begin - 1" constant. */
  8079. if (withchecks && !common->unset_backref)
  8080. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));
  8081. }
  8082. else
  8083. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);
  8084. #if defined SUPPORT_UNICODE
  8085. if (common->utf && *cc == OP_REFI)
  8086. {
  8087. SLJIT_ASSERT(common->iref_ptr != 0);
  8088. if (ref)
  8089. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
  8090. else
  8091. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
  8092. if (withchecks && emptyfail)
  8093. add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, TMP2, 0));
  8094. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->iref_ptr, source_reg, 0);
  8095. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw), source_end_reg, 0);
  8096. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw) * 2, char1_reg, 0);
  8097. OP1(SLJIT_MOV, source_reg, 0, TMP1, 0);
  8098. OP1(SLJIT_MOV, source_end_reg, 0, TMP2, 0);
  8099. loop = LABEL();
  8100. jump = CMP(SLJIT_GREATER_EQUAL, source_reg, 0, source_end_reg, 0);
  8101. partial = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
  8102. /* Read original character. It must be a valid UTF character. */
  8103. OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);
  8104. OP1(SLJIT_MOV, STR_PTR, 0, source_reg, 0);
  8105. read_char(common, 0, READ_CHAR_MAX, NULL, READ_CHAR_UPDATE_STR_PTR | READ_CHAR_VALID_UTF);
  8106. OP1(SLJIT_MOV, source_reg, 0, STR_PTR, 0);
  8107. OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
  8108. OP1(SLJIT_MOV, char1_reg, 0, TMP1, 0);
  8109. /* Read second character. */
  8110. read_char(common, 0, READ_CHAR_MAX, &no_match, READ_CHAR_UPDATE_STR_PTR);
  8111. CMPTO(SLJIT_EQUAL, TMP1, 0, char1_reg, 0, loop);
  8112. OP1(SLJIT_MOV, TMP3, 0, TMP1, 0);
  8113. add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));
  8114. OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
  8115. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);
  8116. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
  8117. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records));
  8118. OP1(SLJIT_MOV_S32, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(ucd_record, other_case));
  8119. OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(ucd_record, caseset));
  8120. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP3, 0);
  8121. CMPTO(SLJIT_EQUAL, TMP1, 0, char1_reg, 0, loop);
  8122. add_jump(compiler, &no_match, CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0));
  8123. OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 2);
  8124. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_caseless_sets));
  8125. caseless_loop = LABEL();
  8126. OP1(SLJIT_MOV_U32, TMP1, 0, SLJIT_MEM1(TMP2), 0);
  8127. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, sizeof(uint32_t));
  8128. OP2U(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_LESS, TMP1, 0, char1_reg, 0);
  8129. JUMPTO(SLJIT_EQUAL, loop);
  8130. JUMPTO(SLJIT_LESS, caseless_loop);
  8131. set_jumps(no_match, LABEL());
  8132. if (common->mode == PCRE2_JIT_COMPLETE)
  8133. JUMPHERE(partial);
  8134. OP1(SLJIT_MOV, source_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr);
  8135. OP1(SLJIT_MOV, source_end_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw));
  8136. OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw) * 2);
  8137. add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
  8138. if (common->mode != PCRE2_JIT_COMPLETE)
  8139. {
  8140. JUMPHERE(partial);
  8141. OP1(SLJIT_MOV, source_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr);
  8142. OP1(SLJIT_MOV, source_end_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw));
  8143. OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw) * 2);
  8144. check_partial(common, FALSE);
  8145. add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
  8146. }
  8147. JUMPHERE(jump);
  8148. OP1(SLJIT_MOV, source_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr);
  8149. OP1(SLJIT_MOV, source_end_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw));
  8150. OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw) * 2);
  8151. return;
  8152. }
  8153. else
  8154. #endif /* SUPPORT_UNICODE */
  8155. {
  8156. if (ref)
  8157. OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP1, 0);
  8158. else
  8159. OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw), TMP1, 0);
  8160. if (withchecks)
  8161. jump = JUMP(SLJIT_ZERO);
  8162. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
  8163. partial = CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0);
  8164. if (common->mode == PCRE2_JIT_COMPLETE)
  8165. add_jump(compiler, backtracks, partial);
  8166. add_jump(compiler, *cc == OP_REF ? &common->casefulcmp : &common->caselesscmp, JUMP(SLJIT_FAST_CALL));
  8167. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));
  8168. if (common->mode != PCRE2_JIT_COMPLETE)
  8169. {
  8170. nopartial = JUMP(SLJIT_JUMP);
  8171. JUMPHERE(partial);
  8172. /* TMP2 -= STR_END - STR_PTR */
  8173. OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, STR_PTR, 0);
  8174. OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, STR_END, 0);
  8175. partial = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0);
  8176. OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);
  8177. add_jump(compiler, *cc == OP_REF ? &common->casefulcmp : &common->caselesscmp, JUMP(SLJIT_FAST_CALL));
  8178. add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));
  8179. JUMPHERE(partial);
  8180. check_partial(common, FALSE);
  8181. add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
  8182. JUMPHERE(nopartial);
  8183. }
  8184. }
  8185. if (jump != NULL)
  8186. {
  8187. if (emptyfail)
  8188. add_jump(compiler, backtracks, jump);
  8189. else
  8190. JUMPHERE(jump);
  8191. }
  8192. }
  8193. static SLJIT_INLINE PCRE2_SPTR compile_ref_iterator_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
  8194. {
  8195. DEFINE_COMPILER;
  8196. BOOL ref = (*cc == OP_REF || *cc == OP_REFI);
  8197. backtrack_common *backtrack;
  8198. PCRE2_UCHAR type;
  8199. int offset = 0;
  8200. struct sljit_label *label;
  8201. struct sljit_jump *zerolength;
  8202. struct sljit_jump *jump = NULL;
  8203. PCRE2_SPTR ccbegin = cc;
  8204. int min = 0, max = 0;
  8205. BOOL minimize;
  8206. PUSH_BACKTRACK(sizeof(ref_iterator_backtrack), cc, NULL);
  8207. if (ref)
  8208. offset = GET2(cc, 1) << 1;
  8209. else
  8210. cc += IMM2_SIZE;
  8211. type = cc[1 + IMM2_SIZE];
  8212. SLJIT_COMPILE_ASSERT((OP_CRSTAR & 0x1) == 0, crstar_opcode_must_be_even);
  8213. minimize = (type & 0x1) != 0;
  8214. switch(type)
  8215. {
  8216. case OP_CRSTAR:
  8217. case OP_CRMINSTAR:
  8218. min = 0;
  8219. max = 0;
  8220. cc += 1 + IMM2_SIZE + 1;
  8221. break;
  8222. case OP_CRPLUS:
  8223. case OP_CRMINPLUS:
  8224. min = 1;
  8225. max = 0;
  8226. cc += 1 + IMM2_SIZE + 1;
  8227. break;
  8228. case OP_CRQUERY:
  8229. case OP_CRMINQUERY:
  8230. min = 0;
  8231. max = 1;
  8232. cc += 1 + IMM2_SIZE + 1;
  8233. break;
  8234. case OP_CRRANGE:
  8235. case OP_CRMINRANGE:
  8236. min = GET2(cc, 1 + IMM2_SIZE + 1);
  8237. max = GET2(cc, 1 + IMM2_SIZE + 1 + IMM2_SIZE);
  8238. cc += 1 + IMM2_SIZE + 1 + 2 * IMM2_SIZE;
  8239. break;
  8240. default:
  8241. SLJIT_UNREACHABLE();
  8242. break;
  8243. }
  8244. if (!minimize)
  8245. {
  8246. if (min == 0)
  8247. {
  8248. allocate_stack(common, 2);
  8249. if (ref)
  8250. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));
  8251. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  8252. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0);
  8253. /* Temporary release of STR_PTR. */
  8254. OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));
  8255. /* Handles both invalid and empty cases. Since the minimum repeat,
  8256. is zero the invalid case is basically the same as an empty case. */
  8257. if (ref)
  8258. zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
  8259. else
  8260. {
  8261. compile_dnref_search(common, ccbegin, NULL);
  8262. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);
  8263. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, TMP2, 0);
  8264. zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
  8265. }
  8266. /* Restore if not zero length. */
  8267. OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));
  8268. }
  8269. else
  8270. {
  8271. allocate_stack(common, 1);
  8272. if (ref)
  8273. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));
  8274. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  8275. if (ref)
  8276. {
  8277. add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));
  8278. zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
  8279. }
  8280. else
  8281. {
  8282. compile_dnref_search(common, ccbegin, &backtrack->topbacktracks);
  8283. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);
  8284. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, TMP2, 0);
  8285. zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
  8286. }
  8287. }
  8288. if (min > 1 || max > 1)
  8289. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, SLJIT_IMM, 0);
  8290. label = LABEL();
  8291. if (!ref)
  8292. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1);
  8293. compile_ref_matchingpath(common, ccbegin, &backtrack->topbacktracks, FALSE, FALSE);
  8294. if (min > 1 || max > 1)
  8295. {
  8296. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0);
  8297. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
  8298. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, TMP1, 0);
  8299. if (min > 1)
  8300. CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, min, label);
  8301. if (max > 1)
  8302. {
  8303. jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, max);
  8304. allocate_stack(common, 1);
  8305. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  8306. JUMPTO(SLJIT_JUMP, label);
  8307. JUMPHERE(jump);
  8308. }
  8309. }
  8310. if (max == 0)
  8311. {
  8312. /* Includes min > 1 case as well. */
  8313. allocate_stack(common, 1);
  8314. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  8315. JUMPTO(SLJIT_JUMP, label);
  8316. }
  8317. JUMPHERE(zerolength);
  8318. BACKTRACK_AS(ref_iterator_backtrack)->matchingpath = LABEL();
  8319. count_match(common);
  8320. return cc;
  8321. }
  8322. allocate_stack(common, ref ? 2 : 3);
  8323. if (ref)
  8324. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));
  8325. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  8326. if (type != OP_CRMINSTAR)
  8327. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0);
  8328. if (min == 0)
  8329. {
  8330. /* Handles both invalid and empty cases. Since the minimum repeat,
  8331. is zero the invalid case is basically the same as an empty case. */
  8332. if (ref)
  8333. zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
  8334. else
  8335. {
  8336. compile_dnref_search(common, ccbegin, NULL);
  8337. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);
  8338. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP2, 0);
  8339. zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
  8340. }
  8341. /* Length is non-zero, we can match real repeats. */
  8342. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  8343. jump = JUMP(SLJIT_JUMP);
  8344. }
  8345. else
  8346. {
  8347. if (ref)
  8348. {
  8349. add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));
  8350. zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
  8351. }
  8352. else
  8353. {
  8354. compile_dnref_search(common, ccbegin, &backtrack->topbacktracks);
  8355. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);
  8356. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP2, 0);
  8357. zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
  8358. }
  8359. }
  8360. BACKTRACK_AS(ref_iterator_backtrack)->matchingpath = LABEL();
  8361. if (max > 0)
  8362. add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, max));
  8363. if (!ref)
  8364. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(2));
  8365. compile_ref_matchingpath(common, ccbegin, &backtrack->topbacktracks, TRUE, TRUE);
  8366. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  8367. if (min > 1)
  8368. {
  8369. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
  8370. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
  8371. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);
  8372. CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, min, BACKTRACK_AS(ref_iterator_backtrack)->matchingpath);
  8373. }
  8374. else if (max > 0)
  8375. OP2(SLJIT_ADD, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 1);
  8376. if (jump != NULL)
  8377. JUMPHERE(jump);
  8378. JUMPHERE(zerolength);
  8379. count_match(common);
  8380. return cc;
  8381. }
  8382. static SLJIT_INLINE PCRE2_SPTR compile_recurse_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
  8383. {
  8384. DEFINE_COMPILER;
  8385. backtrack_common *backtrack;
  8386. recurse_entry *entry = common->entries;
  8387. recurse_entry *prev = NULL;
  8388. sljit_sw start = GET(cc, 1);
  8389. PCRE2_SPTR start_cc;
  8390. BOOL needs_control_head;
  8391. PUSH_BACKTRACK(sizeof(recurse_backtrack), cc, NULL);
  8392. /* Inlining simple patterns. */
  8393. if (get_framesize(common, common->start + start, NULL, TRUE, &needs_control_head) == no_stack)
  8394. {
  8395. start_cc = common->start + start;
  8396. compile_matchingpath(common, next_opcode(common, start_cc), bracketend(start_cc) - (1 + LINK_SIZE), backtrack);
  8397. BACKTRACK_AS(recurse_backtrack)->inlined_pattern = TRUE;
  8398. return cc + 1 + LINK_SIZE;
  8399. }
  8400. while (entry != NULL)
  8401. {
  8402. if (entry->start == start)
  8403. break;
  8404. prev = entry;
  8405. entry = entry->next;
  8406. }
  8407. if (entry == NULL)
  8408. {
  8409. entry = sljit_alloc_memory(compiler, sizeof(recurse_entry));
  8410. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  8411. return NULL;
  8412. entry->next = NULL;
  8413. entry->entry_label = NULL;
  8414. entry->backtrack_label = NULL;
  8415. entry->entry_calls = NULL;
  8416. entry->backtrack_calls = NULL;
  8417. entry->start = start;
  8418. if (prev != NULL)
  8419. prev->next = entry;
  8420. else
  8421. common->entries = entry;
  8422. }
  8423. BACKTRACK_AS(recurse_backtrack)->entry = entry;
  8424. if (entry->entry_label == NULL)
  8425. add_jump(compiler, &entry->entry_calls, JUMP(SLJIT_FAST_CALL));
  8426. else
  8427. JUMPTO(SLJIT_FAST_CALL, entry->entry_label);
  8428. /* Leave if the match is failed. */
  8429. add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0));
  8430. BACKTRACK_AS(recurse_backtrack)->matchingpath = LABEL();
  8431. return cc + 1 + LINK_SIZE;
  8432. }
  8433. static sljit_s32 SLJIT_FUNC do_callout(struct jit_arguments *arguments, pcre2_callout_block *callout_block, PCRE2_SPTR *jit_ovector)
  8434. {
  8435. PCRE2_SPTR begin;
  8436. PCRE2_SIZE *ovector;
  8437. sljit_u32 oveccount, capture_top;
  8438. if (arguments->callout == NULL)
  8439. return 0;
  8440. SLJIT_COMPILE_ASSERT(sizeof (PCRE2_SIZE) <= sizeof (sljit_sw), pcre2_size_must_be_lower_than_sljit_sw_size);
  8441. begin = arguments->begin;
  8442. ovector = (PCRE2_SIZE*)(callout_block + 1);
  8443. oveccount = callout_block->capture_top;
  8444. SLJIT_ASSERT(oveccount >= 1);
  8445. callout_block->version = 2;
  8446. callout_block->callout_flags = 0;
  8447. /* Offsets in subject. */
  8448. callout_block->subject_length = arguments->end - arguments->begin;
  8449. callout_block->start_match = jit_ovector[0] - begin;
  8450. callout_block->current_position = (PCRE2_SPTR)callout_block->offset_vector - begin;
  8451. callout_block->subject = begin;
  8452. /* Convert and copy the JIT offset vector to the ovector array. */
  8453. callout_block->capture_top = 1;
  8454. callout_block->offset_vector = ovector;
  8455. ovector[0] = PCRE2_UNSET;
  8456. ovector[1] = PCRE2_UNSET;
  8457. ovector += 2;
  8458. jit_ovector += 2;
  8459. capture_top = 1;
  8460. /* Convert pointers to sizes. */
  8461. while (--oveccount != 0)
  8462. {
  8463. capture_top++;
  8464. ovector[0] = (PCRE2_SIZE)(jit_ovector[0] - begin);
  8465. ovector[1] = (PCRE2_SIZE)(jit_ovector[1] - begin);
  8466. if (ovector[0] != PCRE2_UNSET)
  8467. callout_block->capture_top = capture_top;
  8468. ovector += 2;
  8469. jit_ovector += 2;
  8470. }
  8471. return (arguments->callout)(callout_block, arguments->callout_data);
  8472. }
  8473. #define CALLOUT_ARG_OFFSET(arg) \
  8474. SLJIT_OFFSETOF(pcre2_callout_block, arg)
  8475. static SLJIT_INLINE PCRE2_SPTR compile_callout_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
  8476. {
  8477. DEFINE_COMPILER;
  8478. backtrack_common *backtrack;
  8479. sljit_s32 mov_opcode;
  8480. unsigned int callout_length = (*cc == OP_CALLOUT)
  8481. ? PRIV(OP_lengths)[OP_CALLOUT] : GET(cc, 1 + 2 * LINK_SIZE);
  8482. sljit_sw value1;
  8483. sljit_sw value2;
  8484. sljit_sw value3;
  8485. sljit_uw callout_arg_size = (common->re->top_bracket + 1) * 2 * sizeof(sljit_sw);
  8486. PUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL);
  8487. callout_arg_size = (sizeof(pcre2_callout_block) + callout_arg_size + sizeof(sljit_sw) - 1) / sizeof(sljit_sw);
  8488. allocate_stack(common, callout_arg_size);
  8489. SLJIT_ASSERT(common->capture_last_ptr != 0);
  8490. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr);
  8491. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  8492. value1 = (*cc == OP_CALLOUT) ? cc[1 + 2 * LINK_SIZE] : 0;
  8493. OP1(SLJIT_MOV_U32, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_number), SLJIT_IMM, value1);
  8494. OP1(SLJIT_MOV_U32, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(capture_last), TMP2, 0);
  8495. OP1(SLJIT_MOV_U32, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(capture_top), SLJIT_IMM, common->re->top_bracket + 1);
  8496. /* These pointer sized fields temporarly stores internal variables. */
  8497. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(offset_vector), STR_PTR, 0);
  8498. if (common->mark_ptr != 0)
  8499. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr));
  8500. mov_opcode = (sizeof(PCRE2_SIZE) == 4) ? SLJIT_MOV_U32 : SLJIT_MOV;
  8501. OP1(mov_opcode, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(pattern_position), SLJIT_IMM, GET(cc, 1));
  8502. OP1(mov_opcode, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(next_item_length), SLJIT_IMM, GET(cc, 1 + LINK_SIZE));
  8503. if (*cc == OP_CALLOUT)
  8504. {
  8505. value1 = 0;
  8506. value2 = 0;
  8507. value3 = 0;
  8508. }
  8509. else
  8510. {
  8511. value1 = (sljit_sw) (cc + (1 + 4*LINK_SIZE) + 1);
  8512. value2 = (callout_length - (1 + 4*LINK_SIZE + 2));
  8513. value3 = (sljit_sw) (GET(cc, 1 + 3*LINK_SIZE));
  8514. }
  8515. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_string), SLJIT_IMM, value1);
  8516. OP1(mov_opcode, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_string_length), SLJIT_IMM, value2);
  8517. OP1(mov_opcode, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_string_offset), SLJIT_IMM, value3);
  8518. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(mark), (common->mark_ptr != 0) ? TMP2 : SLJIT_IMM, 0);
  8519. SLJIT_ASSERT(TMP1 == SLJIT_R0 && STR_PTR == SLJIT_R1);
  8520. /* Needed to save important temporary registers. */
  8521. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STR_PTR, 0);
  8522. /* SLJIT_R0 = arguments */
  8523. OP1(SLJIT_MOV, SLJIT_R1, 0, STACK_TOP, 0);
  8524. GET_LOCAL_BASE(SLJIT_R2, 0, OVECTOR_START);
  8525. sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(32, W, W, W), SLJIT_IMM, SLJIT_FUNC_ADDR(do_callout));
  8526. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  8527. free_stack(common, callout_arg_size);
  8528. /* Check return value. */
  8529. OP2U(SLJIT_SUB32 | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
  8530. add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER));
  8531. if (common->abort_label == NULL)
  8532. add_jump(compiler, &common->abort, JUMP(SLJIT_NOT_EQUAL) /* SIG_LESS */);
  8533. else
  8534. JUMPTO(SLJIT_NOT_EQUAL /* SIG_LESS */, common->abort_label);
  8535. return cc + callout_length;
  8536. }
  8537. #undef CALLOUT_ARG_SIZE
  8538. #undef CALLOUT_ARG_OFFSET
  8539. static SLJIT_INLINE BOOL assert_needs_str_ptr_saving(PCRE2_SPTR cc)
  8540. {
  8541. while (TRUE)
  8542. {
  8543. switch (*cc)
  8544. {
  8545. case OP_CALLOUT_STR:
  8546. cc += GET(cc, 1 + 2*LINK_SIZE);
  8547. break;
  8548. case OP_NOT_WORD_BOUNDARY:
  8549. case OP_WORD_BOUNDARY:
  8550. case OP_CIRC:
  8551. case OP_CIRCM:
  8552. case OP_DOLL:
  8553. case OP_DOLLM:
  8554. case OP_CALLOUT:
  8555. case OP_ALT:
  8556. cc += PRIV(OP_lengths)[*cc];
  8557. break;
  8558. case OP_KET:
  8559. return FALSE;
  8560. default:
  8561. return TRUE;
  8562. }
  8563. }
  8564. }
  8565. static PCRE2_SPTR compile_assert_matchingpath(compiler_common *common, PCRE2_SPTR cc, assert_backtrack *backtrack, BOOL conditional)
  8566. {
  8567. DEFINE_COMPILER;
  8568. int framesize;
  8569. int extrasize;
  8570. BOOL local_quit_available = FALSE;
  8571. BOOL needs_control_head;
  8572. int private_data_ptr;
  8573. backtrack_common altbacktrack;
  8574. PCRE2_SPTR ccbegin;
  8575. PCRE2_UCHAR opcode;
  8576. PCRE2_UCHAR bra = OP_BRA;
  8577. jump_list *tmp = NULL;
  8578. jump_list **target = (conditional) ? &backtrack->condfailed : &backtrack->common.topbacktracks;
  8579. jump_list **found;
  8580. /* Saving previous accept variables. */
  8581. BOOL save_local_quit_available = common->local_quit_available;
  8582. BOOL save_in_positive_assertion = common->in_positive_assertion;
  8583. then_trap_backtrack *save_then_trap = common->then_trap;
  8584. struct sljit_label *save_quit_label = common->quit_label;
  8585. struct sljit_label *save_accept_label = common->accept_label;
  8586. jump_list *save_quit = common->quit;
  8587. jump_list *save_positive_assertion_quit = common->positive_assertion_quit;
  8588. jump_list *save_accept = common->accept;
  8589. struct sljit_jump *jump;
  8590. struct sljit_jump *brajump = NULL;
  8591. /* Assert captures then. */
  8592. common->then_trap = NULL;
  8593. if (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO)
  8594. {
  8595. SLJIT_ASSERT(!conditional);
  8596. bra = *cc;
  8597. cc++;
  8598. }
  8599. private_data_ptr = PRIVATE_DATA(cc);
  8600. SLJIT_ASSERT(private_data_ptr != 0);
  8601. framesize = get_framesize(common, cc, NULL, FALSE, &needs_control_head);
  8602. backtrack->framesize = framesize;
  8603. backtrack->private_data_ptr = private_data_ptr;
  8604. opcode = *cc;
  8605. SLJIT_ASSERT(opcode >= OP_ASSERT && opcode <= OP_ASSERTBACK_NOT);
  8606. found = (opcode == OP_ASSERT || opcode == OP_ASSERTBACK) ? &tmp : target;
  8607. ccbegin = cc;
  8608. cc += GET(cc, 1);
  8609. if (bra == OP_BRAMINZERO)
  8610. {
  8611. /* This is a braminzero backtrack path. */
  8612. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  8613. free_stack(common, 1);
  8614. brajump = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);
  8615. }
  8616. if (framesize < 0)
  8617. {
  8618. extrasize = 1;
  8619. if (bra == OP_BRA && !assert_needs_str_ptr_saving(ccbegin + 1 + LINK_SIZE))
  8620. extrasize = 0;
  8621. if (needs_control_head)
  8622. extrasize++;
  8623. if (framesize == no_frame)
  8624. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0);
  8625. if (extrasize > 0)
  8626. allocate_stack(common, extrasize);
  8627. if (needs_control_head)
  8628. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
  8629. if (extrasize > 0)
  8630. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  8631. if (needs_control_head)
  8632. {
  8633. SLJIT_ASSERT(extrasize == 2);
  8634. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
  8635. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);
  8636. }
  8637. }
  8638. else
  8639. {
  8640. extrasize = needs_control_head ? 3 : 2;
  8641. allocate_stack(common, framesize + extrasize);
  8642. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  8643. OP2(SLJIT_ADD, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + extrasize) * sizeof(sljit_sw));
  8644. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0);
  8645. if (needs_control_head)
  8646. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
  8647. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  8648. if (needs_control_head)
  8649. {
  8650. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0);
  8651. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0);
  8652. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
  8653. }
  8654. else
  8655. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);
  8656. init_frame(common, ccbegin, NULL, framesize + extrasize - 1, extrasize);
  8657. }
  8658. memset(&altbacktrack, 0, sizeof(backtrack_common));
  8659. if (conditional || (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT))
  8660. {
  8661. /* Control verbs cannot escape from these asserts. */
  8662. local_quit_available = TRUE;
  8663. common->local_quit_available = TRUE;
  8664. common->quit_label = NULL;
  8665. common->quit = NULL;
  8666. }
  8667. common->in_positive_assertion = (opcode == OP_ASSERT || opcode == OP_ASSERTBACK);
  8668. common->positive_assertion_quit = NULL;
  8669. while (1)
  8670. {
  8671. common->accept_label = NULL;
  8672. common->accept = NULL;
  8673. altbacktrack.top = NULL;
  8674. altbacktrack.topbacktracks = NULL;
  8675. if (*ccbegin == OP_ALT && extrasize > 0)
  8676. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  8677. altbacktrack.cc = ccbegin;
  8678. compile_matchingpath(common, ccbegin + 1 + LINK_SIZE, cc, &altbacktrack);
  8679. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  8680. {
  8681. if (local_quit_available)
  8682. {
  8683. common->local_quit_available = save_local_quit_available;
  8684. common->quit_label = save_quit_label;
  8685. common->quit = save_quit;
  8686. }
  8687. common->in_positive_assertion = save_in_positive_assertion;
  8688. common->then_trap = save_then_trap;
  8689. common->accept_label = save_accept_label;
  8690. common->positive_assertion_quit = save_positive_assertion_quit;
  8691. common->accept = save_accept;
  8692. return NULL;
  8693. }
  8694. common->accept_label = LABEL();
  8695. if (common->accept != NULL)
  8696. set_jumps(common->accept, common->accept_label);
  8697. /* Reset stack. */
  8698. if (framesize < 0)
  8699. {
  8700. if (framesize == no_frame)
  8701. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  8702. else if (extrasize > 0)
  8703. free_stack(common, extrasize);
  8704. if (needs_control_head)
  8705. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1));
  8706. }
  8707. else
  8708. {
  8709. if ((opcode != OP_ASSERT_NOT && opcode != OP_ASSERTBACK_NOT) || conditional)
  8710. {
  8711. /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */
  8712. OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_sw));
  8713. if (needs_control_head)
  8714. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1));
  8715. }
  8716. else
  8717. {
  8718. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  8719. if (needs_control_head)
  8720. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 2));
  8721. add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
  8722. OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize - 1) * sizeof(sljit_sw));
  8723. }
  8724. }
  8725. if (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT)
  8726. {
  8727. /* We know that STR_PTR was stored on the top of the stack. */
  8728. if (conditional)
  8729. {
  8730. if (extrasize > 0)
  8731. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), needs_control_head ? STACK(-2) : STACK(-1));
  8732. }
  8733. else if (bra == OP_BRAZERO)
  8734. {
  8735. if (framesize < 0)
  8736. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize));
  8737. else
  8738. {
  8739. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 1));
  8740. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-framesize - extrasize));
  8741. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);
  8742. }
  8743. OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));
  8744. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  8745. }
  8746. else if (framesize >= 0)
  8747. {
  8748. /* For OP_BRA and OP_BRAMINZERO. */
  8749. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 1));
  8750. }
  8751. }
  8752. add_jump(compiler, found, JUMP(SLJIT_JUMP));
  8753. compile_backtrackingpath(common, altbacktrack.top);
  8754. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  8755. {
  8756. if (local_quit_available)
  8757. {
  8758. common->local_quit_available = save_local_quit_available;
  8759. common->quit_label = save_quit_label;
  8760. common->quit = save_quit;
  8761. }
  8762. common->in_positive_assertion = save_in_positive_assertion;
  8763. common->then_trap = save_then_trap;
  8764. common->accept_label = save_accept_label;
  8765. common->positive_assertion_quit = save_positive_assertion_quit;
  8766. common->accept = save_accept;
  8767. return NULL;
  8768. }
  8769. set_jumps(altbacktrack.topbacktracks, LABEL());
  8770. if (*cc != OP_ALT)
  8771. break;
  8772. ccbegin = cc;
  8773. cc += GET(cc, 1);
  8774. }
  8775. if (local_quit_available)
  8776. {
  8777. SLJIT_ASSERT(common->positive_assertion_quit == NULL);
  8778. /* Makes the check less complicated below. */
  8779. common->positive_assertion_quit = common->quit;
  8780. }
  8781. /* None of them matched. */
  8782. if (common->positive_assertion_quit != NULL)
  8783. {
  8784. jump = JUMP(SLJIT_JUMP);
  8785. set_jumps(common->positive_assertion_quit, LABEL());
  8786. SLJIT_ASSERT(framesize != no_stack);
  8787. if (framesize < 0)
  8788. OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, extrasize * sizeof(sljit_sw));
  8789. else
  8790. {
  8791. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  8792. add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
  8793. OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (extrasize + 1) * sizeof(sljit_sw));
  8794. }
  8795. JUMPHERE(jump);
  8796. }
  8797. if (needs_control_head)
  8798. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(1));
  8799. if (opcode == OP_ASSERT || opcode == OP_ASSERTBACK)
  8800. {
  8801. /* Assert is failed. */
  8802. if ((conditional && extrasize > 0) || bra == OP_BRAZERO)
  8803. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  8804. if (framesize < 0)
  8805. {
  8806. /* The topmost item should be 0. */
  8807. if (bra == OP_BRAZERO)
  8808. {
  8809. if (extrasize == 2)
  8810. free_stack(common, 1);
  8811. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  8812. }
  8813. else if (extrasize > 0)
  8814. free_stack(common, extrasize);
  8815. }
  8816. else
  8817. {
  8818. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(extrasize - 1));
  8819. /* The topmost item should be 0. */
  8820. if (bra == OP_BRAZERO)
  8821. {
  8822. free_stack(common, framesize + extrasize - 1);
  8823. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  8824. }
  8825. else
  8826. free_stack(common, framesize + extrasize);
  8827. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);
  8828. }
  8829. jump = JUMP(SLJIT_JUMP);
  8830. if (bra != OP_BRAZERO)
  8831. add_jump(compiler, target, jump);
  8832. /* Assert is successful. */
  8833. set_jumps(tmp, LABEL());
  8834. if (framesize < 0)
  8835. {
  8836. /* We know that STR_PTR was stored on the top of the stack. */
  8837. if (extrasize > 0)
  8838. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize));
  8839. /* Keep the STR_PTR on the top of the stack. */
  8840. if (bra == OP_BRAZERO)
  8841. {
  8842. OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));
  8843. if (extrasize == 2)
  8844. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  8845. }
  8846. else if (bra == OP_BRAMINZERO)
  8847. {
  8848. OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));
  8849. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  8850. }
  8851. }
  8852. else
  8853. {
  8854. if (bra == OP_BRA)
  8855. {
  8856. /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */
  8857. OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_sw));
  8858. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize + 1));
  8859. }
  8860. else
  8861. {
  8862. /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */
  8863. OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 2) * sizeof(sljit_sw));
  8864. if (extrasize == 2)
  8865. {
  8866. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  8867. if (bra == OP_BRAMINZERO)
  8868. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  8869. }
  8870. else
  8871. {
  8872. SLJIT_ASSERT(extrasize == 3);
  8873. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-1));
  8874. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), bra == OP_BRAZERO ? STR_PTR : SLJIT_IMM, 0);
  8875. }
  8876. }
  8877. }
  8878. if (bra == OP_BRAZERO)
  8879. {
  8880. backtrack->matchingpath = LABEL();
  8881. SET_LABEL(jump, backtrack->matchingpath);
  8882. }
  8883. else if (bra == OP_BRAMINZERO)
  8884. {
  8885. JUMPTO(SLJIT_JUMP, backtrack->matchingpath);
  8886. JUMPHERE(brajump);
  8887. if (framesize >= 0)
  8888. {
  8889. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  8890. add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
  8891. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-2));
  8892. OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize - 1) * sizeof(sljit_sw));
  8893. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);
  8894. }
  8895. set_jumps(backtrack->common.topbacktracks, LABEL());
  8896. }
  8897. }
  8898. else
  8899. {
  8900. /* AssertNot is successful. */
  8901. if (framesize < 0)
  8902. {
  8903. if (extrasize > 0)
  8904. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  8905. if (bra != OP_BRA)
  8906. {
  8907. if (extrasize == 2)
  8908. free_stack(common, 1);
  8909. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  8910. }
  8911. else if (extrasize > 0)
  8912. free_stack(common, extrasize);
  8913. }
  8914. else
  8915. {
  8916. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  8917. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(extrasize - 1));
  8918. /* The topmost item should be 0. */
  8919. if (bra != OP_BRA)
  8920. {
  8921. free_stack(common, framesize + extrasize - 1);
  8922. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  8923. }
  8924. else
  8925. free_stack(common, framesize + extrasize);
  8926. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);
  8927. }
  8928. if (bra == OP_BRAZERO)
  8929. backtrack->matchingpath = LABEL();
  8930. else if (bra == OP_BRAMINZERO)
  8931. {
  8932. JUMPTO(SLJIT_JUMP, backtrack->matchingpath);
  8933. JUMPHERE(brajump);
  8934. }
  8935. if (bra != OP_BRA)
  8936. {
  8937. SLJIT_ASSERT(found == &backtrack->common.topbacktracks);
  8938. set_jumps(backtrack->common.topbacktracks, LABEL());
  8939. backtrack->common.topbacktracks = NULL;
  8940. }
  8941. }
  8942. if (local_quit_available)
  8943. {
  8944. common->local_quit_available = save_local_quit_available;
  8945. common->quit_label = save_quit_label;
  8946. common->quit = save_quit;
  8947. }
  8948. common->in_positive_assertion = save_in_positive_assertion;
  8949. common->then_trap = save_then_trap;
  8950. common->accept_label = save_accept_label;
  8951. common->positive_assertion_quit = save_positive_assertion_quit;
  8952. common->accept = save_accept;
  8953. return cc + 1 + LINK_SIZE;
  8954. }
  8955. static SLJIT_INLINE void match_once_common(compiler_common *common, PCRE2_UCHAR ket, int framesize, int private_data_ptr, BOOL has_alternatives, BOOL needs_control_head)
  8956. {
  8957. DEFINE_COMPILER;
  8958. int stacksize;
  8959. if (framesize < 0)
  8960. {
  8961. if (framesize == no_frame)
  8962. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  8963. else
  8964. {
  8965. stacksize = needs_control_head ? 1 : 0;
  8966. if (ket != OP_KET || has_alternatives)
  8967. stacksize++;
  8968. if (stacksize > 0)
  8969. free_stack(common, stacksize);
  8970. }
  8971. if (needs_control_head)
  8972. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), (ket != OP_KET || has_alternatives) ? STACK(-2) : STACK(-1));
  8973. /* TMP2 which is set here used by OP_KETRMAX below. */
  8974. if (ket == OP_KETRMAX)
  8975. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(-1));
  8976. else if (ket == OP_KETRMIN)
  8977. {
  8978. /* Move the STR_PTR to the private_data_ptr. */
  8979. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1));
  8980. }
  8981. }
  8982. else
  8983. {
  8984. stacksize = (ket != OP_KET || has_alternatives) ? 2 : 1;
  8985. OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + stacksize) * sizeof(sljit_sw));
  8986. if (needs_control_head)
  8987. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-1));
  8988. if (ket == OP_KETRMAX)
  8989. {
  8990. /* TMP2 which is set here used by OP_KETRMAX below. */
  8991. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  8992. }
  8993. }
  8994. if (needs_control_head)
  8995. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP1, 0);
  8996. }
  8997. static SLJIT_INLINE int match_capture_common(compiler_common *common, int stacksize, int offset, int private_data_ptr)
  8998. {
  8999. DEFINE_COMPILER;
  9000. if (common->capture_last_ptr != 0)
  9001. {
  9002. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr);
  9003. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, offset >> 1);
  9004. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0);
  9005. stacksize++;
  9006. }
  9007. if (common->optimized_cbracket[offset >> 1] == 0)
  9008. {
  9009. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));
  9010. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
  9011. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0);
  9012. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9013. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize + 1), TMP2, 0);
  9014. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);
  9015. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);
  9016. stacksize += 2;
  9017. }
  9018. return stacksize;
  9019. }
  9020. static PCRE2_SPTR SLJIT_FUNC do_script_run(PCRE2_SPTR ptr, PCRE2_SPTR endptr)
  9021. {
  9022. if (PRIV(script_run)(ptr, endptr, FALSE))
  9023. return endptr;
  9024. return NULL;
  9025. }
  9026. #ifdef SUPPORT_UNICODE
  9027. static PCRE2_SPTR SLJIT_FUNC do_script_run_utf(PCRE2_SPTR ptr, PCRE2_SPTR endptr)
  9028. {
  9029. if (PRIV(script_run)(ptr, endptr, TRUE))
  9030. return endptr;
  9031. return NULL;
  9032. }
  9033. #endif /* SUPPORT_UNICODE */
  9034. static SLJIT_INLINE void match_script_run_common(compiler_common *common, int private_data_ptr, backtrack_common *parent)
  9035. {
  9036. DEFINE_COMPILER;
  9037. SLJIT_ASSERT(TMP1 == SLJIT_R0 && STR_PTR == SLJIT_R1);
  9038. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9039. #ifdef SUPPORT_UNICODE
  9040. sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W), SLJIT_IMM,
  9041. common->utf ? SLJIT_FUNC_ADDR(do_script_run_utf) : SLJIT_FUNC_ADDR(do_script_run));
  9042. #else
  9043. sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W), SLJIT_IMM, SLJIT_FUNC_ADDR(do_script_run));
  9044. #endif
  9045. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
  9046. add_jump(compiler, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0));
  9047. }
  9048. /*
  9049. Handling bracketed expressions is probably the most complex part.
  9050. Stack layout naming characters:
  9051. S - Push the current STR_PTR
  9052. 0 - Push a 0 (NULL)
  9053. A - Push the current STR_PTR. Needed for restoring the STR_PTR
  9054. before the next alternative. Not pushed if there are no alternatives.
  9055. M - Any values pushed by the current alternative. Can be empty, or anything.
  9056. C - Push the previous OVECTOR(i), OVECTOR(i+1) and OVECTOR_PRIV(i) to the stack.
  9057. L - Push the previous local (pointed by localptr) to the stack
  9058. () - opional values stored on the stack
  9059. ()* - optonal, can be stored multiple times
  9060. The following list shows the regular expression templates, their PCRE byte codes
  9061. and stack layout supported by pcre-sljit.
  9062. (?:) OP_BRA | OP_KET A M
  9063. () OP_CBRA | OP_KET C M
  9064. (?:)+ OP_BRA | OP_KETRMAX 0 A M S ( A M S )*
  9065. OP_SBRA | OP_KETRMAX 0 L M S ( L M S )*
  9066. (?:)+? OP_BRA | OP_KETRMIN 0 A M S ( A M S )*
  9067. OP_SBRA | OP_KETRMIN 0 L M S ( L M S )*
  9068. ()+ OP_CBRA | OP_KETRMAX 0 C M S ( C M S )*
  9069. OP_SCBRA | OP_KETRMAX 0 C M S ( C M S )*
  9070. ()+? OP_CBRA | OP_KETRMIN 0 C M S ( C M S )*
  9071. OP_SCBRA | OP_KETRMIN 0 C M S ( C M S )*
  9072. (?:)? OP_BRAZERO | OP_BRA | OP_KET S ( A M 0 )
  9073. (?:)?? OP_BRAMINZERO | OP_BRA | OP_KET S ( A M 0 )
  9074. ()? OP_BRAZERO | OP_CBRA | OP_KET S ( C M 0 )
  9075. ()?? OP_BRAMINZERO | OP_CBRA | OP_KET S ( C M 0 )
  9076. (?:)* OP_BRAZERO | OP_BRA | OP_KETRMAX S 0 ( A M S )*
  9077. OP_BRAZERO | OP_SBRA | OP_KETRMAX S 0 ( L M S )*
  9078. (?:)*? OP_BRAMINZERO | OP_BRA | OP_KETRMIN S 0 ( A M S )*
  9079. OP_BRAMINZERO | OP_SBRA | OP_KETRMIN S 0 ( L M S )*
  9080. ()* OP_BRAZERO | OP_CBRA | OP_KETRMAX S 0 ( C M S )*
  9081. OP_BRAZERO | OP_SCBRA | OP_KETRMAX S 0 ( C M S )*
  9082. ()*? OP_BRAMINZERO | OP_CBRA | OP_KETRMIN S 0 ( C M S )*
  9083. OP_BRAMINZERO | OP_SCBRA | OP_KETRMIN S 0 ( C M S )*
  9084. Stack layout naming characters:
  9085. A - Push the alternative index (starting from 0) on the stack.
  9086. Not pushed if there is no alternatives.
  9087. M - Any values pushed by the current alternative. Can be empty, or anything.
  9088. The next list shows the possible content of a bracket:
  9089. (|) OP_*BRA | OP_ALT ... M A
  9090. (?()|) OP_*COND | OP_ALT M A
  9091. (?>|) OP_ONCE | OP_ALT ... [stack trace] M A
  9092. Or nothing, if trace is unnecessary
  9093. */
  9094. static PCRE2_SPTR compile_bracket_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
  9095. {
  9096. DEFINE_COMPILER;
  9097. backtrack_common *backtrack;
  9098. PCRE2_UCHAR opcode;
  9099. int private_data_ptr = 0;
  9100. int offset = 0;
  9101. int i, stacksize;
  9102. int repeat_ptr = 0, repeat_length = 0;
  9103. int repeat_type = 0, repeat_count = 0;
  9104. PCRE2_SPTR ccbegin;
  9105. PCRE2_SPTR matchingpath;
  9106. PCRE2_SPTR slot;
  9107. PCRE2_UCHAR bra = OP_BRA;
  9108. PCRE2_UCHAR ket;
  9109. assert_backtrack *assert;
  9110. BOOL has_alternatives;
  9111. BOOL needs_control_head = FALSE;
  9112. struct sljit_jump *jump;
  9113. struct sljit_jump *skip;
  9114. struct sljit_label *rmax_label = NULL;
  9115. struct sljit_jump *braminzero = NULL;
  9116. PUSH_BACKTRACK(sizeof(bracket_backtrack), cc, NULL);
  9117. if (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO)
  9118. {
  9119. bra = *cc;
  9120. cc++;
  9121. opcode = *cc;
  9122. }
  9123. opcode = *cc;
  9124. ccbegin = cc;
  9125. matchingpath = bracketend(cc) - 1 - LINK_SIZE;
  9126. ket = *matchingpath;
  9127. if (ket == OP_KET && PRIVATE_DATA(matchingpath) != 0)
  9128. {
  9129. repeat_ptr = PRIVATE_DATA(matchingpath);
  9130. repeat_length = PRIVATE_DATA(matchingpath + 1);
  9131. repeat_type = PRIVATE_DATA(matchingpath + 2);
  9132. repeat_count = PRIVATE_DATA(matchingpath + 3);
  9133. SLJIT_ASSERT(repeat_length != 0 && repeat_type != 0 && repeat_count != 0);
  9134. if (repeat_type == OP_UPTO)
  9135. ket = OP_KETRMAX;
  9136. if (repeat_type == OP_MINUPTO)
  9137. ket = OP_KETRMIN;
  9138. }
  9139. matchingpath = ccbegin + 1 + LINK_SIZE;
  9140. SLJIT_ASSERT(ket == OP_KET || ket == OP_KETRMAX || ket == OP_KETRMIN);
  9141. SLJIT_ASSERT(!((bra == OP_BRAZERO && ket == OP_KETRMIN) || (bra == OP_BRAMINZERO && ket == OP_KETRMAX)));
  9142. cc += GET(cc, 1);
  9143. has_alternatives = *cc == OP_ALT;
  9144. if (SLJIT_UNLIKELY(opcode == OP_COND || opcode == OP_SCOND))
  9145. {
  9146. SLJIT_COMPILE_ASSERT(OP_DNRREF == OP_RREF + 1 && OP_FALSE == OP_RREF + 2 && OP_TRUE == OP_RREF + 3,
  9147. compile_time_checks_must_be_grouped_together);
  9148. has_alternatives = ((*matchingpath >= OP_RREF && *matchingpath <= OP_TRUE) || *matchingpath == OP_FAIL) ? FALSE : TRUE;
  9149. }
  9150. if (SLJIT_UNLIKELY(opcode == OP_COND) && (*cc == OP_KETRMAX || *cc == OP_KETRMIN))
  9151. opcode = OP_SCOND;
  9152. if (opcode == OP_CBRA || opcode == OP_SCBRA)
  9153. {
  9154. /* Capturing brackets has a pre-allocated space. */
  9155. offset = GET2(ccbegin, 1 + LINK_SIZE);
  9156. if (common->optimized_cbracket[offset] == 0)
  9157. {
  9158. private_data_ptr = OVECTOR_PRIV(offset);
  9159. offset <<= 1;
  9160. }
  9161. else
  9162. {
  9163. offset <<= 1;
  9164. private_data_ptr = OVECTOR(offset);
  9165. }
  9166. BACKTRACK_AS(bracket_backtrack)->private_data_ptr = private_data_ptr;
  9167. matchingpath += IMM2_SIZE;
  9168. }
  9169. else if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA || opcode == OP_ONCE || opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND)
  9170. {
  9171. /* Other brackets simply allocate the next entry. */
  9172. private_data_ptr = PRIVATE_DATA(ccbegin);
  9173. SLJIT_ASSERT(private_data_ptr != 0);
  9174. BACKTRACK_AS(bracket_backtrack)->private_data_ptr = private_data_ptr;
  9175. if (opcode == OP_ONCE)
  9176. BACKTRACK_AS(bracket_backtrack)->u.framesize = get_framesize(common, ccbegin, NULL, FALSE, &needs_control_head);
  9177. }
  9178. /* Instructions before the first alternative. */
  9179. stacksize = 0;
  9180. if (ket == OP_KETRMAX || (ket == OP_KETRMIN && bra != OP_BRAMINZERO))
  9181. stacksize++;
  9182. if (bra == OP_BRAZERO)
  9183. stacksize++;
  9184. if (stacksize > 0)
  9185. allocate_stack(common, stacksize);
  9186. stacksize = 0;
  9187. if (ket == OP_KETRMAX || (ket == OP_KETRMIN && bra != OP_BRAMINZERO))
  9188. {
  9189. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0);
  9190. stacksize++;
  9191. }
  9192. if (bra == OP_BRAZERO)
  9193. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);
  9194. if (bra == OP_BRAMINZERO)
  9195. {
  9196. /* This is a backtrack path! (Since the try-path of OP_BRAMINZERO matches to the empty string) */
  9197. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  9198. if (ket != OP_KETRMIN)
  9199. {
  9200. free_stack(common, 1);
  9201. braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);
  9202. }
  9203. else if (opcode == OP_ONCE || opcode >= OP_SBRA)
  9204. {
  9205. jump = CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);
  9206. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
  9207. /* Nothing stored during the first run. */
  9208. skip = JUMP(SLJIT_JUMP);
  9209. JUMPHERE(jump);
  9210. /* Checking zero-length iteration. */
  9211. if (opcode != OP_ONCE || BACKTRACK_AS(bracket_backtrack)->u.framesize < 0)
  9212. {
  9213. /* When we come from outside, private_data_ptr contains the previous STR_PTR. */
  9214. braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9215. }
  9216. else
  9217. {
  9218. /* Except when the whole stack frame must be saved. */
  9219. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9220. braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), STACK(-BACKTRACK_AS(bracket_backtrack)->u.framesize - 2));
  9221. }
  9222. JUMPHERE(skip);
  9223. }
  9224. else
  9225. {
  9226. jump = CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);
  9227. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
  9228. JUMPHERE(jump);
  9229. }
  9230. }
  9231. if (repeat_type != 0)
  9232. {
  9233. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, repeat_count);
  9234. if (repeat_type == OP_EXACT)
  9235. rmax_label = LABEL();
  9236. }
  9237. if (ket == OP_KETRMIN)
  9238. BACKTRACK_AS(bracket_backtrack)->recursive_matchingpath = LABEL();
  9239. if (ket == OP_KETRMAX)
  9240. {
  9241. rmax_label = LABEL();
  9242. if (has_alternatives && opcode >= OP_BRA && opcode < OP_SBRA && repeat_type == 0)
  9243. BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = rmax_label;
  9244. }
  9245. /* Handling capturing brackets and alternatives. */
  9246. if (opcode == OP_ONCE)
  9247. {
  9248. stacksize = 0;
  9249. if (needs_control_head)
  9250. {
  9251. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
  9252. stacksize++;
  9253. }
  9254. if (BACKTRACK_AS(bracket_backtrack)->u.framesize < 0)
  9255. {
  9256. /* Neither capturing brackets nor recursions are found in the block. */
  9257. if (ket == OP_KETRMIN)
  9258. {
  9259. stacksize += 2;
  9260. if (!needs_control_head)
  9261. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9262. }
  9263. else
  9264. {
  9265. if (BACKTRACK_AS(bracket_backtrack)->u.framesize == no_frame)
  9266. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0);
  9267. if (ket == OP_KETRMAX || has_alternatives)
  9268. stacksize++;
  9269. }
  9270. if (stacksize > 0)
  9271. allocate_stack(common, stacksize);
  9272. stacksize = 0;
  9273. if (needs_control_head)
  9274. {
  9275. stacksize++;
  9276. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
  9277. }
  9278. if (ket == OP_KETRMIN)
  9279. {
  9280. if (needs_control_head)
  9281. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9282. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);
  9283. if (BACKTRACK_AS(bracket_backtrack)->u.framesize == no_frame)
  9284. OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0, SLJIT_IMM, needs_control_head ? (2 * sizeof(sljit_sw)) : sizeof(sljit_sw));
  9285. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize + 1), TMP2, 0);
  9286. }
  9287. else if (ket == OP_KETRMAX || has_alternatives)
  9288. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);
  9289. }
  9290. else
  9291. {
  9292. if (ket != OP_KET || has_alternatives)
  9293. stacksize++;
  9294. stacksize += BACKTRACK_AS(bracket_backtrack)->u.framesize + 1;
  9295. allocate_stack(common, stacksize);
  9296. if (needs_control_head)
  9297. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
  9298. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9299. OP2(SLJIT_ADD, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw));
  9300. stacksize = needs_control_head ? 1 : 0;
  9301. if (ket != OP_KET || has_alternatives)
  9302. {
  9303. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);
  9304. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0);
  9305. stacksize++;
  9306. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0);
  9307. }
  9308. else
  9309. {
  9310. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0);
  9311. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0);
  9312. }
  9313. init_frame(common, ccbegin, NULL, BACKTRACK_AS(bracket_backtrack)->u.framesize + stacksize, stacksize + 1);
  9314. }
  9315. }
  9316. else if (opcode == OP_CBRA || opcode == OP_SCBRA)
  9317. {
  9318. /* Saving the previous values. */
  9319. if (common->optimized_cbracket[offset >> 1] != 0)
  9320. {
  9321. SLJIT_ASSERT(private_data_ptr == OVECTOR(offset));
  9322. allocate_stack(common, 2);
  9323. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9324. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr + sizeof(sljit_sw));
  9325. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0);
  9326. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0);
  9327. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0);
  9328. }
  9329. else
  9330. {
  9331. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9332. allocate_stack(common, 1);
  9333. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0);
  9334. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
  9335. }
  9336. }
  9337. else if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA || opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND)
  9338. {
  9339. /* Saving the previous value. */
  9340. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9341. allocate_stack(common, 1);
  9342. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0);
  9343. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
  9344. }
  9345. else if (has_alternatives)
  9346. {
  9347. /* Pushing the starting string pointer. */
  9348. allocate_stack(common, 1);
  9349. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  9350. }
  9351. /* Generating code for the first alternative. */
  9352. if (opcode == OP_COND || opcode == OP_SCOND)
  9353. {
  9354. if (*matchingpath == OP_CREF)
  9355. {
  9356. SLJIT_ASSERT(has_alternatives);
  9357. add_jump(compiler, &(BACKTRACK_AS(bracket_backtrack)->u.condfailed),
  9358. CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(matchingpath, 1) << 1), SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));
  9359. matchingpath += 1 + IMM2_SIZE;
  9360. }
  9361. else if (*matchingpath == OP_DNCREF)
  9362. {
  9363. SLJIT_ASSERT(has_alternatives);
  9364. i = GET2(matchingpath, 1 + IMM2_SIZE);
  9365. slot = common->name_table + GET2(matchingpath, 1) * common->name_entry_size;
  9366. OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);
  9367. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));
  9368. OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(slot, 0) << 1), TMP1, 0);
  9369. slot += common->name_entry_size;
  9370. i--;
  9371. while (i-- > 0)
  9372. {
  9373. OP2(SLJIT_SUB, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(slot, 0) << 1), TMP1, 0);
  9374. OP2(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, TMP2, 0, STR_PTR, 0);
  9375. slot += common->name_entry_size;
  9376. }
  9377. OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
  9378. add_jump(compiler, &(BACKTRACK_AS(bracket_backtrack)->u.condfailed), JUMP(SLJIT_ZERO));
  9379. matchingpath += 1 + 2 * IMM2_SIZE;
  9380. }
  9381. else if ((*matchingpath >= OP_RREF && *matchingpath <= OP_TRUE) || *matchingpath == OP_FAIL)
  9382. {
  9383. /* Never has other case. */
  9384. BACKTRACK_AS(bracket_backtrack)->u.condfailed = NULL;
  9385. SLJIT_ASSERT(!has_alternatives);
  9386. if (*matchingpath == OP_TRUE)
  9387. {
  9388. stacksize = 1;
  9389. matchingpath++;
  9390. }
  9391. else if (*matchingpath == OP_FALSE || *matchingpath == OP_FAIL)
  9392. stacksize = 0;
  9393. else if (*matchingpath == OP_RREF)
  9394. {
  9395. stacksize = GET2(matchingpath, 1);
  9396. if (common->currententry == NULL)
  9397. stacksize = 0;
  9398. else if (stacksize == RREF_ANY)
  9399. stacksize = 1;
  9400. else if (common->currententry->start == 0)
  9401. stacksize = stacksize == 0;
  9402. else
  9403. stacksize = stacksize == (int)GET2(common->start, common->currententry->start + 1 + LINK_SIZE);
  9404. if (stacksize != 0)
  9405. matchingpath += 1 + IMM2_SIZE;
  9406. }
  9407. else
  9408. {
  9409. if (common->currententry == NULL || common->currententry->start == 0)
  9410. stacksize = 0;
  9411. else
  9412. {
  9413. stacksize = GET2(matchingpath, 1 + IMM2_SIZE);
  9414. slot = common->name_table + GET2(matchingpath, 1) * common->name_entry_size;
  9415. i = (int)GET2(common->start, common->currententry->start + 1 + LINK_SIZE);
  9416. while (stacksize > 0)
  9417. {
  9418. if ((int)GET2(slot, 0) == i)
  9419. break;
  9420. slot += common->name_entry_size;
  9421. stacksize--;
  9422. }
  9423. }
  9424. if (stacksize != 0)
  9425. matchingpath += 1 + 2 * IMM2_SIZE;
  9426. }
  9427. /* The stacksize == 0 is a common "else" case. */
  9428. if (stacksize == 0)
  9429. {
  9430. if (*cc == OP_ALT)
  9431. {
  9432. matchingpath = cc + 1 + LINK_SIZE;
  9433. cc += GET(cc, 1);
  9434. }
  9435. else
  9436. matchingpath = cc;
  9437. }
  9438. }
  9439. else
  9440. {
  9441. SLJIT_ASSERT(has_alternatives && *matchingpath >= OP_ASSERT && *matchingpath <= OP_ASSERTBACK_NOT);
  9442. /* Similar code as PUSH_BACKTRACK macro. */
  9443. assert = sljit_alloc_memory(compiler, sizeof(assert_backtrack));
  9444. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  9445. return NULL;
  9446. memset(assert, 0, sizeof(assert_backtrack));
  9447. assert->common.cc = matchingpath;
  9448. BACKTRACK_AS(bracket_backtrack)->u.assert = assert;
  9449. matchingpath = compile_assert_matchingpath(common, matchingpath, assert, TRUE);
  9450. }
  9451. }
  9452. compile_matchingpath(common, matchingpath, cc, backtrack);
  9453. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  9454. return NULL;
  9455. if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA)
  9456. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9457. if (opcode == OP_ONCE)
  9458. match_once_common(common, ket, BACKTRACK_AS(bracket_backtrack)->u.framesize, private_data_ptr, has_alternatives, needs_control_head);
  9459. if (opcode == OP_SCRIPT_RUN)
  9460. match_script_run_common(common, private_data_ptr, backtrack);
  9461. stacksize = 0;
  9462. if (repeat_type == OP_MINUPTO)
  9463. {
  9464. /* We need to preserve the counter. TMP2 will be used below. */
  9465. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr);
  9466. stacksize++;
  9467. }
  9468. if (ket != OP_KET || bra != OP_BRA)
  9469. stacksize++;
  9470. if (offset != 0)
  9471. {
  9472. if (common->capture_last_ptr != 0)
  9473. stacksize++;
  9474. if (common->optimized_cbracket[offset >> 1] == 0)
  9475. stacksize += 2;
  9476. }
  9477. if (has_alternatives && opcode != OP_ONCE)
  9478. stacksize++;
  9479. if (stacksize > 0)
  9480. allocate_stack(common, stacksize);
  9481. stacksize = 0;
  9482. if (repeat_type == OP_MINUPTO)
  9483. {
  9484. /* TMP2 was set above. */
  9485. OP2(SLJIT_SUB, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP2, 0, SLJIT_IMM, 1);
  9486. stacksize++;
  9487. }
  9488. if (ket != OP_KET || bra != OP_BRA)
  9489. {
  9490. if (ket != OP_KET)
  9491. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);
  9492. else
  9493. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0);
  9494. stacksize++;
  9495. }
  9496. if (offset != 0)
  9497. stacksize = match_capture_common(common, stacksize, offset, private_data_ptr);
  9498. /* Skip and count the other alternatives. */
  9499. i = 1;
  9500. while (*cc == OP_ALT)
  9501. {
  9502. cc += GET(cc, 1);
  9503. i++;
  9504. }
  9505. if (has_alternatives)
  9506. {
  9507. if (opcode != OP_ONCE)
  9508. {
  9509. if (i <= 3)
  9510. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0);
  9511. else
  9512. BACKTRACK_AS(bracket_backtrack)->u.matching_put_label = sljit_emit_put_label(compiler, SLJIT_MEM1(STACK_TOP), STACK(stacksize));
  9513. }
  9514. if (ket != OP_KETRMAX)
  9515. BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL();
  9516. }
  9517. /* Must be after the matchingpath label. */
  9518. if (offset != 0 && common->optimized_cbracket[offset >> 1] != 0)
  9519. {
  9520. SLJIT_ASSERT(private_data_ptr == OVECTOR(offset + 0));
  9521. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);
  9522. }
  9523. if (ket == OP_KETRMAX)
  9524. {
  9525. if (repeat_type != 0)
  9526. {
  9527. if (has_alternatives)
  9528. BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL();
  9529. OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1);
  9530. JUMPTO(SLJIT_NOT_ZERO, rmax_label);
  9531. /* Drop STR_PTR for greedy plus quantifier. */
  9532. if (opcode != OP_ONCE)
  9533. free_stack(common, 1);
  9534. }
  9535. else if (opcode < OP_BRA || opcode >= OP_SBRA)
  9536. {
  9537. if (has_alternatives)
  9538. BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL();
  9539. /* Checking zero-length iteration. */
  9540. if (opcode != OP_ONCE)
  9541. {
  9542. /* This case includes opcodes such as OP_SCRIPT_RUN. */
  9543. CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0, rmax_label);
  9544. /* Drop STR_PTR for greedy plus quantifier. */
  9545. if (bra != OP_BRAZERO)
  9546. free_stack(common, 1);
  9547. }
  9548. else
  9549. /* TMP2 must contain the starting STR_PTR. */
  9550. CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0, rmax_label);
  9551. }
  9552. else
  9553. JUMPTO(SLJIT_JUMP, rmax_label);
  9554. BACKTRACK_AS(bracket_backtrack)->recursive_matchingpath = LABEL();
  9555. }
  9556. if (repeat_type == OP_EXACT)
  9557. {
  9558. count_match(common);
  9559. OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1);
  9560. JUMPTO(SLJIT_NOT_ZERO, rmax_label);
  9561. }
  9562. else if (repeat_type == OP_UPTO)
  9563. {
  9564. /* We need to preserve the counter. */
  9565. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr);
  9566. allocate_stack(common, 1);
  9567. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
  9568. }
  9569. if (bra == OP_BRAZERO)
  9570. BACKTRACK_AS(bracket_backtrack)->zero_matchingpath = LABEL();
  9571. if (bra == OP_BRAMINZERO)
  9572. {
  9573. /* This is a backtrack path! (From the viewpoint of OP_BRAMINZERO) */
  9574. JUMPTO(SLJIT_JUMP, ((braminzero_backtrack *)parent)->matchingpath);
  9575. if (braminzero != NULL)
  9576. {
  9577. JUMPHERE(braminzero);
  9578. /* We need to release the end pointer to perform the
  9579. backtrack for the zero-length iteration. When
  9580. framesize is < 0, OP_ONCE will do the release itself. */
  9581. if (opcode == OP_ONCE && BACKTRACK_AS(bracket_backtrack)->u.framesize >= 0)
  9582. {
  9583. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9584. add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
  9585. OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (BACKTRACK_AS(bracket_backtrack)->u.framesize - 1) * sizeof(sljit_sw));
  9586. }
  9587. else if (ket == OP_KETRMIN && opcode != OP_ONCE)
  9588. free_stack(common, 1);
  9589. }
  9590. /* Continue to the normal backtrack. */
  9591. }
  9592. if ((ket != OP_KET && bra != OP_BRAMINZERO) || bra == OP_BRAZERO)
  9593. count_match(common);
  9594. cc += 1 + LINK_SIZE;
  9595. if (opcode == OP_ONCE)
  9596. {
  9597. /* We temporarily encode the needs_control_head in the lowest bit.
  9598. Note: on the target architectures of SLJIT the ((x << 1) >> 1) returns
  9599. the same value for small signed numbers (including negative numbers). */
  9600. BACKTRACK_AS(bracket_backtrack)->u.framesize = (int)((unsigned)BACKTRACK_AS(bracket_backtrack)->u.framesize << 1) | (needs_control_head ? 1 : 0);
  9601. }
  9602. return cc + repeat_length;
  9603. }
  9604. static PCRE2_SPTR compile_bracketpos_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
  9605. {
  9606. DEFINE_COMPILER;
  9607. backtrack_common *backtrack;
  9608. PCRE2_UCHAR opcode;
  9609. int private_data_ptr;
  9610. int cbraprivptr = 0;
  9611. BOOL needs_control_head;
  9612. int framesize;
  9613. int stacksize;
  9614. int offset = 0;
  9615. BOOL zero = FALSE;
  9616. PCRE2_SPTR ccbegin = NULL;
  9617. int stack; /* Also contains the offset of control head. */
  9618. struct sljit_label *loop = NULL;
  9619. struct jump_list *emptymatch = NULL;
  9620. PUSH_BACKTRACK(sizeof(bracketpos_backtrack), cc, NULL);
  9621. if (*cc == OP_BRAPOSZERO)
  9622. {
  9623. zero = TRUE;
  9624. cc++;
  9625. }
  9626. opcode = *cc;
  9627. private_data_ptr = PRIVATE_DATA(cc);
  9628. SLJIT_ASSERT(private_data_ptr != 0);
  9629. BACKTRACK_AS(bracketpos_backtrack)->private_data_ptr = private_data_ptr;
  9630. switch(opcode)
  9631. {
  9632. case OP_BRAPOS:
  9633. case OP_SBRAPOS:
  9634. ccbegin = cc + 1 + LINK_SIZE;
  9635. break;
  9636. case OP_CBRAPOS:
  9637. case OP_SCBRAPOS:
  9638. offset = GET2(cc, 1 + LINK_SIZE);
  9639. /* This case cannot be optimized in the same was as
  9640. normal capturing brackets. */
  9641. SLJIT_ASSERT(common->optimized_cbracket[offset] == 0);
  9642. cbraprivptr = OVECTOR_PRIV(offset);
  9643. offset <<= 1;
  9644. ccbegin = cc + 1 + LINK_SIZE + IMM2_SIZE;
  9645. break;
  9646. default:
  9647. SLJIT_UNREACHABLE();
  9648. break;
  9649. }
  9650. framesize = get_framesize(common, cc, NULL, FALSE, &needs_control_head);
  9651. BACKTRACK_AS(bracketpos_backtrack)->framesize = framesize;
  9652. if (framesize < 0)
  9653. {
  9654. if (offset != 0)
  9655. {
  9656. stacksize = 2;
  9657. if (common->capture_last_ptr != 0)
  9658. stacksize++;
  9659. }
  9660. else
  9661. stacksize = 1;
  9662. if (needs_control_head)
  9663. stacksize++;
  9664. if (!zero)
  9665. stacksize++;
  9666. BACKTRACK_AS(bracketpos_backtrack)->stacksize = stacksize;
  9667. allocate_stack(common, stacksize);
  9668. if (framesize == no_frame)
  9669. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0);
  9670. stack = 0;
  9671. if (offset != 0)
  9672. {
  9673. stack = 2;
  9674. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));
  9675. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
  9676. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0);
  9677. if (common->capture_last_ptr != 0)
  9678. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr);
  9679. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0);
  9680. if (needs_control_head)
  9681. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
  9682. if (common->capture_last_ptr != 0)
  9683. {
  9684. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0);
  9685. stack = 3;
  9686. }
  9687. }
  9688. else
  9689. {
  9690. if (needs_control_head)
  9691. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
  9692. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  9693. stack = 1;
  9694. }
  9695. if (needs_control_head)
  9696. stack++;
  9697. if (!zero)
  9698. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), SLJIT_IMM, 1);
  9699. if (needs_control_head)
  9700. {
  9701. stack--;
  9702. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), TMP2, 0);
  9703. }
  9704. }
  9705. else
  9706. {
  9707. stacksize = framesize + 1;
  9708. if (!zero)
  9709. stacksize++;
  9710. if (needs_control_head)
  9711. stacksize++;
  9712. if (offset == 0)
  9713. stacksize++;
  9714. BACKTRACK_AS(bracketpos_backtrack)->stacksize = stacksize;
  9715. allocate_stack(common, stacksize);
  9716. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9717. if (needs_control_head)
  9718. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
  9719. OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw));
  9720. stack = 0;
  9721. if (!zero)
  9722. {
  9723. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 1);
  9724. stack = 1;
  9725. }
  9726. if (needs_control_head)
  9727. {
  9728. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), TMP2, 0);
  9729. stack++;
  9730. }
  9731. if (offset == 0)
  9732. {
  9733. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), STR_PTR, 0);
  9734. stack++;
  9735. }
  9736. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), TMP1, 0);
  9737. init_frame(common, cc, NULL, stacksize - 1, stacksize - framesize);
  9738. stack -= 1 + (offset == 0);
  9739. }
  9740. if (offset != 0)
  9741. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), cbraprivptr, STR_PTR, 0);
  9742. loop = LABEL();
  9743. while (*cc != OP_KETRPOS)
  9744. {
  9745. backtrack->top = NULL;
  9746. backtrack->topbacktracks = NULL;
  9747. cc += GET(cc, 1);
  9748. compile_matchingpath(common, ccbegin, cc, backtrack);
  9749. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  9750. return NULL;
  9751. if (framesize < 0)
  9752. {
  9753. if (framesize == no_frame)
  9754. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9755. if (offset != 0)
  9756. {
  9757. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr);
  9758. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);
  9759. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), cbraprivptr, STR_PTR, 0);
  9760. if (common->capture_last_ptr != 0)
  9761. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, offset >> 1);
  9762. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);
  9763. }
  9764. else
  9765. {
  9766. if (opcode == OP_SBRAPOS)
  9767. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  9768. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  9769. }
  9770. /* Even if the match is empty, we need to reset the control head. */
  9771. if (needs_control_head)
  9772. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(stack));
  9773. if (opcode == OP_SBRAPOS || opcode == OP_SCBRAPOS)
  9774. add_jump(compiler, &emptymatch, CMP(SLJIT_EQUAL, TMP1, 0, STR_PTR, 0));
  9775. if (!zero)
  9776. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0);
  9777. }
  9778. else
  9779. {
  9780. if (offset != 0)
  9781. {
  9782. OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, stacksize * sizeof(sljit_sw));
  9783. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr);
  9784. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);
  9785. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), cbraprivptr, STR_PTR, 0);
  9786. if (common->capture_last_ptr != 0)
  9787. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, offset >> 1);
  9788. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);
  9789. }
  9790. else
  9791. {
  9792. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9793. OP2(SLJIT_SUB, STACK_TOP, 0, TMP2, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw));
  9794. if (opcode == OP_SBRAPOS)
  9795. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), STACK(-framesize - 2));
  9796. OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), STACK(-framesize - 2), STR_PTR, 0);
  9797. }
  9798. /* Even if the match is empty, we need to reset the control head. */
  9799. if (needs_control_head)
  9800. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(stack));
  9801. if (opcode == OP_SBRAPOS || opcode == OP_SCBRAPOS)
  9802. add_jump(compiler, &emptymatch, CMP(SLJIT_EQUAL, TMP1, 0, STR_PTR, 0));
  9803. if (!zero)
  9804. {
  9805. if (framesize < 0)
  9806. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0);
  9807. else
  9808. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  9809. }
  9810. }
  9811. JUMPTO(SLJIT_JUMP, loop);
  9812. flush_stubs(common);
  9813. compile_backtrackingpath(common, backtrack->top);
  9814. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  9815. return NULL;
  9816. set_jumps(backtrack->topbacktracks, LABEL());
  9817. if (framesize < 0)
  9818. {
  9819. if (offset != 0)
  9820. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr);
  9821. else
  9822. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  9823. }
  9824. else
  9825. {
  9826. if (offset != 0)
  9827. {
  9828. /* Last alternative. */
  9829. if (*cc == OP_KETRPOS)
  9830. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9831. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr);
  9832. }
  9833. else
  9834. {
  9835. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  9836. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP2), STACK(-framesize - 2));
  9837. }
  9838. }
  9839. if (*cc == OP_KETRPOS)
  9840. break;
  9841. ccbegin = cc + 1 + LINK_SIZE;
  9842. }
  9843. /* We don't have to restore the control head in case of a failed match. */
  9844. backtrack->topbacktracks = NULL;
  9845. if (!zero)
  9846. {
  9847. if (framesize < 0)
  9848. add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0));
  9849. else /* TMP2 is set to [private_data_ptr] above. */
  9850. add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(TMP2), STACK(-stacksize), SLJIT_IMM, 0));
  9851. }
  9852. /* None of them matched. */
  9853. set_jumps(emptymatch, LABEL());
  9854. count_match(common);
  9855. return cc + 1 + LINK_SIZE;
  9856. }
  9857. static SLJIT_INLINE PCRE2_SPTR get_iterator_parameters(compiler_common *common, PCRE2_SPTR cc, PCRE2_UCHAR *opcode, PCRE2_UCHAR *type, sljit_u32 *max, sljit_u32 *exact, PCRE2_SPTR *end)
  9858. {
  9859. int class_len;
  9860. *opcode = *cc;
  9861. *exact = 0;
  9862. if (*opcode >= OP_STAR && *opcode <= OP_POSUPTO)
  9863. {
  9864. cc++;
  9865. *type = OP_CHAR;
  9866. }
  9867. else if (*opcode >= OP_STARI && *opcode <= OP_POSUPTOI)
  9868. {
  9869. cc++;
  9870. *type = OP_CHARI;
  9871. *opcode -= OP_STARI - OP_STAR;
  9872. }
  9873. else if (*opcode >= OP_NOTSTAR && *opcode <= OP_NOTPOSUPTO)
  9874. {
  9875. cc++;
  9876. *type = OP_NOT;
  9877. *opcode -= OP_NOTSTAR - OP_STAR;
  9878. }
  9879. else if (*opcode >= OP_NOTSTARI && *opcode <= OP_NOTPOSUPTOI)
  9880. {
  9881. cc++;
  9882. *type = OP_NOTI;
  9883. *opcode -= OP_NOTSTARI - OP_STAR;
  9884. }
  9885. else if (*opcode >= OP_TYPESTAR && *opcode <= OP_TYPEPOSUPTO)
  9886. {
  9887. cc++;
  9888. *opcode -= OP_TYPESTAR - OP_STAR;
  9889. *type = OP_END;
  9890. }
  9891. else
  9892. {
  9893. SLJIT_ASSERT(*opcode == OP_CLASS || *opcode == OP_NCLASS || *opcode == OP_XCLASS);
  9894. *type = *opcode;
  9895. cc++;
  9896. class_len = (*type < OP_XCLASS) ? (int)(1 + (32 / sizeof(PCRE2_UCHAR))) : GET(cc, 0);
  9897. *opcode = cc[class_len - 1];
  9898. if (*opcode >= OP_CRSTAR && *opcode <= OP_CRMINQUERY)
  9899. {
  9900. *opcode -= OP_CRSTAR - OP_STAR;
  9901. *end = cc + class_len;
  9902. if (*opcode == OP_PLUS || *opcode == OP_MINPLUS)
  9903. {
  9904. *exact = 1;
  9905. *opcode -= OP_PLUS - OP_STAR;
  9906. }
  9907. }
  9908. else if (*opcode >= OP_CRPOSSTAR && *opcode <= OP_CRPOSQUERY)
  9909. {
  9910. *opcode -= OP_CRPOSSTAR - OP_POSSTAR;
  9911. *end = cc + class_len;
  9912. if (*opcode == OP_POSPLUS)
  9913. {
  9914. *exact = 1;
  9915. *opcode = OP_POSSTAR;
  9916. }
  9917. }
  9918. else
  9919. {
  9920. SLJIT_ASSERT(*opcode == OP_CRRANGE || *opcode == OP_CRMINRANGE || *opcode == OP_CRPOSRANGE);
  9921. *max = GET2(cc, (class_len + IMM2_SIZE));
  9922. *exact = GET2(cc, class_len);
  9923. if (*max == 0)
  9924. {
  9925. if (*opcode == OP_CRPOSRANGE)
  9926. *opcode = OP_POSSTAR;
  9927. else
  9928. *opcode -= OP_CRRANGE - OP_STAR;
  9929. }
  9930. else
  9931. {
  9932. *max -= *exact;
  9933. if (*max == 0)
  9934. *opcode = OP_EXACT;
  9935. else if (*max == 1)
  9936. {
  9937. if (*opcode == OP_CRPOSRANGE)
  9938. *opcode = OP_POSQUERY;
  9939. else
  9940. *opcode -= OP_CRRANGE - OP_QUERY;
  9941. }
  9942. else
  9943. {
  9944. if (*opcode == OP_CRPOSRANGE)
  9945. *opcode = OP_POSUPTO;
  9946. else
  9947. *opcode -= OP_CRRANGE - OP_UPTO;
  9948. }
  9949. }
  9950. *end = cc + class_len + 2 * IMM2_SIZE;
  9951. }
  9952. return cc;
  9953. }
  9954. switch(*opcode)
  9955. {
  9956. case OP_EXACT:
  9957. *exact = GET2(cc, 0);
  9958. cc += IMM2_SIZE;
  9959. break;
  9960. case OP_PLUS:
  9961. case OP_MINPLUS:
  9962. *exact = 1;
  9963. *opcode -= OP_PLUS - OP_STAR;
  9964. break;
  9965. case OP_POSPLUS:
  9966. *exact = 1;
  9967. *opcode = OP_POSSTAR;
  9968. break;
  9969. case OP_UPTO:
  9970. case OP_MINUPTO:
  9971. case OP_POSUPTO:
  9972. *max = GET2(cc, 0);
  9973. cc += IMM2_SIZE;
  9974. break;
  9975. }
  9976. if (*type == OP_END)
  9977. {
  9978. *type = *cc;
  9979. *end = next_opcode(common, cc);
  9980. cc++;
  9981. return cc;
  9982. }
  9983. *end = cc + 1;
  9984. #ifdef SUPPORT_UNICODE
  9985. if (common->utf && HAS_EXTRALEN(*cc)) *end += GET_EXTRALEN(*cc);
  9986. #endif
  9987. return cc;
  9988. }
  9989. static PCRE2_SPTR compile_iterator_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
  9990. {
  9991. DEFINE_COMPILER;
  9992. backtrack_common *backtrack;
  9993. PCRE2_UCHAR opcode;
  9994. PCRE2_UCHAR type;
  9995. sljit_u32 max = 0, exact;
  9996. sljit_s32 early_fail_ptr = PRIVATE_DATA(cc + 1);
  9997. sljit_s32 early_fail_type;
  9998. BOOL charpos_enabled;
  9999. PCRE2_UCHAR charpos_char;
  10000. unsigned int charpos_othercasebit;
  10001. PCRE2_SPTR end;
  10002. jump_list *no_match = NULL;
  10003. jump_list *no_char1_match = NULL;
  10004. struct sljit_jump *jump = NULL;
  10005. struct sljit_label *label;
  10006. int private_data_ptr = PRIVATE_DATA(cc);
  10007. int base = (private_data_ptr == 0) ? SLJIT_MEM1(STACK_TOP) : SLJIT_MEM1(SLJIT_SP);
  10008. int offset0 = (private_data_ptr == 0) ? STACK(0) : private_data_ptr;
  10009. int offset1 = (private_data_ptr == 0) ? STACK(1) : private_data_ptr + (int)sizeof(sljit_sw);
  10010. int tmp_base, tmp_offset;
  10011. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  10012. BOOL use_tmp;
  10013. #endif
  10014. PUSH_BACKTRACK(sizeof(char_iterator_backtrack), cc, NULL);
  10015. early_fail_type = (early_fail_ptr & 0x7);
  10016. early_fail_ptr >>= 3;
  10017. /* During recursion, these optimizations are disabled. */
  10018. if (common->early_fail_start_ptr == 0 && common->fast_forward_bc_ptr == NULL)
  10019. {
  10020. early_fail_ptr = 0;
  10021. early_fail_type = type_skip;
  10022. }
  10023. SLJIT_ASSERT(common->fast_forward_bc_ptr != NULL || early_fail_ptr == 0
  10024. || (early_fail_ptr >= common->early_fail_start_ptr && early_fail_ptr <= common->early_fail_end_ptr));
  10025. if (early_fail_type == type_fail)
  10026. add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr));
  10027. cc = get_iterator_parameters(common, cc, &opcode, &type, &max, &exact, &end);
  10028. if (type != OP_EXTUNI)
  10029. {
  10030. tmp_base = TMP3;
  10031. tmp_offset = 0;
  10032. }
  10033. else
  10034. {
  10035. tmp_base = SLJIT_MEM1(SLJIT_SP);
  10036. tmp_offset = POSSESSIVE0;
  10037. }
  10038. /* Handle fixed part first. */
  10039. if (exact > 1)
  10040. {
  10041. SLJIT_ASSERT(early_fail_ptr == 0);
  10042. if (common->mode == PCRE2_JIT_COMPLETE
  10043. #ifdef SUPPORT_UNICODE
  10044. && !common->utf
  10045. #endif
  10046. && type != OP_ANYNL && type != OP_EXTUNI)
  10047. {
  10048. OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(exact));
  10049. add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_GREATER, TMP1, 0, STR_END, 0));
  10050. OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact);
  10051. label = LABEL();
  10052. compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE);
  10053. OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
  10054. JUMPTO(SLJIT_NOT_ZERO, label);
  10055. }
  10056. else
  10057. {
  10058. OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact);
  10059. label = LABEL();
  10060. compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE);
  10061. OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
  10062. JUMPTO(SLJIT_NOT_ZERO, label);
  10063. }
  10064. }
  10065. else if (exact == 1)
  10066. {
  10067. compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE);
  10068. if (early_fail_type == type_fail_range)
  10069. {
  10070. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr);
  10071. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + (int)sizeof(sljit_sw));
  10072. OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, TMP2, 0);
  10073. OP2(SLJIT_SUB, TMP2, 0, STR_PTR, 0, TMP2, 0);
  10074. add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, TMP2, 0, TMP1, 0));
  10075. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + (int)sizeof(sljit_sw), STR_PTR, 0);
  10076. }
  10077. }
  10078. switch(opcode)
  10079. {
  10080. case OP_STAR:
  10081. case OP_UPTO:
  10082. SLJIT_ASSERT(early_fail_ptr == 0 || opcode == OP_STAR);
  10083. if (type == OP_ANYNL || type == OP_EXTUNI)
  10084. {
  10085. SLJIT_ASSERT(private_data_ptr == 0);
  10086. SLJIT_ASSERT(early_fail_ptr == 0);
  10087. allocate_stack(common, 2);
  10088. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  10089. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0);
  10090. if (opcode == OP_UPTO)
  10091. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, SLJIT_IMM, max);
  10092. label = LABEL();
  10093. compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE);
  10094. if (opcode == OP_UPTO)
  10095. {
  10096. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0);
  10097. OP2(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
  10098. jump = JUMP(SLJIT_ZERO);
  10099. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, TMP1, 0);
  10100. }
  10101. /* We cannot use TMP3 because of allocate_stack. */
  10102. allocate_stack(common, 1);
  10103. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  10104. JUMPTO(SLJIT_JUMP, label);
  10105. if (jump != NULL)
  10106. JUMPHERE(jump);
  10107. BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
  10108. break;
  10109. }
  10110. #ifdef SUPPORT_UNICODE
  10111. else if (type == OP_ALLANY && !common->invalid_utf)
  10112. #else
  10113. else if (type == OP_ALLANY)
  10114. #endif
  10115. {
  10116. if (opcode == OP_STAR)
  10117. {
  10118. if (private_data_ptr == 0)
  10119. allocate_stack(common, 2);
  10120. OP1(SLJIT_MOV, base, offset0, STR_END, 0);
  10121. OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
  10122. OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);
  10123. process_partial_match(common);
  10124. if (early_fail_ptr != 0)
  10125. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_END, 0);
  10126. BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
  10127. break;
  10128. }
  10129. #ifdef SUPPORT_UNICODE
  10130. else if (!common->utf)
  10131. #else
  10132. else
  10133. #endif
  10134. {
  10135. if (private_data_ptr == 0)
  10136. allocate_stack(common, 2);
  10137. OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
  10138. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(max));
  10139. if (common->mode == PCRE2_JIT_COMPLETE)
  10140. {
  10141. OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
  10142. CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
  10143. }
  10144. else
  10145. {
  10146. jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, STR_END, 0);
  10147. process_partial_match(common);
  10148. JUMPHERE(jump);
  10149. }
  10150. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10151. if (early_fail_ptr != 0)
  10152. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
  10153. BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
  10154. break;
  10155. }
  10156. }
  10157. charpos_enabled = FALSE;
  10158. charpos_char = 0;
  10159. charpos_othercasebit = 0;
  10160. if ((type != OP_CHAR && type != OP_CHARI) && (*end == OP_CHAR || *end == OP_CHARI))
  10161. {
  10162. #ifdef SUPPORT_UNICODE
  10163. charpos_enabled = !common->utf || !HAS_EXTRALEN(end[1]);
  10164. #else
  10165. charpos_enabled = TRUE;
  10166. #endif
  10167. if (charpos_enabled && *end == OP_CHARI && char_has_othercase(common, end + 1))
  10168. {
  10169. charpos_othercasebit = char_get_othercase_bit(common, end + 1);
  10170. if (charpos_othercasebit == 0)
  10171. charpos_enabled = FALSE;
  10172. }
  10173. if (charpos_enabled)
  10174. {
  10175. charpos_char = end[1];
  10176. /* Consume the OP_CHAR opcode. */
  10177. end += 2;
  10178. #if PCRE2_CODE_UNIT_WIDTH == 8
  10179. SLJIT_ASSERT((charpos_othercasebit >> 8) == 0);
  10180. #elif PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  10181. SLJIT_ASSERT((charpos_othercasebit >> 9) == 0);
  10182. if ((charpos_othercasebit & 0x100) != 0)
  10183. charpos_othercasebit = (charpos_othercasebit & 0xff) << 8;
  10184. #endif
  10185. if (charpos_othercasebit != 0)
  10186. charpos_char |= charpos_othercasebit;
  10187. BACKTRACK_AS(char_iterator_backtrack)->u.charpos.enabled = TRUE;
  10188. BACKTRACK_AS(char_iterator_backtrack)->u.charpos.chr = charpos_char;
  10189. BACKTRACK_AS(char_iterator_backtrack)->u.charpos.othercasebit = charpos_othercasebit;
  10190. }
  10191. }
  10192. if (charpos_enabled)
  10193. {
  10194. if (opcode == OP_UPTO)
  10195. OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max + 1);
  10196. /* Search the first instance of charpos_char. */
  10197. jump = JUMP(SLJIT_JUMP);
  10198. label = LABEL();
  10199. if (opcode == OP_UPTO)
  10200. {
  10201. OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
  10202. add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_ZERO));
  10203. }
  10204. compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE);
  10205. if (early_fail_ptr != 0)
  10206. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
  10207. JUMPHERE(jump);
  10208. detect_partial_match(common, &backtrack->topbacktracks);
  10209. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  10210. if (charpos_othercasebit != 0)
  10211. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);
  10212. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label);
  10213. if (private_data_ptr == 0)
  10214. allocate_stack(common, 2);
  10215. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10216. OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
  10217. if (opcode == OP_UPTO)
  10218. {
  10219. OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
  10220. add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
  10221. }
  10222. /* Search the last instance of charpos_char. */
  10223. label = LABEL();
  10224. compile_char1_matchingpath(common, type, cc, &no_match, FALSE);
  10225. if (early_fail_ptr != 0)
  10226. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
  10227. detect_partial_match(common, &no_match);
  10228. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
  10229. if (charpos_othercasebit != 0)
  10230. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);
  10231. if (opcode == OP_STAR)
  10232. {
  10233. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label);
  10234. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10235. JUMPTO(SLJIT_JUMP, label);
  10236. }
  10237. else
  10238. {
  10239. jump = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char);
  10240. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10241. JUMPHERE(jump);
  10242. OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
  10243. JUMPTO(SLJIT_NOT_ZERO, label);
  10244. }
  10245. set_jumps(no_match, LABEL());
  10246. OP2(SLJIT_ADD, STR_PTR, 0, base, offset0, SLJIT_IMM, IN_UCHARS(1));
  10247. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10248. }
  10249. else
  10250. {
  10251. if (private_data_ptr == 0)
  10252. allocate_stack(common, 2);
  10253. OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
  10254. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  10255. use_tmp = (!HAS_VIRTUAL_REGISTERS && opcode == OP_STAR);
  10256. SLJIT_ASSERT(!use_tmp || tmp_base == TMP3);
  10257. if (common->utf)
  10258. OP1(SLJIT_MOV, use_tmp ? TMP3 : base, use_tmp ? 0 : offset0, STR_PTR, 0);
  10259. #endif
  10260. if (opcode == OP_UPTO)
  10261. OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
  10262. detect_partial_match(common, &no_match);
  10263. label = LABEL();
  10264. compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
  10265. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  10266. if (common->utf)
  10267. OP1(SLJIT_MOV, use_tmp ? TMP3 : base, use_tmp ? 0 : offset0, STR_PTR, 0);
  10268. #endif
  10269. if (opcode == OP_UPTO)
  10270. {
  10271. OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
  10272. add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
  10273. }
  10274. detect_partial_match_to(common, label);
  10275. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  10276. set_jumps(no_char1_match, LABEL());
  10277. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  10278. if (common->utf)
  10279. {
  10280. set_jumps(no_match, LABEL());
  10281. if (use_tmp)
  10282. {
  10283. OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
  10284. OP1(SLJIT_MOV, base, offset0, TMP3, 0);
  10285. }
  10286. else
  10287. OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
  10288. }
  10289. else
  10290. #endif
  10291. {
  10292. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  10293. set_jumps(no_match, LABEL());
  10294. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10295. }
  10296. if (early_fail_ptr != 0)
  10297. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
  10298. }
  10299. BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
  10300. break;
  10301. case OP_MINSTAR:
  10302. if (private_data_ptr == 0)
  10303. allocate_stack(common, 1);
  10304. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10305. BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
  10306. if (early_fail_ptr != 0)
  10307. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
  10308. break;
  10309. case OP_MINUPTO:
  10310. SLJIT_ASSERT(early_fail_ptr == 0);
  10311. if (private_data_ptr == 0)
  10312. allocate_stack(common, 2);
  10313. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10314. OP1(SLJIT_MOV, base, offset1, SLJIT_IMM, max + 1);
  10315. BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
  10316. break;
  10317. case OP_QUERY:
  10318. case OP_MINQUERY:
  10319. SLJIT_ASSERT(early_fail_ptr == 0);
  10320. if (private_data_ptr == 0)
  10321. allocate_stack(common, 1);
  10322. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10323. if (opcode == OP_QUERY)
  10324. compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE);
  10325. BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
  10326. break;
  10327. case OP_EXACT:
  10328. break;
  10329. case OP_POSSTAR:
  10330. #if defined SUPPORT_UNICODE
  10331. if (type == OP_ALLANY && !common->invalid_utf)
  10332. #else
  10333. if (type == OP_ALLANY)
  10334. #endif
  10335. {
  10336. OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);
  10337. process_partial_match(common);
  10338. if (early_fail_ptr != 0)
  10339. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_END, 0);
  10340. break;
  10341. }
  10342. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  10343. if (common->utf)
  10344. {
  10345. OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
  10346. detect_partial_match(common, &no_match);
  10347. label = LABEL();
  10348. compile_char1_matchingpath(common, type, cc, &no_match, FALSE);
  10349. OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
  10350. detect_partial_match_to(common, label);
  10351. set_jumps(no_match, LABEL());
  10352. OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset);
  10353. if (early_fail_ptr != 0)
  10354. {
  10355. if (!HAS_VIRTUAL_REGISTERS && tmp_base == TMP3)
  10356. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, TMP3, 0);
  10357. else
  10358. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
  10359. }
  10360. break;
  10361. }
  10362. #endif
  10363. detect_partial_match(common, &no_match);
  10364. label = LABEL();
  10365. compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
  10366. detect_partial_match_to(common, label);
  10367. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  10368. set_jumps(no_char1_match, LABEL());
  10369. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  10370. set_jumps(no_match, LABEL());
  10371. if (early_fail_ptr != 0)
  10372. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
  10373. break;
  10374. case OP_POSUPTO:
  10375. SLJIT_ASSERT(early_fail_ptr == 0);
  10376. #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
  10377. if (common->utf)
  10378. {
  10379. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0);
  10380. OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
  10381. detect_partial_match(common, &no_match);
  10382. label = LABEL();
  10383. compile_char1_matchingpath(common, type, cc, &no_match, FALSE);
  10384. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0);
  10385. OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
  10386. add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
  10387. detect_partial_match_to(common, label);
  10388. set_jumps(no_match, LABEL());
  10389. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1);
  10390. break;
  10391. }
  10392. #endif
  10393. if (type == OP_ALLANY)
  10394. {
  10395. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(max));
  10396. if (common->mode == PCRE2_JIT_COMPLETE)
  10397. {
  10398. OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
  10399. CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
  10400. }
  10401. else
  10402. {
  10403. jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, STR_END, 0);
  10404. process_partial_match(common);
  10405. JUMPHERE(jump);
  10406. }
  10407. break;
  10408. }
  10409. OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
  10410. detect_partial_match(common, &no_match);
  10411. label = LABEL();
  10412. compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
  10413. OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
  10414. add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
  10415. detect_partial_match_to(common, label);
  10416. OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  10417. set_jumps(no_char1_match, LABEL());
  10418. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  10419. set_jumps(no_match, LABEL());
  10420. break;
  10421. case OP_POSQUERY:
  10422. SLJIT_ASSERT(early_fail_ptr == 0);
  10423. OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
  10424. compile_char1_matchingpath(common, type, cc, &no_match, TRUE);
  10425. OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
  10426. set_jumps(no_match, LABEL());
  10427. OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset);
  10428. break;
  10429. default:
  10430. SLJIT_UNREACHABLE();
  10431. break;
  10432. }
  10433. count_match(common);
  10434. return end;
  10435. }
  10436. static SLJIT_INLINE PCRE2_SPTR compile_fail_accept_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
  10437. {
  10438. DEFINE_COMPILER;
  10439. backtrack_common *backtrack;
  10440. PUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL);
  10441. if (*cc == OP_FAIL)
  10442. {
  10443. add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP));
  10444. return cc + 1;
  10445. }
  10446. if (*cc == OP_ACCEPT && common->currententry == NULL && (common->re->overall_options & PCRE2_ENDANCHORED) != 0)
  10447. add_jump(compiler, &common->reset_match, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, STR_END, 0));
  10448. if (*cc == OP_ASSERT_ACCEPT || common->currententry != NULL || !common->might_be_empty)
  10449. {
  10450. /* No need to check notempty conditions. */
  10451. if (common->accept_label == NULL)
  10452. add_jump(compiler, &common->accept, JUMP(SLJIT_JUMP));
  10453. else
  10454. JUMPTO(SLJIT_JUMP, common->accept_label);
  10455. return cc + 1;
  10456. }
  10457. if (common->accept_label == NULL)
  10458. add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)));
  10459. else
  10460. CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), common->accept_label);
  10461. if (HAS_VIRTUAL_REGISTERS)
  10462. {
  10463. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  10464. OP1(SLJIT_MOV_U32, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options));
  10465. }
  10466. else
  10467. OP1(SLJIT_MOV_U32, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options));
  10468. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY);
  10469. add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_NOT_ZERO));
  10470. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY_ATSTART);
  10471. if (common->accept_label == NULL)
  10472. add_jump(compiler, &common->accept, JUMP(SLJIT_ZERO));
  10473. else
  10474. JUMPTO(SLJIT_ZERO, common->accept_label);
  10475. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? TMP1 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str));
  10476. if (common->accept_label == NULL)
  10477. add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0));
  10478. else
  10479. CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0, common->accept_label);
  10480. add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP));
  10481. return cc + 1;
  10482. }
  10483. static SLJIT_INLINE PCRE2_SPTR compile_close_matchingpath(compiler_common *common, PCRE2_SPTR cc)
  10484. {
  10485. DEFINE_COMPILER;
  10486. int offset = GET2(cc, 1);
  10487. BOOL optimized_cbracket = common->optimized_cbracket[offset] != 0;
  10488. /* Data will be discarded anyway... */
  10489. if (common->currententry != NULL)
  10490. return cc + 1 + IMM2_SIZE;
  10491. if (!optimized_cbracket)
  10492. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR_PRIV(offset));
  10493. offset <<= 1;
  10494. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);
  10495. if (!optimized_cbracket)
  10496. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);
  10497. return cc + 1 + IMM2_SIZE;
  10498. }
  10499. static SLJIT_INLINE PCRE2_SPTR compile_control_verb_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
  10500. {
  10501. DEFINE_COMPILER;
  10502. backtrack_common *backtrack;
  10503. PCRE2_UCHAR opcode = *cc;
  10504. PCRE2_SPTR ccend = cc + 1;
  10505. if (opcode == OP_COMMIT_ARG || opcode == OP_PRUNE_ARG ||
  10506. opcode == OP_SKIP_ARG || opcode == OP_THEN_ARG)
  10507. ccend += 2 + cc[1];
  10508. PUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL);
  10509. if (opcode == OP_SKIP)
  10510. {
  10511. allocate_stack(common, 1);
  10512. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  10513. return ccend;
  10514. }
  10515. if (opcode == OP_COMMIT_ARG || opcode == OP_PRUNE_ARG || opcode == OP_THEN_ARG)
  10516. {
  10517. if (HAS_VIRTUAL_REGISTERS)
  10518. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  10519. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)(cc + 2));
  10520. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP2, 0);
  10521. OP1(SLJIT_MOV, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? TMP1 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0);
  10522. }
  10523. return ccend;
  10524. }
  10525. static PCRE2_UCHAR then_trap_opcode[1] = { OP_THEN_TRAP };
  10526. static SLJIT_INLINE void compile_then_trap_matchingpath(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, backtrack_common *parent)
  10527. {
  10528. DEFINE_COMPILER;
  10529. backtrack_common *backtrack;
  10530. BOOL needs_control_head;
  10531. int size;
  10532. PUSH_BACKTRACK_NOVALUE(sizeof(then_trap_backtrack), cc);
  10533. common->then_trap = BACKTRACK_AS(then_trap_backtrack);
  10534. BACKTRACK_AS(then_trap_backtrack)->common.cc = then_trap_opcode;
  10535. BACKTRACK_AS(then_trap_backtrack)->start = (sljit_sw)(cc - common->start);
  10536. BACKTRACK_AS(then_trap_backtrack)->framesize = get_framesize(common, cc, ccend, FALSE, &needs_control_head);
  10537. size = BACKTRACK_AS(then_trap_backtrack)->framesize;
  10538. size = 3 + (size < 0 ? 0 : size);
  10539. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
  10540. allocate_stack(common, size);
  10541. if (size > 3)
  10542. OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0, SLJIT_IMM, (size - 3) * sizeof(sljit_sw));
  10543. else
  10544. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0);
  10545. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(size - 1), SLJIT_IMM, BACKTRACK_AS(then_trap_backtrack)->start);
  10546. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(size - 2), SLJIT_IMM, type_then_trap);
  10547. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(size - 3), TMP2, 0);
  10548. size = BACKTRACK_AS(then_trap_backtrack)->framesize;
  10549. if (size >= 0)
  10550. init_frame(common, cc, ccend, size - 1, 0);
  10551. }
  10552. static void compile_matchingpath(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, backtrack_common *parent)
  10553. {
  10554. DEFINE_COMPILER;
  10555. backtrack_common *backtrack;
  10556. BOOL has_then_trap = FALSE;
  10557. then_trap_backtrack *save_then_trap = NULL;
  10558. SLJIT_ASSERT(*ccend == OP_END || (*ccend >= OP_ALT && *ccend <= OP_KETRPOS));
  10559. if (common->has_then && common->then_offsets[cc - common->start] != 0)
  10560. {
  10561. SLJIT_ASSERT(*ccend != OP_END && common->control_head_ptr != 0);
  10562. has_then_trap = TRUE;
  10563. save_then_trap = common->then_trap;
  10564. /* Tail item on backtrack. */
  10565. compile_then_trap_matchingpath(common, cc, ccend, parent);
  10566. }
  10567. while (cc < ccend)
  10568. {
  10569. switch(*cc)
  10570. {
  10571. case OP_SOD:
  10572. case OP_SOM:
  10573. case OP_NOT_WORD_BOUNDARY:
  10574. case OP_WORD_BOUNDARY:
  10575. case OP_EODN:
  10576. case OP_EOD:
  10577. case OP_DOLL:
  10578. case OP_DOLLM:
  10579. case OP_CIRC:
  10580. case OP_CIRCM:
  10581. case OP_REVERSE:
  10582. cc = compile_simple_assertion_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
  10583. break;
  10584. case OP_NOT_DIGIT:
  10585. case OP_DIGIT:
  10586. case OP_NOT_WHITESPACE:
  10587. case OP_WHITESPACE:
  10588. case OP_NOT_WORDCHAR:
  10589. case OP_WORDCHAR:
  10590. case OP_ANY:
  10591. case OP_ALLANY:
  10592. case OP_ANYBYTE:
  10593. case OP_NOTPROP:
  10594. case OP_PROP:
  10595. case OP_ANYNL:
  10596. case OP_NOT_HSPACE:
  10597. case OP_HSPACE:
  10598. case OP_NOT_VSPACE:
  10599. case OP_VSPACE:
  10600. case OP_EXTUNI:
  10601. case OP_NOT:
  10602. case OP_NOTI:
  10603. cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
  10604. break;
  10605. case OP_SET_SOM:
  10606. PUSH_BACKTRACK_NOVALUE(sizeof(backtrack_common), cc);
  10607. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0));
  10608. allocate_stack(common, 1);
  10609. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), STR_PTR, 0);
  10610. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
  10611. cc++;
  10612. break;
  10613. case OP_CHAR:
  10614. case OP_CHARI:
  10615. if (common->mode == PCRE2_JIT_COMPLETE)
  10616. cc = compile_charn_matchingpath(common, cc, ccend, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
  10617. else
  10618. cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
  10619. break;
  10620. case OP_STAR:
  10621. case OP_MINSTAR:
  10622. case OP_PLUS:
  10623. case OP_MINPLUS:
  10624. case OP_QUERY:
  10625. case OP_MINQUERY:
  10626. case OP_UPTO:
  10627. case OP_MINUPTO:
  10628. case OP_EXACT:
  10629. case OP_POSSTAR:
  10630. case OP_POSPLUS:
  10631. case OP_POSQUERY:
  10632. case OP_POSUPTO:
  10633. case OP_STARI:
  10634. case OP_MINSTARI:
  10635. case OP_PLUSI:
  10636. case OP_MINPLUSI:
  10637. case OP_QUERYI:
  10638. case OP_MINQUERYI:
  10639. case OP_UPTOI:
  10640. case OP_MINUPTOI:
  10641. case OP_EXACTI:
  10642. case OP_POSSTARI:
  10643. case OP_POSPLUSI:
  10644. case OP_POSQUERYI:
  10645. case OP_POSUPTOI:
  10646. case OP_NOTSTAR:
  10647. case OP_NOTMINSTAR:
  10648. case OP_NOTPLUS:
  10649. case OP_NOTMINPLUS:
  10650. case OP_NOTQUERY:
  10651. case OP_NOTMINQUERY:
  10652. case OP_NOTUPTO:
  10653. case OP_NOTMINUPTO:
  10654. case OP_NOTEXACT:
  10655. case OP_NOTPOSSTAR:
  10656. case OP_NOTPOSPLUS:
  10657. case OP_NOTPOSQUERY:
  10658. case OP_NOTPOSUPTO:
  10659. case OP_NOTSTARI:
  10660. case OP_NOTMINSTARI:
  10661. case OP_NOTPLUSI:
  10662. case OP_NOTMINPLUSI:
  10663. case OP_NOTQUERYI:
  10664. case OP_NOTMINQUERYI:
  10665. case OP_NOTUPTOI:
  10666. case OP_NOTMINUPTOI:
  10667. case OP_NOTEXACTI:
  10668. case OP_NOTPOSSTARI:
  10669. case OP_NOTPOSPLUSI:
  10670. case OP_NOTPOSQUERYI:
  10671. case OP_NOTPOSUPTOI:
  10672. case OP_TYPESTAR:
  10673. case OP_TYPEMINSTAR:
  10674. case OP_TYPEPLUS:
  10675. case OP_TYPEMINPLUS:
  10676. case OP_TYPEQUERY:
  10677. case OP_TYPEMINQUERY:
  10678. case OP_TYPEUPTO:
  10679. case OP_TYPEMINUPTO:
  10680. case OP_TYPEEXACT:
  10681. case OP_TYPEPOSSTAR:
  10682. case OP_TYPEPOSPLUS:
  10683. case OP_TYPEPOSQUERY:
  10684. case OP_TYPEPOSUPTO:
  10685. cc = compile_iterator_matchingpath(common, cc, parent);
  10686. break;
  10687. case OP_CLASS:
  10688. case OP_NCLASS:
  10689. if (cc[1 + (32 / sizeof(PCRE2_UCHAR))] >= OP_CRSTAR && cc[1 + (32 / sizeof(PCRE2_UCHAR))] <= OP_CRPOSRANGE)
  10690. cc = compile_iterator_matchingpath(common, cc, parent);
  10691. else
  10692. cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
  10693. break;
  10694. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
  10695. case OP_XCLASS:
  10696. if (*(cc + GET(cc, 1)) >= OP_CRSTAR && *(cc + GET(cc, 1)) <= OP_CRPOSRANGE)
  10697. cc = compile_iterator_matchingpath(common, cc, parent);
  10698. else
  10699. cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
  10700. break;
  10701. #endif
  10702. case OP_REF:
  10703. case OP_REFI:
  10704. if (cc[1 + IMM2_SIZE] >= OP_CRSTAR && cc[1 + IMM2_SIZE] <= OP_CRPOSRANGE)
  10705. cc = compile_ref_iterator_matchingpath(common, cc, parent);
  10706. else
  10707. {
  10708. compile_ref_matchingpath(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE, FALSE);
  10709. cc += 1 + IMM2_SIZE;
  10710. }
  10711. break;
  10712. case OP_DNREF:
  10713. case OP_DNREFI:
  10714. if (cc[1 + 2 * IMM2_SIZE] >= OP_CRSTAR && cc[1 + 2 * IMM2_SIZE] <= OP_CRPOSRANGE)
  10715. cc = compile_ref_iterator_matchingpath(common, cc, parent);
  10716. else
  10717. {
  10718. compile_dnref_search(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
  10719. compile_ref_matchingpath(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE, FALSE);
  10720. cc += 1 + 2 * IMM2_SIZE;
  10721. }
  10722. break;
  10723. case OP_RECURSE:
  10724. cc = compile_recurse_matchingpath(common, cc, parent);
  10725. break;
  10726. case OP_CALLOUT:
  10727. case OP_CALLOUT_STR:
  10728. cc = compile_callout_matchingpath(common, cc, parent);
  10729. break;
  10730. case OP_ASSERT:
  10731. case OP_ASSERT_NOT:
  10732. case OP_ASSERTBACK:
  10733. case OP_ASSERTBACK_NOT:
  10734. PUSH_BACKTRACK_NOVALUE(sizeof(assert_backtrack), cc);
  10735. cc = compile_assert_matchingpath(common, cc, BACKTRACK_AS(assert_backtrack), FALSE);
  10736. break;
  10737. case OP_BRAMINZERO:
  10738. PUSH_BACKTRACK_NOVALUE(sizeof(braminzero_backtrack), cc);
  10739. cc = bracketend(cc + 1);
  10740. if (*(cc - 1 - LINK_SIZE) != OP_KETRMIN)
  10741. {
  10742. allocate_stack(common, 1);
  10743. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  10744. }
  10745. else
  10746. {
  10747. allocate_stack(common, 2);
  10748. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  10749. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), STR_PTR, 0);
  10750. }
  10751. BACKTRACK_AS(braminzero_backtrack)->matchingpath = LABEL();
  10752. count_match(common);
  10753. break;
  10754. case OP_ASSERT_NA:
  10755. case OP_ASSERTBACK_NA:
  10756. case OP_ONCE:
  10757. case OP_SCRIPT_RUN:
  10758. case OP_BRA:
  10759. case OP_CBRA:
  10760. case OP_COND:
  10761. case OP_SBRA:
  10762. case OP_SCBRA:
  10763. case OP_SCOND:
  10764. cc = compile_bracket_matchingpath(common, cc, parent);
  10765. break;
  10766. case OP_BRAZERO:
  10767. if (cc[1] > OP_ASSERTBACK_NOT)
  10768. cc = compile_bracket_matchingpath(common, cc, parent);
  10769. else
  10770. {
  10771. PUSH_BACKTRACK_NOVALUE(sizeof(assert_backtrack), cc);
  10772. cc = compile_assert_matchingpath(common, cc, BACKTRACK_AS(assert_backtrack), FALSE);
  10773. }
  10774. break;
  10775. case OP_BRAPOS:
  10776. case OP_CBRAPOS:
  10777. case OP_SBRAPOS:
  10778. case OP_SCBRAPOS:
  10779. case OP_BRAPOSZERO:
  10780. cc = compile_bracketpos_matchingpath(common, cc, parent);
  10781. break;
  10782. case OP_MARK:
  10783. PUSH_BACKTRACK_NOVALUE(sizeof(backtrack_common), cc);
  10784. SLJIT_ASSERT(common->mark_ptr != 0);
  10785. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);
  10786. allocate_stack(common, common->has_skip_arg ? 5 : 1);
  10787. if (HAS_VIRTUAL_REGISTERS)
  10788. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  10789. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(common->has_skip_arg ? 4 : 0), TMP2, 0);
  10790. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)(cc + 2));
  10791. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP2, 0);
  10792. OP1(SLJIT_MOV, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? TMP1 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0);
  10793. if (common->has_skip_arg)
  10794. {
  10795. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
  10796. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0);
  10797. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, type_mark);
  10798. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), SLJIT_IMM, (sljit_sw)(cc + 2));
  10799. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(3), STR_PTR, 0);
  10800. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0);
  10801. }
  10802. cc += 1 + 2 + cc[1];
  10803. break;
  10804. case OP_PRUNE:
  10805. case OP_PRUNE_ARG:
  10806. case OP_SKIP:
  10807. case OP_SKIP_ARG:
  10808. case OP_THEN:
  10809. case OP_THEN_ARG:
  10810. case OP_COMMIT:
  10811. case OP_COMMIT_ARG:
  10812. cc = compile_control_verb_matchingpath(common, cc, parent);
  10813. break;
  10814. case OP_FAIL:
  10815. case OP_ACCEPT:
  10816. case OP_ASSERT_ACCEPT:
  10817. cc = compile_fail_accept_matchingpath(common, cc, parent);
  10818. break;
  10819. case OP_CLOSE:
  10820. cc = compile_close_matchingpath(common, cc);
  10821. break;
  10822. case OP_SKIPZERO:
  10823. cc = bracketend(cc + 1);
  10824. break;
  10825. default:
  10826. SLJIT_UNREACHABLE();
  10827. return;
  10828. }
  10829. if (cc == NULL)
  10830. return;
  10831. }
  10832. if (has_then_trap)
  10833. {
  10834. /* Head item on backtrack. */
  10835. PUSH_BACKTRACK_NOVALUE(sizeof(then_trap_backtrack), cc);
  10836. BACKTRACK_AS(then_trap_backtrack)->common.cc = then_trap_opcode;
  10837. BACKTRACK_AS(then_trap_backtrack)->then_trap = common->then_trap;
  10838. common->then_trap = save_then_trap;
  10839. }
  10840. SLJIT_ASSERT(cc == ccend);
  10841. }
  10842. #undef PUSH_BACKTRACK
  10843. #undef PUSH_BACKTRACK_NOVALUE
  10844. #undef BACKTRACK_AS
  10845. #define COMPILE_BACKTRACKINGPATH(current) \
  10846. do \
  10847. { \
  10848. compile_backtrackingpath(common, (current)); \
  10849. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \
  10850. return; \
  10851. } \
  10852. while (0)
  10853. #define CURRENT_AS(type) ((type *)current)
  10854. static void compile_iterator_backtrackingpath(compiler_common *common, struct backtrack_common *current)
  10855. {
  10856. DEFINE_COMPILER;
  10857. PCRE2_SPTR cc = current->cc;
  10858. PCRE2_UCHAR opcode;
  10859. PCRE2_UCHAR type;
  10860. sljit_u32 max = 0, exact;
  10861. struct sljit_label *label = NULL;
  10862. struct sljit_jump *jump = NULL;
  10863. jump_list *jumplist = NULL;
  10864. PCRE2_SPTR end;
  10865. int private_data_ptr = PRIVATE_DATA(cc);
  10866. int base = (private_data_ptr == 0) ? SLJIT_MEM1(STACK_TOP) : SLJIT_MEM1(SLJIT_SP);
  10867. int offset0 = (private_data_ptr == 0) ? STACK(0) : private_data_ptr;
  10868. int offset1 = (private_data_ptr == 0) ? STACK(1) : private_data_ptr + (int)sizeof(sljit_sw);
  10869. cc = get_iterator_parameters(common, cc, &opcode, &type, &max, &exact, &end);
  10870. switch(opcode)
  10871. {
  10872. case OP_STAR:
  10873. case OP_UPTO:
  10874. if (type == OP_ANYNL || type == OP_EXTUNI)
  10875. {
  10876. SLJIT_ASSERT(private_data_ptr == 0);
  10877. set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL());
  10878. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  10879. free_stack(common, 1);
  10880. CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(char_iterator_backtrack)->matchingpath);
  10881. }
  10882. else
  10883. {
  10884. if (CURRENT_AS(char_iterator_backtrack)->u.charpos.enabled)
  10885. {
  10886. OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
  10887. OP1(SLJIT_MOV, TMP2, 0, base, offset1);
  10888. OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
  10889. jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);
  10890. label = LABEL();
  10891. OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
  10892. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10893. if (CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit != 0)
  10894. OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit);
  10895. CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.chr, CURRENT_AS(char_iterator_backtrack)->matchingpath);
  10896. move_back(common, NULL, TRUE);
  10897. CMPTO(SLJIT_GREATER, STR_PTR, 0, TMP2, 0, label);
  10898. }
  10899. else
  10900. {
  10901. OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
  10902. jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, base, offset1);
  10903. move_back(common, NULL, TRUE);
  10904. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10905. JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
  10906. }
  10907. JUMPHERE(jump);
  10908. if (private_data_ptr == 0)
  10909. free_stack(common, 2);
  10910. }
  10911. break;
  10912. case OP_MINSTAR:
  10913. OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
  10914. compile_char1_matchingpath(common, type, cc, &jumplist, TRUE);
  10915. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10916. JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
  10917. set_jumps(jumplist, LABEL());
  10918. if (private_data_ptr == 0)
  10919. free_stack(common, 1);
  10920. break;
  10921. case OP_MINUPTO:
  10922. OP1(SLJIT_MOV, TMP1, 0, base, offset1);
  10923. OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
  10924. OP2(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
  10925. add_jump(compiler, &jumplist, JUMP(SLJIT_ZERO));
  10926. OP1(SLJIT_MOV, base, offset1, TMP1, 0);
  10927. compile_char1_matchingpath(common, type, cc, &jumplist, TRUE);
  10928. OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
  10929. JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
  10930. set_jumps(jumplist, LABEL());
  10931. if (private_data_ptr == 0)
  10932. free_stack(common, 2);
  10933. break;
  10934. case OP_QUERY:
  10935. OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
  10936. OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0);
  10937. CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(char_iterator_backtrack)->matchingpath);
  10938. jump = JUMP(SLJIT_JUMP);
  10939. set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL());
  10940. OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
  10941. OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0);
  10942. JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
  10943. JUMPHERE(jump);
  10944. if (private_data_ptr == 0)
  10945. free_stack(common, 1);
  10946. break;
  10947. case OP_MINQUERY:
  10948. OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
  10949. OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0);
  10950. jump = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);
  10951. compile_char1_matchingpath(common, type, cc, &jumplist, TRUE);
  10952. JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
  10953. set_jumps(jumplist, LABEL());
  10954. JUMPHERE(jump);
  10955. if (private_data_ptr == 0)
  10956. free_stack(common, 1);
  10957. break;
  10958. case OP_EXACT:
  10959. case OP_POSSTAR:
  10960. case OP_POSQUERY:
  10961. case OP_POSUPTO:
  10962. break;
  10963. default:
  10964. SLJIT_UNREACHABLE();
  10965. break;
  10966. }
  10967. set_jumps(current->topbacktracks, LABEL());
  10968. }
  10969. static SLJIT_INLINE void compile_ref_iterator_backtrackingpath(compiler_common *common, struct backtrack_common *current)
  10970. {
  10971. DEFINE_COMPILER;
  10972. PCRE2_SPTR cc = current->cc;
  10973. BOOL ref = (*cc == OP_REF || *cc == OP_REFI);
  10974. PCRE2_UCHAR type;
  10975. type = cc[ref ? 1 + IMM2_SIZE : 1 + 2 * IMM2_SIZE];
  10976. if ((type & 0x1) == 0)
  10977. {
  10978. /* Maximize case. */
  10979. set_jumps(current->topbacktracks, LABEL());
  10980. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  10981. free_stack(common, 1);
  10982. CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(ref_iterator_backtrack)->matchingpath);
  10983. return;
  10984. }
  10985. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  10986. CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(ref_iterator_backtrack)->matchingpath);
  10987. set_jumps(current->topbacktracks, LABEL());
  10988. free_stack(common, ref ? 2 : 3);
  10989. }
  10990. static SLJIT_INLINE void compile_recurse_backtrackingpath(compiler_common *common, struct backtrack_common *current)
  10991. {
  10992. DEFINE_COMPILER;
  10993. recurse_entry *entry;
  10994. if (!CURRENT_AS(recurse_backtrack)->inlined_pattern)
  10995. {
  10996. entry = CURRENT_AS(recurse_backtrack)->entry;
  10997. if (entry->backtrack_label == NULL)
  10998. add_jump(compiler, &entry->backtrack_calls, JUMP(SLJIT_FAST_CALL));
  10999. else
  11000. JUMPTO(SLJIT_FAST_CALL, entry->backtrack_label);
  11001. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, CURRENT_AS(recurse_backtrack)->matchingpath);
  11002. }
  11003. else
  11004. compile_backtrackingpath(common, current->top);
  11005. set_jumps(current->topbacktracks, LABEL());
  11006. }
  11007. static void compile_assert_backtrackingpath(compiler_common *common, struct backtrack_common *current)
  11008. {
  11009. DEFINE_COMPILER;
  11010. PCRE2_SPTR cc = current->cc;
  11011. PCRE2_UCHAR bra = OP_BRA;
  11012. struct sljit_jump *brajump = NULL;
  11013. SLJIT_ASSERT(*cc != OP_BRAMINZERO);
  11014. if (*cc == OP_BRAZERO)
  11015. {
  11016. bra = *cc;
  11017. cc++;
  11018. }
  11019. if (bra == OP_BRAZERO)
  11020. {
  11021. SLJIT_ASSERT(current->topbacktracks == NULL);
  11022. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11023. }
  11024. if (CURRENT_AS(assert_backtrack)->framesize < 0)
  11025. {
  11026. set_jumps(current->topbacktracks, LABEL());
  11027. if (bra == OP_BRAZERO)
  11028. {
  11029. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  11030. CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(assert_backtrack)->matchingpath);
  11031. free_stack(common, 1);
  11032. }
  11033. return;
  11034. }
  11035. if (bra == OP_BRAZERO)
  11036. {
  11037. if (*cc == OP_ASSERT_NOT || *cc == OP_ASSERTBACK_NOT)
  11038. {
  11039. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  11040. CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(assert_backtrack)->matchingpath);
  11041. free_stack(common, 1);
  11042. return;
  11043. }
  11044. free_stack(common, 1);
  11045. brajump = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);
  11046. }
  11047. if (*cc == OP_ASSERT || *cc == OP_ASSERTBACK)
  11048. {
  11049. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(assert_backtrack)->private_data_ptr);
  11050. add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
  11051. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-2));
  11052. OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (CURRENT_AS(assert_backtrack)->framesize - 1) * sizeof(sljit_sw));
  11053. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(assert_backtrack)->private_data_ptr, TMP1, 0);
  11054. set_jumps(current->topbacktracks, LABEL());
  11055. }
  11056. else
  11057. set_jumps(current->topbacktracks, LABEL());
  11058. if (bra == OP_BRAZERO)
  11059. {
  11060. /* We know there is enough place on the stack. */
  11061. OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));
  11062. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
  11063. JUMPTO(SLJIT_JUMP, CURRENT_AS(assert_backtrack)->matchingpath);
  11064. JUMPHERE(brajump);
  11065. }
  11066. }
  11067. static void compile_bracket_backtrackingpath(compiler_common *common, struct backtrack_common *current)
  11068. {
  11069. DEFINE_COMPILER;
  11070. int opcode, stacksize, alt_count, alt_max;
  11071. int offset = 0;
  11072. int private_data_ptr = CURRENT_AS(bracket_backtrack)->private_data_ptr;
  11073. int repeat_ptr = 0, repeat_type = 0, repeat_count = 0;
  11074. PCRE2_SPTR cc = current->cc;
  11075. PCRE2_SPTR ccbegin;
  11076. PCRE2_SPTR ccprev;
  11077. PCRE2_UCHAR bra = OP_BRA;
  11078. PCRE2_UCHAR ket;
  11079. assert_backtrack *assert;
  11080. BOOL has_alternatives;
  11081. BOOL needs_control_head = FALSE;
  11082. struct sljit_jump *brazero = NULL;
  11083. struct sljit_jump *next_alt = NULL;
  11084. struct sljit_jump *once = NULL;
  11085. struct sljit_jump *cond = NULL;
  11086. struct sljit_label *rmin_label = NULL;
  11087. struct sljit_label *exact_label = NULL;
  11088. struct sljit_put_label *put_label = NULL;
  11089. if (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO)
  11090. {
  11091. bra = *cc;
  11092. cc++;
  11093. }
  11094. opcode = *cc;
  11095. ccbegin = bracketend(cc) - 1 - LINK_SIZE;
  11096. ket = *ccbegin;
  11097. if (ket == OP_KET && PRIVATE_DATA(ccbegin) != 0)
  11098. {
  11099. repeat_ptr = PRIVATE_DATA(ccbegin);
  11100. repeat_type = PRIVATE_DATA(ccbegin + 2);
  11101. repeat_count = PRIVATE_DATA(ccbegin + 3);
  11102. SLJIT_ASSERT(repeat_type != 0 && repeat_count != 0);
  11103. if (repeat_type == OP_UPTO)
  11104. ket = OP_KETRMAX;
  11105. if (repeat_type == OP_MINUPTO)
  11106. ket = OP_KETRMIN;
  11107. }
  11108. ccbegin = cc;
  11109. cc += GET(cc, 1);
  11110. has_alternatives = *cc == OP_ALT;
  11111. if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND))
  11112. has_alternatives = (ccbegin[1 + LINK_SIZE] >= OP_ASSERT && ccbegin[1 + LINK_SIZE] <= OP_ASSERTBACK_NOT) || CURRENT_AS(bracket_backtrack)->u.condfailed != NULL;
  11113. if (opcode == OP_CBRA || opcode == OP_SCBRA)
  11114. offset = (GET2(ccbegin, 1 + LINK_SIZE)) << 1;
  11115. if (SLJIT_UNLIKELY(opcode == OP_COND) && (*cc == OP_KETRMAX || *cc == OP_KETRMIN))
  11116. opcode = OP_SCOND;
  11117. alt_max = has_alternatives ? no_alternatives(ccbegin) : 0;
  11118. /* Decoding the needs_control_head in framesize. */
  11119. if (opcode == OP_ONCE)
  11120. {
  11121. needs_control_head = (CURRENT_AS(bracket_backtrack)->u.framesize & 0x1) != 0;
  11122. CURRENT_AS(bracket_backtrack)->u.framesize >>= 1;
  11123. }
  11124. if (ket != OP_KET && repeat_type != 0)
  11125. {
  11126. /* TMP1 is used in OP_KETRMIN below. */
  11127. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11128. free_stack(common, 1);
  11129. if (repeat_type == OP_UPTO)
  11130. OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), repeat_ptr, TMP1, 0, SLJIT_IMM, 1);
  11131. else
  11132. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, TMP1, 0);
  11133. }
  11134. if (ket == OP_KETRMAX)
  11135. {
  11136. if (bra == OP_BRAZERO)
  11137. {
  11138. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11139. free_stack(common, 1);
  11140. brazero = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0);
  11141. }
  11142. }
  11143. else if (ket == OP_KETRMIN)
  11144. {
  11145. if (bra != OP_BRAMINZERO)
  11146. {
  11147. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11148. if (repeat_type != 0)
  11149. {
  11150. /* TMP1 was set a few lines above. */
  11151. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, CURRENT_AS(bracket_backtrack)->recursive_matchingpath);
  11152. /* Drop STR_PTR for non-greedy plus quantifier. */
  11153. if (opcode != OP_ONCE)
  11154. free_stack(common, 1);
  11155. }
  11156. else if (opcode >= OP_SBRA || opcode == OP_ONCE)
  11157. {
  11158. /* Checking zero-length iteration. */
  11159. if (opcode != OP_ONCE || CURRENT_AS(bracket_backtrack)->u.framesize < 0)
  11160. CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, CURRENT_AS(bracket_backtrack)->recursive_matchingpath);
  11161. else
  11162. {
  11163. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  11164. CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), STACK(-CURRENT_AS(bracket_backtrack)->u.framesize - 2), CURRENT_AS(bracket_backtrack)->recursive_matchingpath);
  11165. }
  11166. /* Drop STR_PTR for non-greedy plus quantifier. */
  11167. if (opcode != OP_ONCE)
  11168. free_stack(common, 1);
  11169. }
  11170. else
  11171. JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->recursive_matchingpath);
  11172. }
  11173. rmin_label = LABEL();
  11174. if (repeat_type != 0)
  11175. OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1);
  11176. }
  11177. else if (bra == OP_BRAZERO)
  11178. {
  11179. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11180. free_stack(common, 1);
  11181. brazero = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0);
  11182. }
  11183. else if (repeat_type == OP_EXACT)
  11184. {
  11185. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1);
  11186. exact_label = LABEL();
  11187. }
  11188. if (offset != 0)
  11189. {
  11190. if (common->capture_last_ptr != 0)
  11191. {
  11192. SLJIT_ASSERT(common->optimized_cbracket[offset >> 1] == 0);
  11193. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11194. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
  11195. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, TMP1, 0);
  11196. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(2));
  11197. free_stack(common, 3);
  11198. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP2, 0);
  11199. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP1, 0);
  11200. }
  11201. else if (common->optimized_cbracket[offset >> 1] == 0)
  11202. {
  11203. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11204. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
  11205. free_stack(common, 2);
  11206. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);
  11207. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP2, 0);
  11208. }
  11209. }
  11210. if (SLJIT_UNLIKELY(opcode == OP_ONCE))
  11211. {
  11212. if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0)
  11213. {
  11214. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  11215. add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
  11216. OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (CURRENT_AS(bracket_backtrack)->u.framesize - 1) * sizeof(sljit_sw));
  11217. }
  11218. once = JUMP(SLJIT_JUMP);
  11219. }
  11220. else if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND))
  11221. {
  11222. if (has_alternatives)
  11223. {
  11224. /* Always exactly one alternative. */
  11225. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11226. free_stack(common, 1);
  11227. alt_max = 2;
  11228. next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0);
  11229. }
  11230. }
  11231. else if (has_alternatives)
  11232. {
  11233. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11234. free_stack(common, 1);
  11235. if (alt_max > 3)
  11236. {
  11237. sljit_emit_ijump(compiler, SLJIT_JUMP, TMP1, 0);
  11238. SLJIT_ASSERT(CURRENT_AS(bracket_backtrack)->u.matching_put_label);
  11239. sljit_set_put_label(CURRENT_AS(bracket_backtrack)->u.matching_put_label, LABEL());
  11240. sljit_emit_op0(compiler, SLJIT_ENDBR);
  11241. }
  11242. else
  11243. next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0);
  11244. }
  11245. COMPILE_BACKTRACKINGPATH(current->top);
  11246. if (current->topbacktracks)
  11247. set_jumps(current->topbacktracks, LABEL());
  11248. if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND))
  11249. {
  11250. /* Conditional block always has at most one alternative. */
  11251. if (ccbegin[1 + LINK_SIZE] >= OP_ASSERT && ccbegin[1 + LINK_SIZE] <= OP_ASSERTBACK_NOT)
  11252. {
  11253. SLJIT_ASSERT(has_alternatives);
  11254. assert = CURRENT_AS(bracket_backtrack)->u.assert;
  11255. if (assert->framesize >= 0 && (ccbegin[1 + LINK_SIZE] == OP_ASSERT || ccbegin[1 + LINK_SIZE] == OP_ASSERTBACK))
  11256. {
  11257. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr);
  11258. add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
  11259. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-2));
  11260. OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (assert->framesize - 1) * sizeof(sljit_sw));
  11261. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr, TMP1, 0);
  11262. }
  11263. cond = JUMP(SLJIT_JUMP);
  11264. set_jumps(CURRENT_AS(bracket_backtrack)->u.assert->condfailed, LABEL());
  11265. }
  11266. else if (CURRENT_AS(bracket_backtrack)->u.condfailed != NULL)
  11267. {
  11268. SLJIT_ASSERT(has_alternatives);
  11269. cond = JUMP(SLJIT_JUMP);
  11270. set_jumps(CURRENT_AS(bracket_backtrack)->u.condfailed, LABEL());
  11271. }
  11272. else
  11273. SLJIT_ASSERT(!has_alternatives);
  11274. }
  11275. if (has_alternatives)
  11276. {
  11277. alt_count = 1;
  11278. do
  11279. {
  11280. current->top = NULL;
  11281. current->topbacktracks = NULL;
  11282. current->nextbacktracks = NULL;
  11283. /* Conditional blocks always have an additional alternative, even if it is empty. */
  11284. if (*cc == OP_ALT)
  11285. {
  11286. ccprev = cc + 1 + LINK_SIZE;
  11287. cc += GET(cc, 1);
  11288. if (opcode != OP_COND && opcode != OP_SCOND)
  11289. {
  11290. if (opcode != OP_ONCE)
  11291. {
  11292. if (private_data_ptr != 0)
  11293. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  11294. else
  11295. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11296. }
  11297. else
  11298. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(needs_control_head ? 1 : 0));
  11299. }
  11300. compile_matchingpath(common, ccprev, cc, current);
  11301. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  11302. return;
  11303. if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA)
  11304. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
  11305. if (opcode == OP_SCRIPT_RUN)
  11306. match_script_run_common(common, private_data_ptr, current);
  11307. }
  11308. /* Instructions after the current alternative is successfully matched. */
  11309. /* There is a similar code in compile_bracket_matchingpath. */
  11310. if (opcode == OP_ONCE)
  11311. match_once_common(common, ket, CURRENT_AS(bracket_backtrack)->u.framesize, private_data_ptr, has_alternatives, needs_control_head);
  11312. stacksize = 0;
  11313. if (repeat_type == OP_MINUPTO)
  11314. {
  11315. /* We need to preserve the counter. TMP2 will be used below. */
  11316. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr);
  11317. stacksize++;
  11318. }
  11319. if (ket != OP_KET || bra != OP_BRA)
  11320. stacksize++;
  11321. if (offset != 0)
  11322. {
  11323. if (common->capture_last_ptr != 0)
  11324. stacksize++;
  11325. if (common->optimized_cbracket[offset >> 1] == 0)
  11326. stacksize += 2;
  11327. }
  11328. if (opcode != OP_ONCE)
  11329. stacksize++;
  11330. if (stacksize > 0)
  11331. allocate_stack(common, stacksize);
  11332. stacksize = 0;
  11333. if (repeat_type == OP_MINUPTO)
  11334. {
  11335. /* TMP2 was set above. */
  11336. OP2(SLJIT_SUB, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP2, 0, SLJIT_IMM, 1);
  11337. stacksize++;
  11338. }
  11339. if (ket != OP_KET || bra != OP_BRA)
  11340. {
  11341. if (ket != OP_KET)
  11342. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);
  11343. else
  11344. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0);
  11345. stacksize++;
  11346. }
  11347. if (offset != 0)
  11348. stacksize = match_capture_common(common, stacksize, offset, private_data_ptr);
  11349. if (opcode != OP_ONCE)
  11350. {
  11351. if (alt_max <= 3)
  11352. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, alt_count);
  11353. else
  11354. put_label = sljit_emit_put_label(compiler, SLJIT_MEM1(STACK_TOP), STACK(stacksize));
  11355. }
  11356. if (offset != 0 && ket == OP_KETRMAX && common->optimized_cbracket[offset >> 1] != 0)
  11357. {
  11358. /* If ket is not OP_KETRMAX, this code path is executed after the jump to alternative_matchingpath. */
  11359. SLJIT_ASSERT(private_data_ptr == OVECTOR(offset + 0));
  11360. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);
  11361. }
  11362. JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->alternative_matchingpath);
  11363. if (opcode != OP_ONCE)
  11364. {
  11365. if (alt_max <= 3)
  11366. {
  11367. JUMPHERE(next_alt);
  11368. alt_count++;
  11369. if (alt_count < alt_max)
  11370. {
  11371. SLJIT_ASSERT(alt_count == 2 && alt_max == 3);
  11372. next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 1);
  11373. }
  11374. }
  11375. else
  11376. {
  11377. sljit_set_put_label(put_label, LABEL());
  11378. sljit_emit_op0(compiler, SLJIT_ENDBR);
  11379. }
  11380. }
  11381. COMPILE_BACKTRACKINGPATH(current->top);
  11382. if (current->topbacktracks)
  11383. set_jumps(current->topbacktracks, LABEL());
  11384. SLJIT_ASSERT(!current->nextbacktracks);
  11385. }
  11386. while (*cc == OP_ALT);
  11387. if (cond != NULL)
  11388. {
  11389. SLJIT_ASSERT(opcode == OP_COND || opcode == OP_SCOND);
  11390. assert = CURRENT_AS(bracket_backtrack)->u.assert;
  11391. if ((ccbegin[1 + LINK_SIZE] == OP_ASSERT_NOT || ccbegin[1 + LINK_SIZE] == OP_ASSERTBACK_NOT) && assert->framesize >= 0)
  11392. {
  11393. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr);
  11394. add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
  11395. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-2));
  11396. OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (assert->framesize - 1) * sizeof(sljit_sw));
  11397. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr, TMP1, 0);
  11398. }
  11399. JUMPHERE(cond);
  11400. }
  11401. /* Free the STR_PTR. */
  11402. if (private_data_ptr == 0)
  11403. free_stack(common, 1);
  11404. }
  11405. if (offset != 0)
  11406. {
  11407. /* Using both tmp register is better for instruction scheduling. */
  11408. if (common->optimized_cbracket[offset >> 1] != 0)
  11409. {
  11410. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11411. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
  11412. free_stack(common, 2);
  11413. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);
  11414. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP2, 0);
  11415. }
  11416. else
  11417. {
  11418. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11419. free_stack(common, 1);
  11420. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);
  11421. }
  11422. }
  11423. else if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA || opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND)
  11424. {
  11425. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(0));
  11426. free_stack(common, 1);
  11427. }
  11428. else if (opcode == OP_ONCE)
  11429. {
  11430. cc = ccbegin + GET(ccbegin, 1);
  11431. stacksize = needs_control_head ? 1 : 0;
  11432. if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0)
  11433. {
  11434. /* Reset head and drop saved frame. */
  11435. stacksize += CURRENT_AS(bracket_backtrack)->u.framesize + ((ket != OP_KET || *cc == OP_ALT) ? 2 : 1);
  11436. }
  11437. else if (ket == OP_KETRMAX || (*cc == OP_ALT && ket != OP_KETRMIN))
  11438. {
  11439. /* The STR_PTR must be released. */
  11440. stacksize++;
  11441. }
  11442. if (stacksize > 0)
  11443. free_stack(common, stacksize);
  11444. JUMPHERE(once);
  11445. /* Restore previous private_data_ptr */
  11446. if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0)
  11447. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-CURRENT_AS(bracket_backtrack)->u.framesize - 1));
  11448. else if (ket == OP_KETRMIN)
  11449. {
  11450. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
  11451. /* See the comment below. */
  11452. free_stack(common, 2);
  11453. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);
  11454. }
  11455. }
  11456. if (repeat_type == OP_EXACT)
  11457. {
  11458. OP2(SLJIT_ADD, TMP1, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1);
  11459. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, TMP1, 0);
  11460. CMPTO(SLJIT_LESS_EQUAL, TMP1, 0, SLJIT_IMM, repeat_count, exact_label);
  11461. }
  11462. else if (ket == OP_KETRMAX)
  11463. {
  11464. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11465. if (bra != OP_BRAZERO)
  11466. free_stack(common, 1);
  11467. CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(bracket_backtrack)->recursive_matchingpath);
  11468. if (bra == OP_BRAZERO)
  11469. {
  11470. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
  11471. JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->zero_matchingpath);
  11472. JUMPHERE(brazero);
  11473. free_stack(common, 1);
  11474. }
  11475. }
  11476. else if (ket == OP_KETRMIN)
  11477. {
  11478. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11479. /* OP_ONCE removes everything in case of a backtrack, so we don't
  11480. need to explicitly release the STR_PTR. The extra release would
  11481. affect badly the free_stack(2) above. */
  11482. if (opcode != OP_ONCE)
  11483. free_stack(common, 1);
  11484. CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, rmin_label);
  11485. if (opcode == OP_ONCE)
  11486. free_stack(common, bra == OP_BRAMINZERO ? 2 : 1);
  11487. else if (bra == OP_BRAMINZERO)
  11488. free_stack(common, 1);
  11489. }
  11490. else if (bra == OP_BRAZERO)
  11491. {
  11492. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11493. JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->zero_matchingpath);
  11494. JUMPHERE(brazero);
  11495. }
  11496. }
  11497. static SLJIT_INLINE void compile_bracketpos_backtrackingpath(compiler_common *common, struct backtrack_common *current)
  11498. {
  11499. DEFINE_COMPILER;
  11500. int offset;
  11501. struct sljit_jump *jump;
  11502. if (CURRENT_AS(bracketpos_backtrack)->framesize < 0)
  11503. {
  11504. if (*current->cc == OP_CBRAPOS || *current->cc == OP_SCBRAPOS)
  11505. {
  11506. offset = (GET2(current->cc, 1 + LINK_SIZE)) << 1;
  11507. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11508. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
  11509. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);
  11510. if (common->capture_last_ptr != 0)
  11511. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(2));
  11512. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP2, 0);
  11513. if (common->capture_last_ptr != 0)
  11514. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, TMP1, 0);
  11515. }
  11516. set_jumps(current->topbacktracks, LABEL());
  11517. free_stack(common, CURRENT_AS(bracketpos_backtrack)->stacksize);
  11518. return;
  11519. }
  11520. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(bracketpos_backtrack)->private_data_ptr);
  11521. add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
  11522. OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (CURRENT_AS(bracketpos_backtrack)->framesize - 1) * sizeof(sljit_sw));
  11523. if (current->topbacktracks)
  11524. {
  11525. jump = JUMP(SLJIT_JUMP);
  11526. set_jumps(current->topbacktracks, LABEL());
  11527. /* Drop the stack frame. */
  11528. free_stack(common, CURRENT_AS(bracketpos_backtrack)->stacksize);
  11529. JUMPHERE(jump);
  11530. }
  11531. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(bracketpos_backtrack)->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-CURRENT_AS(bracketpos_backtrack)->framesize - 1));
  11532. }
  11533. static SLJIT_INLINE void compile_braminzero_backtrackingpath(compiler_common *common, struct backtrack_common *current)
  11534. {
  11535. assert_backtrack backtrack;
  11536. current->top = NULL;
  11537. current->topbacktracks = NULL;
  11538. current->nextbacktracks = NULL;
  11539. if (current->cc[1] > OP_ASSERTBACK_NOT)
  11540. {
  11541. /* Manual call of compile_bracket_matchingpath and compile_bracket_backtrackingpath. */
  11542. compile_bracket_matchingpath(common, current->cc, current);
  11543. compile_bracket_backtrackingpath(common, current->top);
  11544. }
  11545. else
  11546. {
  11547. memset(&backtrack, 0, sizeof(backtrack));
  11548. backtrack.common.cc = current->cc;
  11549. backtrack.matchingpath = CURRENT_AS(braminzero_backtrack)->matchingpath;
  11550. /* Manual call of compile_assert_matchingpath. */
  11551. compile_assert_matchingpath(common, current->cc, &backtrack, FALSE);
  11552. }
  11553. SLJIT_ASSERT(!current->nextbacktracks && !current->topbacktracks);
  11554. }
  11555. static SLJIT_INLINE void compile_control_verb_backtrackingpath(compiler_common *common, struct backtrack_common *current)
  11556. {
  11557. DEFINE_COMPILER;
  11558. PCRE2_UCHAR opcode = *current->cc;
  11559. struct sljit_label *loop;
  11560. struct sljit_jump *jump;
  11561. if (opcode == OP_THEN || opcode == OP_THEN_ARG)
  11562. {
  11563. if (common->then_trap != NULL)
  11564. {
  11565. SLJIT_ASSERT(common->control_head_ptr != 0);
  11566. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
  11567. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, type_then_trap);
  11568. OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, common->then_trap->start);
  11569. jump = JUMP(SLJIT_JUMP);
  11570. loop = LABEL();
  11571. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11572. JUMPHERE(jump);
  11573. CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0, loop);
  11574. CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(2), TMP2, 0, loop);
  11575. add_jump(compiler, &common->then_trap->quit, JUMP(SLJIT_JUMP));
  11576. return;
  11577. }
  11578. else if (!common->local_quit_available && common->in_positive_assertion)
  11579. {
  11580. add_jump(compiler, &common->positive_assertion_quit, JUMP(SLJIT_JUMP));
  11581. return;
  11582. }
  11583. }
  11584. if (common->local_quit_available)
  11585. {
  11586. /* Abort match with a fail. */
  11587. if (common->quit_label == NULL)
  11588. add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP));
  11589. else
  11590. JUMPTO(SLJIT_JUMP, common->quit_label);
  11591. return;
  11592. }
  11593. if (opcode == OP_SKIP_ARG)
  11594. {
  11595. SLJIT_ASSERT(common->control_head_ptr != 0 && TMP1 == SLJIT_R0 && STR_PTR == SLJIT_R1);
  11596. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
  11597. OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)(current->cc + 2));
  11598. sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W), SLJIT_IMM, SLJIT_FUNC_ADDR(do_search_mark));
  11599. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_R0, 0);
  11600. add_jump(compiler, &common->reset_match, CMP(SLJIT_NOT_EQUAL, SLJIT_R0, 0, SLJIT_IMM, 0));
  11601. return;
  11602. }
  11603. if (opcode == OP_SKIP)
  11604. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11605. else
  11606. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_IMM, 0);
  11607. add_jump(compiler, &common->reset_match, JUMP(SLJIT_JUMP));
  11608. }
  11609. static SLJIT_INLINE void compile_then_trap_backtrackingpath(compiler_common *common, struct backtrack_common *current)
  11610. {
  11611. DEFINE_COMPILER;
  11612. struct sljit_jump *jump;
  11613. int size;
  11614. if (CURRENT_AS(then_trap_backtrack)->then_trap)
  11615. {
  11616. common->then_trap = CURRENT_AS(then_trap_backtrack)->then_trap;
  11617. return;
  11618. }
  11619. size = CURRENT_AS(then_trap_backtrack)->framesize;
  11620. size = 3 + (size < 0 ? 0 : size);
  11621. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(size - 3));
  11622. free_stack(common, size);
  11623. jump = JUMP(SLJIT_JUMP);
  11624. set_jumps(CURRENT_AS(then_trap_backtrack)->quit, LABEL());
  11625. /* STACK_TOP is set by THEN. */
  11626. if (CURRENT_AS(then_trap_backtrack)->framesize >= 0)
  11627. {
  11628. add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
  11629. OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (CURRENT_AS(then_trap_backtrack)->framesize - 1) * sizeof(sljit_sw));
  11630. }
  11631. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11632. free_stack(common, 3);
  11633. JUMPHERE(jump);
  11634. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP1, 0);
  11635. }
  11636. static void compile_backtrackingpath(compiler_common *common, struct backtrack_common *current)
  11637. {
  11638. DEFINE_COMPILER;
  11639. then_trap_backtrack *save_then_trap = common->then_trap;
  11640. while (current)
  11641. {
  11642. if (current->nextbacktracks != NULL)
  11643. set_jumps(current->nextbacktracks, LABEL());
  11644. switch(*current->cc)
  11645. {
  11646. case OP_SET_SOM:
  11647. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11648. free_stack(common, 1);
  11649. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), TMP1, 0);
  11650. break;
  11651. case OP_STAR:
  11652. case OP_MINSTAR:
  11653. case OP_PLUS:
  11654. case OP_MINPLUS:
  11655. case OP_QUERY:
  11656. case OP_MINQUERY:
  11657. case OP_UPTO:
  11658. case OP_MINUPTO:
  11659. case OP_EXACT:
  11660. case OP_POSSTAR:
  11661. case OP_POSPLUS:
  11662. case OP_POSQUERY:
  11663. case OP_POSUPTO:
  11664. case OP_STARI:
  11665. case OP_MINSTARI:
  11666. case OP_PLUSI:
  11667. case OP_MINPLUSI:
  11668. case OP_QUERYI:
  11669. case OP_MINQUERYI:
  11670. case OP_UPTOI:
  11671. case OP_MINUPTOI:
  11672. case OP_EXACTI:
  11673. case OP_POSSTARI:
  11674. case OP_POSPLUSI:
  11675. case OP_POSQUERYI:
  11676. case OP_POSUPTOI:
  11677. case OP_NOTSTAR:
  11678. case OP_NOTMINSTAR:
  11679. case OP_NOTPLUS:
  11680. case OP_NOTMINPLUS:
  11681. case OP_NOTQUERY:
  11682. case OP_NOTMINQUERY:
  11683. case OP_NOTUPTO:
  11684. case OP_NOTMINUPTO:
  11685. case OP_NOTEXACT:
  11686. case OP_NOTPOSSTAR:
  11687. case OP_NOTPOSPLUS:
  11688. case OP_NOTPOSQUERY:
  11689. case OP_NOTPOSUPTO:
  11690. case OP_NOTSTARI:
  11691. case OP_NOTMINSTARI:
  11692. case OP_NOTPLUSI:
  11693. case OP_NOTMINPLUSI:
  11694. case OP_NOTQUERYI:
  11695. case OP_NOTMINQUERYI:
  11696. case OP_NOTUPTOI:
  11697. case OP_NOTMINUPTOI:
  11698. case OP_NOTEXACTI:
  11699. case OP_NOTPOSSTARI:
  11700. case OP_NOTPOSPLUSI:
  11701. case OP_NOTPOSQUERYI:
  11702. case OP_NOTPOSUPTOI:
  11703. case OP_TYPESTAR:
  11704. case OP_TYPEMINSTAR:
  11705. case OP_TYPEPLUS:
  11706. case OP_TYPEMINPLUS:
  11707. case OP_TYPEQUERY:
  11708. case OP_TYPEMINQUERY:
  11709. case OP_TYPEUPTO:
  11710. case OP_TYPEMINUPTO:
  11711. case OP_TYPEEXACT:
  11712. case OP_TYPEPOSSTAR:
  11713. case OP_TYPEPOSPLUS:
  11714. case OP_TYPEPOSQUERY:
  11715. case OP_TYPEPOSUPTO:
  11716. case OP_CLASS:
  11717. case OP_NCLASS:
  11718. #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
  11719. case OP_XCLASS:
  11720. #endif
  11721. compile_iterator_backtrackingpath(common, current);
  11722. break;
  11723. case OP_REF:
  11724. case OP_REFI:
  11725. case OP_DNREF:
  11726. case OP_DNREFI:
  11727. compile_ref_iterator_backtrackingpath(common, current);
  11728. break;
  11729. case OP_RECURSE:
  11730. compile_recurse_backtrackingpath(common, current);
  11731. break;
  11732. case OP_ASSERT:
  11733. case OP_ASSERT_NOT:
  11734. case OP_ASSERTBACK:
  11735. case OP_ASSERTBACK_NOT:
  11736. compile_assert_backtrackingpath(common, current);
  11737. break;
  11738. case OP_ASSERT_NA:
  11739. case OP_ASSERTBACK_NA:
  11740. case OP_ONCE:
  11741. case OP_SCRIPT_RUN:
  11742. case OP_BRA:
  11743. case OP_CBRA:
  11744. case OP_COND:
  11745. case OP_SBRA:
  11746. case OP_SCBRA:
  11747. case OP_SCOND:
  11748. compile_bracket_backtrackingpath(common, current);
  11749. break;
  11750. case OP_BRAZERO:
  11751. if (current->cc[1] > OP_ASSERTBACK_NOT)
  11752. compile_bracket_backtrackingpath(common, current);
  11753. else
  11754. compile_assert_backtrackingpath(common, current);
  11755. break;
  11756. case OP_BRAPOS:
  11757. case OP_CBRAPOS:
  11758. case OP_SBRAPOS:
  11759. case OP_SCBRAPOS:
  11760. case OP_BRAPOSZERO:
  11761. compile_bracketpos_backtrackingpath(common, current);
  11762. break;
  11763. case OP_BRAMINZERO:
  11764. compile_braminzero_backtrackingpath(common, current);
  11765. break;
  11766. case OP_MARK:
  11767. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(common->has_skip_arg ? 4 : 0));
  11768. if (common->has_skip_arg)
  11769. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11770. free_stack(common, common->has_skip_arg ? 5 : 1);
  11771. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP1, 0);
  11772. if (common->has_skip_arg)
  11773. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP2, 0);
  11774. break;
  11775. case OP_THEN:
  11776. case OP_THEN_ARG:
  11777. case OP_PRUNE:
  11778. case OP_PRUNE_ARG:
  11779. case OP_SKIP:
  11780. case OP_SKIP_ARG:
  11781. compile_control_verb_backtrackingpath(common, current);
  11782. break;
  11783. case OP_COMMIT:
  11784. case OP_COMMIT_ARG:
  11785. if (!common->local_quit_available)
  11786. OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_NOMATCH);
  11787. if (common->quit_label == NULL)
  11788. add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP));
  11789. else
  11790. JUMPTO(SLJIT_JUMP, common->quit_label);
  11791. break;
  11792. case OP_CALLOUT:
  11793. case OP_CALLOUT_STR:
  11794. case OP_FAIL:
  11795. case OP_ACCEPT:
  11796. case OP_ASSERT_ACCEPT:
  11797. set_jumps(current->topbacktracks, LABEL());
  11798. break;
  11799. case OP_THEN_TRAP:
  11800. /* A virtual opcode for then traps. */
  11801. compile_then_trap_backtrackingpath(common, current);
  11802. break;
  11803. default:
  11804. SLJIT_UNREACHABLE();
  11805. break;
  11806. }
  11807. current = current->prev;
  11808. }
  11809. common->then_trap = save_then_trap;
  11810. }
  11811. static SLJIT_INLINE void compile_recurse(compiler_common *common)
  11812. {
  11813. DEFINE_COMPILER;
  11814. PCRE2_SPTR cc = common->start + common->currententry->start;
  11815. PCRE2_SPTR ccbegin = cc + 1 + LINK_SIZE + (*cc == OP_BRA ? 0 : IMM2_SIZE);
  11816. PCRE2_SPTR ccend = bracketend(cc) - (1 + LINK_SIZE);
  11817. uint32_t recurse_flags = 0;
  11818. int private_data_size = get_recurse_data_length(common, ccbegin, ccend, &recurse_flags);
  11819. int alt_count, alt_max, local_size;
  11820. backtrack_common altbacktrack;
  11821. jump_list *match = NULL;
  11822. struct sljit_jump *next_alt = NULL;
  11823. struct sljit_jump *accept_exit = NULL;
  11824. struct sljit_label *quit;
  11825. struct sljit_put_label *put_label = NULL;
  11826. /* Recurse captures then. */
  11827. common->then_trap = NULL;
  11828. SLJIT_ASSERT(*cc == OP_BRA || *cc == OP_CBRA || *cc == OP_CBRAPOS || *cc == OP_SCBRA || *cc == OP_SCBRAPOS);
  11829. alt_max = no_alternatives(cc);
  11830. alt_count = 0;
  11831. /* Matching path. */
  11832. SLJIT_ASSERT(common->currententry->entry_label == NULL && common->recursive_head_ptr != 0);
  11833. common->currententry->entry_label = LABEL();
  11834. set_jumps(common->currententry->entry_calls, common->currententry->entry_label);
  11835. sljit_emit_fast_enter(compiler, TMP2, 0);
  11836. count_match(common);
  11837. local_size = (alt_max > 1) ? 2 : 1;
  11838. /* (Reversed) stack layout:
  11839. [private data][return address][optional: str ptr] ... [optional: alternative index][recursive_head_ptr] */
  11840. allocate_stack(common, private_data_size + local_size);
  11841. /* Save return address. */
  11842. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(local_size - 1), TMP2, 0);
  11843. copy_recurse_data(common, ccbegin, ccend, recurse_copy_from_global, local_size, private_data_size + local_size, recurse_flags);
  11844. /* This variable is saved and restored all time when we enter or exit from a recursive context. */
  11845. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr, STACK_TOP, 0);
  11846. if (recurse_flags & recurse_flag_control_head_found)
  11847. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
  11848. if (alt_max > 1)
  11849. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
  11850. memset(&altbacktrack, 0, sizeof(backtrack_common));
  11851. common->quit_label = NULL;
  11852. common->accept_label = NULL;
  11853. common->quit = NULL;
  11854. common->accept = NULL;
  11855. altbacktrack.cc = ccbegin;
  11856. cc += GET(cc, 1);
  11857. while (1)
  11858. {
  11859. altbacktrack.top = NULL;
  11860. altbacktrack.topbacktracks = NULL;
  11861. if (altbacktrack.cc != ccbegin)
  11862. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11863. compile_matchingpath(common, altbacktrack.cc, cc, &altbacktrack);
  11864. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  11865. return;
  11866. allocate_stack(common, (alt_max > 1 || (recurse_flags & recurse_flag_accept_found)) ? 2 : 1);
  11867. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr);
  11868. if (alt_max > 1 || (recurse_flags & recurse_flag_accept_found))
  11869. {
  11870. if (alt_max > 3)
  11871. put_label = sljit_emit_put_label(compiler, SLJIT_MEM1(STACK_TOP), STACK(1));
  11872. else
  11873. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, alt_count);
  11874. }
  11875. add_jump(compiler, &match, JUMP(SLJIT_JUMP));
  11876. if (alt_count == 0)
  11877. {
  11878. /* Backtracking path entry. */
  11879. SLJIT_ASSERT(common->currententry->backtrack_label == NULL);
  11880. common->currententry->backtrack_label = LABEL();
  11881. set_jumps(common->currententry->backtrack_calls, common->currententry->backtrack_label);
  11882. sljit_emit_fast_enter(compiler, TMP1, 0);
  11883. if (recurse_flags & recurse_flag_accept_found)
  11884. accept_exit = CMP(SLJIT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, -1);
  11885. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
  11886. /* Save return address. */
  11887. OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), STACK(local_size - 1), TMP1, 0);
  11888. copy_recurse_data(common, ccbegin, ccend, recurse_swap_global, local_size, private_data_size + local_size, recurse_flags);
  11889. if (alt_max > 1)
  11890. {
  11891. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
  11892. free_stack(common, 2);
  11893. if (alt_max > 3)
  11894. {
  11895. sljit_emit_ijump(compiler, SLJIT_JUMP, TMP1, 0);
  11896. sljit_set_put_label(put_label, LABEL());
  11897. sljit_emit_op0(compiler, SLJIT_ENDBR);
  11898. }
  11899. else
  11900. next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0);
  11901. }
  11902. else
  11903. free_stack(common, (recurse_flags & recurse_flag_accept_found) ? 2 : 1);
  11904. }
  11905. else if (alt_max > 3)
  11906. {
  11907. sljit_set_put_label(put_label, LABEL());
  11908. sljit_emit_op0(compiler, SLJIT_ENDBR);
  11909. }
  11910. else
  11911. {
  11912. JUMPHERE(next_alt);
  11913. if (alt_count + 1 < alt_max)
  11914. {
  11915. SLJIT_ASSERT(alt_count == 1 && alt_max == 3);
  11916. next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 1);
  11917. }
  11918. }
  11919. alt_count++;
  11920. compile_backtrackingpath(common, altbacktrack.top);
  11921. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  11922. return;
  11923. set_jumps(altbacktrack.topbacktracks, LABEL());
  11924. if (*cc != OP_ALT)
  11925. break;
  11926. altbacktrack.cc = cc + 1 + LINK_SIZE;
  11927. cc += GET(cc, 1);
  11928. }
  11929. /* No alternative is matched. */
  11930. quit = LABEL();
  11931. copy_recurse_data(common, ccbegin, ccend, recurse_copy_private_to_global, local_size, private_data_size + local_size, recurse_flags);
  11932. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(local_size - 1));
  11933. free_stack(common, private_data_size + local_size);
  11934. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
  11935. OP_SRC(SLJIT_FAST_RETURN, TMP2, 0);
  11936. if (common->quit != NULL)
  11937. {
  11938. SLJIT_ASSERT(recurse_flags & recurse_flag_quit_found);
  11939. set_jumps(common->quit, LABEL());
  11940. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr);
  11941. copy_recurse_data(common, ccbegin, ccend, recurse_copy_shared_to_global, local_size, private_data_size + local_size, recurse_flags);
  11942. JUMPTO(SLJIT_JUMP, quit);
  11943. }
  11944. if (recurse_flags & recurse_flag_accept_found)
  11945. {
  11946. JUMPHERE(accept_exit);
  11947. free_stack(common, 2);
  11948. /* Save return address. */
  11949. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(local_size - 1), TMP1, 0);
  11950. copy_recurse_data(common, ccbegin, ccend, recurse_copy_kept_shared_to_global, local_size, private_data_size + local_size, recurse_flags);
  11951. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(local_size - 1));
  11952. free_stack(common, private_data_size + local_size);
  11953. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
  11954. OP_SRC(SLJIT_FAST_RETURN, TMP2, 0);
  11955. }
  11956. if (common->accept != NULL)
  11957. {
  11958. SLJIT_ASSERT(recurse_flags & recurse_flag_accept_found);
  11959. set_jumps(common->accept, LABEL());
  11960. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr);
  11961. OP1(SLJIT_MOV, TMP2, 0, STACK_TOP, 0);
  11962. allocate_stack(common, 2);
  11963. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, -1);
  11964. }
  11965. set_jumps(match, LABEL());
  11966. OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
  11967. copy_recurse_data(common, ccbegin, ccend, recurse_swap_global, local_size, private_data_size + local_size, recurse_flags);
  11968. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), STACK(local_size - 1));
  11969. OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1);
  11970. OP_SRC(SLJIT_FAST_RETURN, TMP2, 0);
  11971. }
  11972. #undef COMPILE_BACKTRACKINGPATH
  11973. #undef CURRENT_AS
  11974. #define PUBLIC_JIT_COMPILE_CONFIGURATION_OPTIONS \
  11975. (PCRE2_JIT_INVALID_UTF)
  11976. static int jit_compile(pcre2_code *code, sljit_u32 mode)
  11977. {
  11978. pcre2_real_code *re = (pcre2_real_code *)code;
  11979. struct sljit_compiler *compiler;
  11980. backtrack_common rootbacktrack;
  11981. compiler_common common_data;
  11982. compiler_common *common = &common_data;
  11983. const sljit_u8 *tables = re->tables;
  11984. void *allocator_data = &re->memctl;
  11985. int private_data_size;
  11986. PCRE2_SPTR ccend;
  11987. executable_functions *functions;
  11988. void *executable_func;
  11989. sljit_uw executable_size;
  11990. sljit_uw total_length;
  11991. struct sljit_label *mainloop_label = NULL;
  11992. struct sljit_label *continue_match_label;
  11993. struct sljit_label *empty_match_found_label = NULL;
  11994. struct sljit_label *empty_match_backtrack_label = NULL;
  11995. struct sljit_label *reset_match_label;
  11996. struct sljit_label *quit_label;
  11997. struct sljit_jump *jump;
  11998. struct sljit_jump *minlength_check_failed = NULL;
  11999. struct sljit_jump *empty_match = NULL;
  12000. struct sljit_jump *end_anchor_failed = NULL;
  12001. jump_list *reqcu_not_found = NULL;
  12002. SLJIT_ASSERT(tables);
  12003. #if HAS_VIRTUAL_REGISTERS == 1
  12004. SLJIT_ASSERT(sljit_get_register_index(TMP3) < 0 && sljit_get_register_index(ARGUMENTS) < 0 && sljit_get_register_index(RETURN_ADDR) < 0);
  12005. #elif HAS_VIRTUAL_REGISTERS == 0
  12006. SLJIT_ASSERT(sljit_get_register_index(TMP3) >= 0 && sljit_get_register_index(ARGUMENTS) >= 0 && sljit_get_register_index(RETURN_ADDR) >= 0);
  12007. #else
  12008. #error "Invalid value for HAS_VIRTUAL_REGISTERS"
  12009. #endif
  12010. memset(&rootbacktrack, 0, sizeof(backtrack_common));
  12011. memset(common, 0, sizeof(compiler_common));
  12012. common->re = re;
  12013. common->name_table = (PCRE2_SPTR)((uint8_t *)re + sizeof(pcre2_real_code));
  12014. rootbacktrack.cc = common->name_table + re->name_count * re->name_entry_size;
  12015. #ifdef SUPPORT_UNICODE
  12016. common->invalid_utf = (mode & PCRE2_JIT_INVALID_UTF) != 0;
  12017. #endif /* SUPPORT_UNICODE */
  12018. mode &= ~PUBLIC_JIT_COMPILE_CONFIGURATION_OPTIONS;
  12019. common->start = rootbacktrack.cc;
  12020. common->read_only_data_head = NULL;
  12021. common->fcc = tables + fcc_offset;
  12022. common->lcc = (sljit_sw)(tables + lcc_offset);
  12023. common->mode = mode;
  12024. common->might_be_empty = (re->minlength == 0) || (re->flags & PCRE2_MATCH_EMPTY);
  12025. common->allow_empty_partial = (re->max_lookbehind > 0) || (re->flags & PCRE2_MATCH_EMPTY);
  12026. common->nltype = NLTYPE_FIXED;
  12027. switch(re->newline_convention)
  12028. {
  12029. case PCRE2_NEWLINE_CR: common->newline = CHAR_CR; break;
  12030. case PCRE2_NEWLINE_LF: common->newline = CHAR_NL; break;
  12031. case PCRE2_NEWLINE_CRLF: common->newline = (CHAR_CR << 8) | CHAR_NL; break;
  12032. case PCRE2_NEWLINE_ANY: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANY; break;
  12033. case PCRE2_NEWLINE_ANYCRLF: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANYCRLF; break;
  12034. case PCRE2_NEWLINE_NUL: common->newline = CHAR_NUL; break;
  12035. default: return PCRE2_ERROR_INTERNAL;
  12036. }
  12037. common->nlmax = READ_CHAR_MAX;
  12038. common->nlmin = 0;
  12039. if (re->bsr_convention == PCRE2_BSR_UNICODE)
  12040. common->bsr_nltype = NLTYPE_ANY;
  12041. else if (re->bsr_convention == PCRE2_BSR_ANYCRLF)
  12042. common->bsr_nltype = NLTYPE_ANYCRLF;
  12043. else
  12044. {
  12045. #ifdef BSR_ANYCRLF
  12046. common->bsr_nltype = NLTYPE_ANYCRLF;
  12047. #else
  12048. common->bsr_nltype = NLTYPE_ANY;
  12049. #endif
  12050. }
  12051. common->bsr_nlmax = READ_CHAR_MAX;
  12052. common->bsr_nlmin = 0;
  12053. common->endonly = (re->overall_options & PCRE2_DOLLAR_ENDONLY) != 0;
  12054. common->ctypes = (sljit_sw)(tables + ctypes_offset);
  12055. common->name_count = re->name_count;
  12056. common->name_entry_size = re->name_entry_size;
  12057. common->unset_backref = (re->overall_options & PCRE2_MATCH_UNSET_BACKREF) != 0;
  12058. common->alt_circumflex = (re->overall_options & PCRE2_ALT_CIRCUMFLEX) != 0;
  12059. #ifdef SUPPORT_UNICODE
  12060. /* PCRE_UTF[16|32] have the same value as PCRE_UTF8. */
  12061. common->utf = (re->overall_options & PCRE2_UTF) != 0;
  12062. common->ucp = (re->overall_options & PCRE2_UCP) != 0;
  12063. if (common->utf)
  12064. {
  12065. if (common->nltype == NLTYPE_ANY)
  12066. common->nlmax = 0x2029;
  12067. else if (common->nltype == NLTYPE_ANYCRLF)
  12068. common->nlmax = (CHAR_CR > CHAR_NL) ? CHAR_CR : CHAR_NL;
  12069. else
  12070. {
  12071. /* We only care about the first newline character. */
  12072. common->nlmax = common->newline & 0xff;
  12073. }
  12074. if (common->nltype == NLTYPE_FIXED)
  12075. common->nlmin = common->newline & 0xff;
  12076. else
  12077. common->nlmin = (CHAR_CR < CHAR_NL) ? CHAR_CR : CHAR_NL;
  12078. if (common->bsr_nltype == NLTYPE_ANY)
  12079. common->bsr_nlmax = 0x2029;
  12080. else
  12081. common->bsr_nlmax = (CHAR_CR > CHAR_NL) ? CHAR_CR : CHAR_NL;
  12082. common->bsr_nlmin = (CHAR_CR < CHAR_NL) ? CHAR_CR : CHAR_NL;
  12083. }
  12084. else
  12085. common->invalid_utf = FALSE;
  12086. #endif /* SUPPORT_UNICODE */
  12087. ccend = bracketend(common->start);
  12088. /* Calculate the local space size on the stack. */
  12089. common->ovector_start = LIMIT_MATCH + sizeof(sljit_sw);
  12090. common->optimized_cbracket = (sljit_u8 *)SLJIT_MALLOC(re->top_bracket + 1, allocator_data);
  12091. if (!common->optimized_cbracket)
  12092. return PCRE2_ERROR_NOMEMORY;
  12093. #if defined DEBUG_FORCE_UNOPTIMIZED_CBRAS && DEBUG_FORCE_UNOPTIMIZED_CBRAS == 1
  12094. memset(common->optimized_cbracket, 0, re->top_bracket + 1);
  12095. #else
  12096. memset(common->optimized_cbracket, 1, re->top_bracket + 1);
  12097. #endif
  12098. SLJIT_ASSERT(*common->start == OP_BRA && ccend[-(1 + LINK_SIZE)] == OP_KET);
  12099. #if defined DEBUG_FORCE_UNOPTIMIZED_CBRAS && DEBUG_FORCE_UNOPTIMIZED_CBRAS == 2
  12100. common->capture_last_ptr = common->ovector_start;
  12101. common->ovector_start += sizeof(sljit_sw);
  12102. #endif
  12103. if (!check_opcode_types(common, common->start, ccend))
  12104. {
  12105. SLJIT_FREE(common->optimized_cbracket, allocator_data);
  12106. return PCRE2_ERROR_NOMEMORY;
  12107. }
  12108. /* Checking flags and updating ovector_start. */
  12109. if (mode == PCRE2_JIT_COMPLETE && (re->flags & PCRE2_LASTSET) != 0 && (re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
  12110. {
  12111. common->req_char_ptr = common->ovector_start;
  12112. common->ovector_start += sizeof(sljit_sw);
  12113. }
  12114. if (mode != PCRE2_JIT_COMPLETE)
  12115. {
  12116. common->start_used_ptr = common->ovector_start;
  12117. common->ovector_start += sizeof(sljit_sw);
  12118. if (mode == PCRE2_JIT_PARTIAL_SOFT)
  12119. {
  12120. common->hit_start = common->ovector_start;
  12121. common->ovector_start += sizeof(sljit_sw);
  12122. }
  12123. }
  12124. if ((re->overall_options & (PCRE2_FIRSTLINE | PCRE2_USE_OFFSET_LIMIT)) != 0)
  12125. {
  12126. common->match_end_ptr = common->ovector_start;
  12127. common->ovector_start += sizeof(sljit_sw);
  12128. }
  12129. #if defined DEBUG_FORCE_CONTROL_HEAD && DEBUG_FORCE_CONTROL_HEAD
  12130. common->control_head_ptr = 1;
  12131. #endif
  12132. if (common->control_head_ptr != 0)
  12133. {
  12134. common->control_head_ptr = common->ovector_start;
  12135. common->ovector_start += sizeof(sljit_sw);
  12136. }
  12137. if (common->has_set_som)
  12138. {
  12139. /* Saving the real start pointer is necessary. */
  12140. common->start_ptr = common->ovector_start;
  12141. common->ovector_start += sizeof(sljit_sw);
  12142. }
  12143. /* Aligning ovector to even number of sljit words. */
  12144. if ((common->ovector_start & sizeof(sljit_sw)) != 0)
  12145. common->ovector_start += sizeof(sljit_sw);
  12146. if (common->start_ptr == 0)
  12147. common->start_ptr = OVECTOR(0);
  12148. /* Capturing brackets cannot be optimized if callouts are allowed. */
  12149. if (common->capture_last_ptr != 0)
  12150. memset(common->optimized_cbracket, 0, re->top_bracket + 1);
  12151. SLJIT_ASSERT(!(common->req_char_ptr != 0 && common->start_used_ptr != 0));
  12152. common->cbra_ptr = OVECTOR_START + (re->top_bracket + 1) * 2 * sizeof(sljit_sw);
  12153. total_length = ccend - common->start;
  12154. common->private_data_ptrs = (sljit_s32*)SLJIT_MALLOC(total_length * (sizeof(sljit_s32) + (common->has_then ? 1 : 0)), allocator_data);
  12155. if (!common->private_data_ptrs)
  12156. {
  12157. SLJIT_FREE(common->optimized_cbracket, allocator_data);
  12158. return PCRE2_ERROR_NOMEMORY;
  12159. }
  12160. memset(common->private_data_ptrs, 0, total_length * sizeof(sljit_s32));
  12161. private_data_size = common->cbra_ptr + (re->top_bracket + 1) * sizeof(sljit_sw);
  12162. if ((re->overall_options & PCRE2_ANCHORED) == 0 && (re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0 && !common->has_skip_in_assert_back)
  12163. detect_early_fail(common, common->start, &private_data_size, 0, 0, TRUE);
  12164. set_private_data_ptrs(common, &private_data_size, ccend);
  12165. SLJIT_ASSERT(common->early_fail_start_ptr <= common->early_fail_end_ptr);
  12166. if (private_data_size > SLJIT_MAX_LOCAL_SIZE)
  12167. {
  12168. SLJIT_FREE(common->private_data_ptrs, allocator_data);
  12169. SLJIT_FREE(common->optimized_cbracket, allocator_data);
  12170. return PCRE2_ERROR_NOMEMORY;
  12171. }
  12172. if (common->has_then)
  12173. {
  12174. common->then_offsets = (sljit_u8 *)(common->private_data_ptrs + total_length);
  12175. memset(common->then_offsets, 0, total_length);
  12176. set_then_offsets(common, common->start, NULL);
  12177. }
  12178. compiler = sljit_create_compiler(allocator_data, NULL);
  12179. if (!compiler)
  12180. {
  12181. SLJIT_FREE(common->optimized_cbracket, allocator_data);
  12182. SLJIT_FREE(common->private_data_ptrs, allocator_data);
  12183. return PCRE2_ERROR_NOMEMORY;
  12184. }
  12185. common->compiler = compiler;
  12186. /* Main pcre2_jit_exec entry. */
  12187. SLJIT_ASSERT((private_data_size & (sizeof(sljit_sw) - 1)) == 0);
  12188. sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, W), 5, 5, 0, 0, private_data_size);
  12189. /* Register init. */
  12190. reset_ovector(common, (re->top_bracket + 1) * 2);
  12191. if (common->req_char_ptr != 0)
  12192. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr, SLJIT_R0, 0);
  12193. OP1(SLJIT_MOV, ARGUMENTS, 0, SLJIT_S0, 0);
  12194. OP1(SLJIT_MOV, TMP1, 0, SLJIT_S0, 0);
  12195. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
  12196. OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, end));
  12197. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack));
  12198. OP1(SLJIT_MOV_U32, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, limit_match));
  12199. OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, end));
  12200. OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, start));
  12201. OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
  12202. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH, TMP1, 0);
  12203. if (common->early_fail_start_ptr < common->early_fail_end_ptr)
  12204. reset_early_fail(common);
  12205. if (mode == PCRE2_JIT_PARTIAL_SOFT)
  12206. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1);
  12207. if (common->mark_ptr != 0)
  12208. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, SLJIT_IMM, 0);
  12209. if (common->control_head_ptr != 0)
  12210. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
  12211. /* Main part of the matching */
  12212. if ((re->overall_options & PCRE2_ANCHORED) == 0)
  12213. {
  12214. mainloop_label = mainloop_entry(common);
  12215. continue_match_label = LABEL();
  12216. /* Forward search if possible. */
  12217. if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
  12218. {
  12219. if (mode == PCRE2_JIT_COMPLETE && fast_forward_first_n_chars(common))
  12220. ;
  12221. else if ((re->flags & PCRE2_FIRSTSET) != 0)
  12222. fast_forward_first_char(common);
  12223. else if ((re->flags & PCRE2_STARTLINE) != 0)
  12224. fast_forward_newline(common);
  12225. else if ((re->flags & PCRE2_FIRSTMAPSET) != 0)
  12226. fast_forward_start_bits(common);
  12227. }
  12228. }
  12229. else
  12230. continue_match_label = LABEL();
  12231. if (mode == PCRE2_JIT_COMPLETE && re->minlength > 0 && (re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
  12232. {
  12233. OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_NOMATCH);
  12234. OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(re->minlength));
  12235. minlength_check_failed = CMP(SLJIT_GREATER, TMP2, 0, STR_END, 0);
  12236. }
  12237. if (common->req_char_ptr != 0)
  12238. reqcu_not_found = search_requested_char(common, (PCRE2_UCHAR)(re->last_codeunit), (re->flags & PCRE2_LASTCASELESS) != 0, (re->flags & PCRE2_FIRSTSET) != 0);
  12239. /* Store the current STR_PTR in OVECTOR(0). */
  12240. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), STR_PTR, 0);
  12241. /* Copy the limit of allowed recursions. */
  12242. OP1(SLJIT_MOV, COUNT_MATCH, 0, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH);
  12243. if (common->capture_last_ptr != 0)
  12244. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, 0);
  12245. if (common->fast_forward_bc_ptr != NULL)
  12246. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), PRIVATE_DATA(common->fast_forward_bc_ptr + 1) >> 3, STR_PTR, 0);
  12247. if (common->start_ptr != OVECTOR(0))
  12248. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_ptr, STR_PTR, 0);
  12249. /* Copy the beginning of the string. */
  12250. if (mode == PCRE2_JIT_PARTIAL_SOFT)
  12251. {
  12252. jump = CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1);
  12253. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
  12254. JUMPHERE(jump);
  12255. }
  12256. else if (mode == PCRE2_JIT_PARTIAL_HARD)
  12257. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
  12258. compile_matchingpath(common, common->start, ccend, &rootbacktrack);
  12259. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  12260. {
  12261. sljit_free_compiler(compiler);
  12262. SLJIT_FREE(common->optimized_cbracket, allocator_data);
  12263. SLJIT_FREE(common->private_data_ptrs, allocator_data);
  12264. PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data);
  12265. return PCRE2_ERROR_NOMEMORY;
  12266. }
  12267. if ((re->overall_options & PCRE2_ENDANCHORED) != 0)
  12268. end_anchor_failed = CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, STR_END, 0);
  12269. if (common->might_be_empty)
  12270. {
  12271. empty_match = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0));
  12272. empty_match_found_label = LABEL();
  12273. }
  12274. common->accept_label = LABEL();
  12275. if (common->accept != NULL)
  12276. set_jumps(common->accept, common->accept_label);
  12277. /* This means we have a match. Update the ovector. */
  12278. copy_ovector(common, re->top_bracket + 1);
  12279. common->quit_label = common->abort_label = LABEL();
  12280. if (common->quit != NULL)
  12281. set_jumps(common->quit, common->quit_label);
  12282. if (common->abort != NULL)
  12283. set_jumps(common->abort, common->abort_label);
  12284. if (minlength_check_failed != NULL)
  12285. SET_LABEL(minlength_check_failed, common->abort_label);
  12286. sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN);
  12287. sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
  12288. if (common->failed_match != NULL)
  12289. {
  12290. SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE);
  12291. set_jumps(common->failed_match, LABEL());
  12292. OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_NOMATCH);
  12293. JUMPTO(SLJIT_JUMP, common->abort_label);
  12294. }
  12295. if ((re->overall_options & PCRE2_ENDANCHORED) != 0)
  12296. JUMPHERE(end_anchor_failed);
  12297. if (mode != PCRE2_JIT_COMPLETE)
  12298. {
  12299. common->partialmatchlabel = LABEL();
  12300. set_jumps(common->partialmatch, common->partialmatchlabel);
  12301. return_with_partial_match(common, common->quit_label);
  12302. }
  12303. if (common->might_be_empty)
  12304. empty_match_backtrack_label = LABEL();
  12305. compile_backtrackingpath(common, rootbacktrack.top);
  12306. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  12307. {
  12308. sljit_free_compiler(compiler);
  12309. SLJIT_FREE(common->optimized_cbracket, allocator_data);
  12310. SLJIT_FREE(common->private_data_ptrs, allocator_data);
  12311. PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data);
  12312. return PCRE2_ERROR_NOMEMORY;
  12313. }
  12314. SLJIT_ASSERT(rootbacktrack.prev == NULL);
  12315. reset_match_label = LABEL();
  12316. if (mode == PCRE2_JIT_PARTIAL_SOFT)
  12317. {
  12318. /* Update hit_start only in the first time. */
  12319. jump = CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);
  12320. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
  12321. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1);
  12322. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, TMP1, 0);
  12323. JUMPHERE(jump);
  12324. }
  12325. /* Check we have remaining characters. */
  12326. if ((re->overall_options & PCRE2_ANCHORED) == 0 && common->match_end_ptr != 0)
  12327. {
  12328. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
  12329. }
  12330. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP),
  12331. (common->fast_forward_bc_ptr != NULL) ? (PRIVATE_DATA(common->fast_forward_bc_ptr + 1) >> 3) : common->start_ptr);
  12332. if ((re->overall_options & PCRE2_ANCHORED) == 0)
  12333. {
  12334. if (common->ff_newline_shortcut != NULL)
  12335. {
  12336. /* There cannot be more newlines if PCRE2_FIRSTLINE is set. */
  12337. if ((re->overall_options & PCRE2_FIRSTLINE) == 0)
  12338. {
  12339. if (common->match_end_ptr != 0)
  12340. {
  12341. OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
  12342. OP1(SLJIT_MOV, STR_END, 0, TMP1, 0);
  12343. CMPTO(SLJIT_LESS, STR_PTR, 0, TMP1, 0, common->ff_newline_shortcut);
  12344. OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
  12345. }
  12346. else
  12347. CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, common->ff_newline_shortcut);
  12348. }
  12349. }
  12350. else
  12351. CMPTO(SLJIT_LESS, STR_PTR, 0, (common->match_end_ptr == 0) ? STR_END : TMP1, 0, mainloop_label);
  12352. }
  12353. /* No more remaining characters. */
  12354. if (reqcu_not_found != NULL)
  12355. set_jumps(reqcu_not_found, LABEL());
  12356. if (mode == PCRE2_JIT_PARTIAL_SOFT)
  12357. CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1, common->partialmatchlabel);
  12358. OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_NOMATCH);
  12359. JUMPTO(SLJIT_JUMP, common->quit_label);
  12360. flush_stubs(common);
  12361. if (common->might_be_empty)
  12362. {
  12363. JUMPHERE(empty_match);
  12364. OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
  12365. OP1(SLJIT_MOV_U32, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options));
  12366. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY);
  12367. JUMPTO(SLJIT_NOT_ZERO, empty_match_backtrack_label);
  12368. OP2U(SLJIT_AND | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY_ATSTART);
  12369. JUMPTO(SLJIT_ZERO, empty_match_found_label);
  12370. OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
  12371. CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0, empty_match_found_label);
  12372. JUMPTO(SLJIT_JUMP, empty_match_backtrack_label);
  12373. }
  12374. common->fast_forward_bc_ptr = NULL;
  12375. common->early_fail_start_ptr = 0;
  12376. common->early_fail_end_ptr = 0;
  12377. common->currententry = common->entries;
  12378. common->local_quit_available = TRUE;
  12379. quit_label = common->quit_label;
  12380. if (common->currententry != NULL)
  12381. {
  12382. /* A free bit for each private data. */
  12383. common->recurse_bitset_size = ((private_data_size / (int)sizeof(sljit_sw)) + 7) >> 3;
  12384. SLJIT_ASSERT(common->recurse_bitset_size > 0);
  12385. common->recurse_bitset = (sljit_u8*)SLJIT_MALLOC(common->recurse_bitset_size, allocator_data);;
  12386. if (common->recurse_bitset != NULL)
  12387. {
  12388. do
  12389. {
  12390. /* Might add new entries. */
  12391. compile_recurse(common);
  12392. if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
  12393. break;
  12394. flush_stubs(common);
  12395. common->currententry = common->currententry->next;
  12396. }
  12397. while (common->currententry != NULL);
  12398. SLJIT_FREE(common->recurse_bitset, allocator_data);
  12399. }
  12400. if (common->currententry != NULL)
  12401. {
  12402. /* The common->recurse_bitset has been freed. */
  12403. SLJIT_ASSERT(sljit_get_compiler_error(compiler) || common->recurse_bitset == NULL);
  12404. sljit_free_compiler(compiler);
  12405. SLJIT_FREE(common->optimized_cbracket, allocator_data);
  12406. SLJIT_FREE(common->private_data_ptrs, allocator_data);
  12407. PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data);
  12408. return PCRE2_ERROR_NOMEMORY;
  12409. }
  12410. }
  12411. common->local_quit_available = FALSE;
  12412. common->quit_label = quit_label;
  12413. /* Allocating stack, returns with PCRE_ERROR_JIT_STACKLIMIT if fails. */
  12414. /* This is a (really) rare case. */
  12415. set_jumps(common->stackalloc, LABEL());
  12416. /* RETURN_ADDR is not a saved register. */
  12417. sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  12418. SLJIT_ASSERT(TMP1 == SLJIT_R0 && STR_PTR == SLJIT_R1);
  12419. OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, STR_PTR, 0);
  12420. OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0);
  12421. OP2(SLJIT_SUB, SLJIT_R1, 0, STACK_LIMIT, 0, SLJIT_IMM, STACK_GROWTH_RATE);
  12422. OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, stack));
  12423. OP1(SLJIT_MOV, STACK_LIMIT, 0, TMP2, 0);
  12424. sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W), SLJIT_IMM, SLJIT_FUNC_ADDR(sljit_stack_resize));
  12425. jump = CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
  12426. OP1(SLJIT_MOV, TMP2, 0, STACK_LIMIT, 0);
  12427. OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_RETURN_REG, 0);
  12428. OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
  12429. OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
  12430. OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
  12431. /* Allocation failed. */
  12432. JUMPHERE(jump);
  12433. /* We break the return address cache here, but this is a really rare case. */
  12434. OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_JIT_STACKLIMIT);
  12435. JUMPTO(SLJIT_JUMP, common->quit_label);
  12436. /* Call limit reached. */
  12437. set_jumps(common->calllimit, LABEL());
  12438. OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_MATCHLIMIT);
  12439. JUMPTO(SLJIT_JUMP, common->quit_label);
  12440. if (common->revertframes != NULL)
  12441. {
  12442. set_jumps(common->revertframes, LABEL());
  12443. do_revertframes(common);
  12444. }
  12445. if (common->wordboundary != NULL)
  12446. {
  12447. set_jumps(common->wordboundary, LABEL());
  12448. check_wordboundary(common);
  12449. }
  12450. if (common->anynewline != NULL)
  12451. {
  12452. set_jumps(common->anynewline, LABEL());
  12453. check_anynewline(common);
  12454. }
  12455. if (common->hspace != NULL)
  12456. {
  12457. set_jumps(common->hspace, LABEL());
  12458. check_hspace(common);
  12459. }
  12460. if (common->vspace != NULL)
  12461. {
  12462. set_jumps(common->vspace, LABEL());
  12463. check_vspace(common);
  12464. }
  12465. if (common->casefulcmp != NULL)
  12466. {
  12467. set_jumps(common->casefulcmp, LABEL());
  12468. do_casefulcmp(common);
  12469. }
  12470. if (common->caselesscmp != NULL)
  12471. {
  12472. set_jumps(common->caselesscmp, LABEL());
  12473. do_caselesscmp(common);
  12474. }
  12475. if (common->reset_match != NULL)
  12476. {
  12477. set_jumps(common->reset_match, LABEL());
  12478. do_reset_match(common, (re->top_bracket + 1) * 2);
  12479. CMPTO(SLJIT_GREATER, STR_PTR, 0, TMP1, 0, continue_match_label);
  12480. OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0);
  12481. JUMPTO(SLJIT_JUMP, reset_match_label);
  12482. }
  12483. #ifdef SUPPORT_UNICODE
  12484. #if PCRE2_CODE_UNIT_WIDTH == 8
  12485. if (common->utfreadchar != NULL)
  12486. {
  12487. set_jumps(common->utfreadchar, LABEL());
  12488. do_utfreadchar(common);
  12489. }
  12490. if (common->utfreadtype8 != NULL)
  12491. {
  12492. set_jumps(common->utfreadtype8, LABEL());
  12493. do_utfreadtype8(common);
  12494. }
  12495. if (common->utfpeakcharback != NULL)
  12496. {
  12497. set_jumps(common->utfpeakcharback, LABEL());
  12498. do_utfpeakcharback(common);
  12499. }
  12500. #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
  12501. #if PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16
  12502. if (common->utfreadchar_invalid != NULL)
  12503. {
  12504. set_jumps(common->utfreadchar_invalid, LABEL());
  12505. do_utfreadchar_invalid(common);
  12506. }
  12507. if (common->utfreadnewline_invalid != NULL)
  12508. {
  12509. set_jumps(common->utfreadnewline_invalid, LABEL());
  12510. do_utfreadnewline_invalid(common);
  12511. }
  12512. if (common->utfmoveback_invalid)
  12513. {
  12514. set_jumps(common->utfmoveback_invalid, LABEL());
  12515. do_utfmoveback_invalid(common);
  12516. }
  12517. if (common->utfpeakcharback_invalid)
  12518. {
  12519. set_jumps(common->utfpeakcharback_invalid, LABEL());
  12520. do_utfpeakcharback_invalid(common);
  12521. }
  12522. #endif /* PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16 */
  12523. if (common->getucd != NULL)
  12524. {
  12525. set_jumps(common->getucd, LABEL());
  12526. do_getucd(common);
  12527. }
  12528. if (common->getucdtype != NULL)
  12529. {
  12530. set_jumps(common->getucdtype, LABEL());
  12531. do_getucdtype(common);
  12532. }
  12533. #endif /* SUPPORT_UNICODE */
  12534. SLJIT_FREE(common->optimized_cbracket, allocator_data);
  12535. SLJIT_FREE(common->private_data_ptrs, allocator_data);
  12536. executable_func = sljit_generate_code(compiler);
  12537. executable_size = sljit_get_generated_code_size(compiler);
  12538. sljit_free_compiler(compiler);
  12539. if (executable_func == NULL)
  12540. {
  12541. PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data);
  12542. return PCRE2_ERROR_NOMEMORY;
  12543. }
  12544. /* Reuse the function descriptor if possible. */
  12545. if (re->executable_jit != NULL)
  12546. functions = (executable_functions *)re->executable_jit;
  12547. else
  12548. {
  12549. functions = SLJIT_MALLOC(sizeof(executable_functions), allocator_data);
  12550. if (functions == NULL)
  12551. {
  12552. /* This case is highly unlikely since we just recently
  12553. freed a lot of memory. Not impossible though. */
  12554. sljit_free_code(executable_func, NULL);
  12555. PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data);
  12556. return PCRE2_ERROR_NOMEMORY;
  12557. }
  12558. memset(functions, 0, sizeof(executable_functions));
  12559. functions->top_bracket = re->top_bracket + 1;
  12560. functions->limit_match = re->limit_match;
  12561. re->executable_jit = functions;
  12562. }
  12563. /* Turn mode into an index. */
  12564. if (mode == PCRE2_JIT_COMPLETE)
  12565. mode = 0;
  12566. else
  12567. mode = (mode == PCRE2_JIT_PARTIAL_SOFT) ? 1 : 2;
  12568. SLJIT_ASSERT(mode < JIT_NUMBER_OF_COMPILE_MODES);
  12569. functions->executable_funcs[mode] = executable_func;
  12570. functions->read_only_data_heads[mode] = common->read_only_data_head;
  12571. functions->executable_sizes[mode] = executable_size;
  12572. return 0;
  12573. }
  12574. #endif
  12575. /*************************************************
  12576. * JIT compile a Regular Expression *
  12577. *************************************************/
  12578. /* This function used JIT to convert a previously-compiled pattern into machine
  12579. code.
  12580. Arguments:
  12581. code a compiled pattern
  12582. options JIT option bits
  12583. Returns: 0: success or (*NOJIT) was used
  12584. <0: an error code
  12585. */
  12586. #define PUBLIC_JIT_COMPILE_OPTIONS \
  12587. (PCRE2_JIT_COMPLETE|PCRE2_JIT_PARTIAL_SOFT|PCRE2_JIT_PARTIAL_HARD|PCRE2_JIT_INVALID_UTF)
  12588. PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
  12589. pcre2_jit_compile(pcre2_code *code, uint32_t options)
  12590. {
  12591. pcre2_real_code *re = (pcre2_real_code *)code;
  12592. #ifdef SUPPORT_JIT
  12593. executable_functions *functions;
  12594. static int executable_allocator_is_working = 0;
  12595. #endif
  12596. if (code == NULL)
  12597. return PCRE2_ERROR_NULL;
  12598. if ((options & ~PUBLIC_JIT_COMPILE_OPTIONS) != 0)
  12599. return PCRE2_ERROR_JIT_BADOPTION;
  12600. /* Support for invalid UTF was first introduced in JIT, with the option
  12601. PCRE2_JIT_INVALID_UTF. Later, support was added to the interpreter, and the
  12602. compile-time option PCRE2_MATCH_INVALID_UTF was created. This is now the
  12603. preferred feature, with the earlier option deprecated. However, for backward
  12604. compatibility, if the earlier option is set, it forces the new option so that
  12605. if JIT matching falls back to the interpreter, there is still support for
  12606. invalid UTF. However, if this function has already been successfully called
  12607. without PCRE2_JIT_INVALID_UTF and without PCRE2_MATCH_INVALID_UTF (meaning that
  12608. non-invalid-supporting JIT code was compiled), give an error.
  12609. If in the future support for PCRE2_JIT_INVALID_UTF is withdrawn, the following
  12610. actions are needed:
  12611. 1. Remove the definition from pcre2.h.in and from the list in
  12612. PUBLIC_JIT_COMPILE_OPTIONS above.
  12613. 2. Replace PCRE2_JIT_INVALID_UTF with a local flag in this module.
  12614. 3. Replace PCRE2_JIT_INVALID_UTF in pcre2_jit_test.c.
  12615. 4. Delete the following short block of code. The setting of "re" and
  12616. "functions" can be moved into the JIT-only block below, but if that is
  12617. done, (void)re and (void)functions will be needed in the non-JIT case, to
  12618. avoid compiler warnings.
  12619. */
  12620. #ifdef SUPPORT_JIT
  12621. functions = (executable_functions *)re->executable_jit;
  12622. #endif
  12623. if ((options & PCRE2_JIT_INVALID_UTF) != 0)
  12624. {
  12625. if ((re->overall_options & PCRE2_MATCH_INVALID_UTF) == 0)
  12626. {
  12627. #ifdef SUPPORT_JIT
  12628. if (functions != NULL) return PCRE2_ERROR_JIT_BADOPTION;
  12629. #endif
  12630. re->overall_options |= PCRE2_MATCH_INVALID_UTF;
  12631. }
  12632. }
  12633. /* The above tests are run with and without JIT support. This means that
  12634. PCRE2_JIT_INVALID_UTF propagates back into the regex options (ensuring
  12635. interpreter support) even in the absence of JIT. But now, if there is no JIT
  12636. support, give an error return. */
  12637. #ifndef SUPPORT_JIT
  12638. return PCRE2_ERROR_JIT_BADOPTION;
  12639. #else /* SUPPORT_JIT */
  12640. /* There is JIT support. Do the necessary. */
  12641. if ((re->flags & PCRE2_NOJIT) != 0) return 0;
  12642. if (executable_allocator_is_working == 0)
  12643. {
  12644. /* Checks whether the executable allocator is working. This check
  12645. might run multiple times in multi-threaded environments, but the
  12646. result should not be affected by it. */
  12647. void *ptr = SLJIT_MALLOC_EXEC(32, NULL);
  12648. executable_allocator_is_working = -1;
  12649. if (ptr != NULL)
  12650. {
  12651. SLJIT_FREE_EXEC(((sljit_u8*)(ptr)) + SLJIT_EXEC_OFFSET(ptr), NULL);
  12652. executable_allocator_is_working = 1;
  12653. }
  12654. }
  12655. if (executable_allocator_is_working < 0)
  12656. return PCRE2_ERROR_NOMEMORY;
  12657. if ((re->overall_options & PCRE2_MATCH_INVALID_UTF) != 0)
  12658. options |= PCRE2_JIT_INVALID_UTF;
  12659. if ((options & PCRE2_JIT_COMPLETE) != 0 && (functions == NULL
  12660. || functions->executable_funcs[0] == NULL)) {
  12661. uint32_t excluded_options = (PCRE2_JIT_PARTIAL_SOFT | PCRE2_JIT_PARTIAL_HARD);
  12662. int result = jit_compile(code, options & ~excluded_options);
  12663. if (result != 0)
  12664. return result;
  12665. }
  12666. if ((options & PCRE2_JIT_PARTIAL_SOFT) != 0 && (functions == NULL
  12667. || functions->executable_funcs[1] == NULL)) {
  12668. uint32_t excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_HARD);
  12669. int result = jit_compile(code, options & ~excluded_options);
  12670. if (result != 0)
  12671. return result;
  12672. }
  12673. if ((options & PCRE2_JIT_PARTIAL_HARD) != 0 && (functions == NULL
  12674. || functions->executable_funcs[2] == NULL)) {
  12675. uint32_t excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_SOFT);
  12676. int result = jit_compile(code, options & ~excluded_options);
  12677. if (result != 0)
  12678. return result;
  12679. }
  12680. return 0;
  12681. #endif /* SUPPORT_JIT */
  12682. }
  12683. /* JIT compiler uses an all-in-one approach. This improves security,
  12684. since the code generator functions are not exported. */
  12685. #define INCLUDED_FROM_PCRE2_JIT_COMPILE
  12686. #include "pcre2_jit_match.c"
  12687. #include "pcre2_jit_misc.c"
  12688. /* End of pcre2_jit_compile.c */