pocketpy.h 277 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211
  1. /*
  2. * Copyright (c) 2023 blueloveTH
  3. * Distributed Under The MIT License
  4. * https://github.com/blueloveTH/pocketpy
  5. */
  6. #ifndef POCKETPY_H
  7. #define POCKETPY_H
  8. // emhash8::HashMap for C++11/14/17
  9. // version 1.6.3
  10. //
  11. // Licensed under the MIT License <http://opensource.org/licenses/MIT>.
  12. // SPDX-License-Identifier: MIT
  13. // Copyright (c) 2019-2022 Huang Yuanbing & bailuzhou AT 163.com
  14. //
  15. // Permission is hereby granted, free of charge, to any person obtaining a copy
  16. // of this software and associated documentation files (the "Software"), to deal
  17. // in the Software without restriction, including without limitation the rights
  18. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  19. // copies of the Software, and to permit persons to whom the Software is
  20. // furnished to do so, subject to the following conditions:
  21. //
  22. // The above copyright notice and this permission notice shall be included in all
  23. // copies or substantial portions of the Software.
  24. //
  25. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  26. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  27. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  28. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  29. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  30. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  31. // SOFTWARE
  32. #include <cstring>
  33. #include <string>
  34. #include <cstdlib>
  35. #include <type_traits>
  36. #include <cassert>
  37. #include <utility>
  38. #include <cstdint>
  39. #include <functional>
  40. #include <iterator>
  41. #include <algorithm>
  42. #ifdef EMH_KEY
  43. #undef EMH_KEY
  44. #undef EMH_VAL
  45. #undef EMH_KV
  46. #undef EMH_BUCKET
  47. #undef EMH_NEW
  48. #undef EMH_EMPTY
  49. #undef EMH_PREVET
  50. #undef EMH_LIKELY
  51. #undef EMH_UNLIKELY
  52. #endif
  53. // likely/unlikely
  54. #if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__clang__)
  55. # define EMH_LIKELY(condition) __builtin_expect(condition, 1)
  56. # define EMH_UNLIKELY(condition) __builtin_expect(condition, 0)
  57. #else
  58. # define EMH_LIKELY(condition) (condition)
  59. # define EMH_UNLIKELY(condition) (condition)
  60. #endif
  61. #define EMH_KEY(p, n) p[n].first
  62. #define EMH_VAL(p, n) p[n].second
  63. #define EMH_KV(p, n) p[n]
  64. #define EMH_INDEX(i, n) i[n]
  65. #define EMH_BUCKET(i, n) i[n].bucket
  66. #define EMH_HSLOT(i, n) i[n].slot
  67. #define EMH_SLOT(i, n) (i[n].slot & _mask)
  68. #define EMH_PREVET(i, n) i[n].slot
  69. #define EMH_KEYMASK(key, mask) ((size_type)(key) & ~mask)
  70. #define EMH_EQHASH(n, key_hash) (EMH_KEYMASK(key_hash, _mask) == (_index[n].slot & ~_mask))
  71. #define EMH_NEW(key, val, bucket, key_hash) \
  72. new(_pairs + _num_filled) value_type(key, val); \
  73. _etail = bucket; \
  74. _index[bucket] = {bucket, _num_filled++ | EMH_KEYMASK(key_hash, _mask)}
  75. #define EMH_EMPTY(i, n) (0 > (int)i[n].bucket)
  76. namespace emhash8 {
  77. #ifndef EMH_DEFAULT_LOAD_FACTOR
  78. constexpr static float EMH_DEFAULT_LOAD_FACTOR = 0.80f;
  79. constexpr static float EMH_MIN_LOAD_FACTOR = 0.25f; //< 0.5
  80. #endif
  81. #if EMH_CACHE_LINE_SIZE < 32
  82. constexpr static uint32_t EMH_CACHE_LINE_SIZE = 64;
  83. #endif
  84. template <typename KeyT, typename ValueT, typename HashT = std::hash<KeyT>, typename EqT = std::equal_to<KeyT>>
  85. class HashMap
  86. {
  87. public:
  88. using htype = HashMap<KeyT, ValueT, HashT, EqT>;
  89. using value_type = std::pair<KeyT, ValueT>;
  90. using key_type = KeyT;
  91. using mapped_type = ValueT;
  92. #ifdef EMH_SMALL_TYPE
  93. using size_type = uint16_t;
  94. #elif EMH_SIZE_TYPE == 0
  95. using size_type = uint32_t;
  96. #else
  97. using size_type = size_t;
  98. #endif
  99. using hasher = HashT;
  100. using key_equal = EqT;
  101. constexpr static size_type INACTIVE = 0-1u;
  102. //constexpr uint32_t END = 0-0x1u;
  103. constexpr static size_type EAD = 2;
  104. struct Index
  105. {
  106. size_type bucket;
  107. size_type slot;
  108. };
  109. class const_iterator;
  110. class iterator
  111. {
  112. public:
  113. using iterator_category = std::bidirectional_iterator_tag;
  114. using difference_type = std::ptrdiff_t;
  115. using value_type = typename htype::value_type;
  116. using pointer = value_type*;
  117. using const_pointer = const value_type* ;
  118. using reference = value_type&;
  119. using const_reference = const value_type&;
  120. iterator() : kv_(nullptr) {}
  121. iterator(const_iterator& cit) {
  122. kv_ = cit.kv_;
  123. }
  124. iterator(const htype* hash_map, size_type bucket) {
  125. kv_ = hash_map->_pairs + (int)bucket;
  126. }
  127. iterator& operator++()
  128. {
  129. kv_ ++;
  130. return *this;
  131. }
  132. iterator operator++(int)
  133. {
  134. auto cur = *this; kv_ ++;
  135. return cur;
  136. }
  137. iterator& operator--()
  138. {
  139. kv_ --;
  140. return *this;
  141. }
  142. iterator operator--(int)
  143. {
  144. auto cur = *this; kv_ --;
  145. return cur;
  146. }
  147. reference operator*() const { return *kv_; }
  148. pointer operator->() const { return kv_; }
  149. bool operator == (const iterator& rhs) const { return kv_ == rhs.kv_; }
  150. bool operator != (const iterator& rhs) const { return kv_ != rhs.kv_; }
  151. bool operator == (const const_iterator& rhs) const { return kv_ == rhs.kv_; }
  152. bool operator != (const const_iterator& rhs) const { return kv_ != rhs.kv_; }
  153. public:
  154. value_type* kv_;
  155. };
  156. class const_iterator
  157. {
  158. public:
  159. using iterator_category = std::bidirectional_iterator_tag;
  160. using value_type = typename htype::value_type;
  161. using difference_type = std::ptrdiff_t;
  162. using pointer = value_type*;
  163. using const_pointer = const value_type*;
  164. using reference = value_type&;
  165. using const_reference = const value_type&;
  166. const_iterator(const iterator& it) {
  167. kv_ = it.kv_;
  168. }
  169. const_iterator (const htype* hash_map, size_type bucket) {
  170. kv_ = hash_map->_pairs + (int)bucket;
  171. }
  172. const_iterator& operator++()
  173. {
  174. kv_ ++;
  175. return *this;
  176. }
  177. const_iterator operator++(int)
  178. {
  179. auto cur = *this; kv_ ++;
  180. return cur;
  181. }
  182. const_iterator& operator--()
  183. {
  184. kv_ --;
  185. return *this;
  186. }
  187. const_iterator operator--(int)
  188. {
  189. auto cur = *this; kv_ --;
  190. return cur;
  191. }
  192. const_reference operator*() const { return *kv_; }
  193. const_pointer operator->() const { return kv_; }
  194. bool operator == (const iterator& rhs) const { return kv_ == rhs.kv_; }
  195. bool operator != (const iterator& rhs) const { return kv_ != rhs.kv_; }
  196. bool operator == (const const_iterator& rhs) const { return kv_ == rhs.kv_; }
  197. bool operator != (const const_iterator& rhs) const { return kv_ != rhs.kv_; }
  198. public:
  199. const value_type* kv_;
  200. };
  201. void init(size_type bucket, float mlf = EMH_DEFAULT_LOAD_FACTOR)
  202. {
  203. _pairs = nullptr;
  204. _index = nullptr;
  205. _mask = _num_buckets = 0;
  206. _num_filled = 0;
  207. max_load_factor(mlf);
  208. rehash(bucket);
  209. }
  210. HashMap(size_type bucket = 2, float mlf = EMH_DEFAULT_LOAD_FACTOR)
  211. {
  212. init(bucket, mlf);
  213. }
  214. HashMap(const HashMap& rhs)
  215. {
  216. if (rhs.load_factor() > EMH_MIN_LOAD_FACTOR) {
  217. _pairs = alloc_bucket((size_type)(rhs._num_buckets * rhs.max_load_factor()) + 4);
  218. _index = alloc_index(rhs._num_buckets);
  219. clone(rhs);
  220. } else {
  221. init(rhs._num_filled + 2, EMH_DEFAULT_LOAD_FACTOR);
  222. for (auto it = rhs.begin(); it != rhs.end(); ++it)
  223. insert_unique(it->first, it->second);
  224. }
  225. }
  226. HashMap(HashMap&& rhs) noexcept
  227. {
  228. init(0);
  229. *this = std::move(rhs);
  230. }
  231. HashMap(std::initializer_list<value_type> ilist)
  232. {
  233. init((size_type)ilist.size());
  234. for (auto it = ilist.begin(); it != ilist.end(); ++it)
  235. do_insert(*it);
  236. }
  237. template<class InputIt>
  238. HashMap(InputIt first, InputIt last, size_type bucket_count=4)
  239. {
  240. init(std::distance(first, last) + bucket_count);
  241. for (; first != last; ++first)
  242. emplace(*first);
  243. }
  244. HashMap& operator=(const HashMap& rhs)
  245. {
  246. if (this == &rhs)
  247. return *this;
  248. if (rhs.load_factor() < EMH_MIN_LOAD_FACTOR) {
  249. clear(); free(_pairs); _pairs = nullptr;
  250. rehash(rhs._num_filled + 2);
  251. for (auto it = rhs.begin(); it != rhs.end(); ++it)
  252. insert_unique(it->first, it->second);
  253. return *this;
  254. }
  255. clearkv();
  256. if (_num_buckets != rhs._num_buckets) {
  257. free(_pairs); free(_index);
  258. _index = alloc_index(rhs._num_buckets);
  259. _pairs = alloc_bucket((size_type)(rhs._num_buckets * rhs.max_load_factor()) + 4);
  260. }
  261. clone(rhs);
  262. return *this;
  263. }
  264. HashMap& operator=(HashMap&& rhs) noexcept
  265. {
  266. if (this != &rhs) {
  267. swap(rhs);
  268. rhs.clear();
  269. }
  270. return *this;
  271. }
  272. template<typename Con>
  273. bool operator == (const Con& rhs) const
  274. {
  275. if (size() != rhs.size())
  276. return false;
  277. for (auto it = begin(), last = end(); it != last; ++it) {
  278. auto oi = rhs.find(it->first);
  279. if (oi == rhs.end() || it->second != oi->second)
  280. return false;
  281. }
  282. return true;
  283. }
  284. template<typename Con>
  285. bool operator != (const Con& rhs) const { return !(*this == rhs); }
  286. ~HashMap() noexcept
  287. {
  288. clearkv();
  289. free(_pairs);
  290. free(_index);
  291. }
  292. void clone(const HashMap& rhs)
  293. {
  294. _hasher = rhs._hasher;
  295. // _eq = rhs._eq;
  296. _num_buckets = rhs._num_buckets;
  297. _num_filled = rhs._num_filled;
  298. _mlf = rhs._mlf;
  299. _last = rhs._last;
  300. _mask = rhs._mask;
  301. #if EMH_HIGH_LOAD
  302. _ehead = rhs._ehead;
  303. #endif
  304. _etail = rhs._etail;
  305. auto opairs = rhs._pairs;
  306. memcpy((char*)_index, (char*)rhs._index, (_num_buckets + EAD) * sizeof(Index));
  307. if (is_copy_trivially()) {
  308. if (opairs)
  309. memcpy((char*)_pairs, (char*)opairs, _num_filled * sizeof(value_type));
  310. } else {
  311. for (size_type slot = 0; slot < _num_filled; slot++)
  312. new(_pairs + slot) value_type(opairs[slot]);
  313. }
  314. }
  315. void swap(HashMap& rhs)
  316. {
  317. // std::swap(_eq, rhs._eq);
  318. std::swap(_hasher, rhs._hasher);
  319. std::swap(_pairs, rhs._pairs);
  320. std::swap(_index, rhs._index);
  321. std::swap(_num_buckets, rhs._num_buckets);
  322. std::swap(_num_filled, rhs._num_filled);
  323. std::swap(_mask, rhs._mask);
  324. std::swap(_mlf, rhs._mlf);
  325. std::swap(_last, rhs._last);
  326. #if EMH_HIGH_LOAD
  327. std::swap(_ehead, rhs._ehead);
  328. #endif
  329. std::swap(_etail, rhs._etail);
  330. }
  331. // -------------------------------------------------------------
  332. inline iterator first() const { return {this, 0}; }
  333. inline iterator last() const { return {this, _num_filled - 1}; }
  334. inline iterator begin() { return first(); }
  335. inline const_iterator cbegin() const { return first(); }
  336. inline const_iterator begin() const { return first(); }
  337. inline iterator end() { return {this, _num_filled}; }
  338. inline const_iterator cend() const { return {this, _num_filled}; }
  339. inline const_iterator end() const { return cend(); }
  340. inline const value_type* values() const { return _pairs; }
  341. inline const Index* index() const { return _index; }
  342. inline size_type size() const { return _num_filled; }
  343. inline bool empty() const { return _num_filled == 0; }
  344. inline size_type bucket_count() const { return _num_buckets; }
  345. /// Returns average number of elements per bucket.
  346. inline float load_factor() const { return static_cast<float>(_num_filled) / (_mask + 1); }
  347. inline HashT& hash_function() const { return _hasher; }
  348. inline EqT& key_eq() const { return _eq; }
  349. void max_load_factor(float mlf)
  350. {
  351. if (mlf < 0.991 && mlf > EMH_MIN_LOAD_FACTOR) {
  352. _mlf = (uint32_t)((1 << 27) / mlf);
  353. if (_num_buckets > 0) rehash(_num_buckets);
  354. }
  355. }
  356. inline constexpr float max_load_factor() const { return (1 << 27) / (float)_mlf; }
  357. inline constexpr size_type max_size() const { return (1ull << (sizeof(size_type) * 8 - 1)); }
  358. inline constexpr size_type max_bucket_count() const { return max_size(); }
  359. #if EMH_STATIS
  360. //Returns the bucket number where the element with key k is located.
  361. size_type bucket(const KeyT& key) const
  362. {
  363. const auto bucket = hash_bucket(key);
  364. const auto next_bucket = EMH_BUCKET(_index, bucket);
  365. if ((int)next_bucket < 0)
  366. return 0;
  367. else if (bucket == next_bucket)
  368. return bucket + 1;
  369. return hash_main(bucket) + 1;
  370. }
  371. //Returns the number of elements in bucket n.
  372. size_type bucket_size(const size_type bucket) const
  373. {
  374. auto next_bucket = EMH_BUCKET(_index, bucket);
  375. if ((int)next_bucket < 0)
  376. return 0;
  377. next_bucket = hash_main(bucket);
  378. size_type ibucket_size = 1;
  379. //iterator each item in current main bucket
  380. while (true) {
  381. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  382. if (nbucket == next_bucket) {
  383. break;
  384. }
  385. ibucket_size ++;
  386. next_bucket = nbucket;
  387. }
  388. return ibucket_size;
  389. }
  390. size_type get_main_bucket(const size_type bucket) const
  391. {
  392. auto next_bucket = EMH_BUCKET(_index, bucket);
  393. if ((int)next_bucket < 0)
  394. return INACTIVE;
  395. return hash_main(bucket);
  396. }
  397. size_type get_diss(size_type bucket, size_type next_bucket, const size_type slots) const
  398. {
  399. auto pbucket = reinterpret_cast<uint64_t>(&_pairs[bucket]);
  400. auto pnext = reinterpret_cast<uint64_t>(&_pairs[next_bucket]);
  401. if (pbucket / EMH_CACHE_LINE_SIZE == pnext / EMH_CACHE_LINE_SIZE)
  402. return 0;
  403. size_type diff = pbucket > pnext ? (pbucket - pnext) : (pnext - pbucket);
  404. if (diff / EMH_CACHE_LINE_SIZE < slots - 1)
  405. return diff / EMH_CACHE_LINE_SIZE + 1;
  406. return slots - 1;
  407. }
  408. int get_bucket_info(const size_type bucket, size_type steps[], const size_type slots) const
  409. {
  410. auto next_bucket = EMH_BUCKET(_index, bucket);
  411. if ((int)next_bucket < 0)
  412. return -1;
  413. const auto main_bucket = hash_main(bucket);
  414. if (next_bucket == main_bucket)
  415. return 1;
  416. else if (main_bucket != bucket)
  417. return 0;
  418. steps[get_diss(bucket, next_bucket, slots)] ++;
  419. size_type ibucket_size = 2;
  420. //find a empty and linked it to tail
  421. while (true) {
  422. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  423. if (nbucket == next_bucket)
  424. break;
  425. steps[get_diss(nbucket, next_bucket, slots)] ++;
  426. ibucket_size ++;
  427. next_bucket = nbucket;
  428. }
  429. return (int)ibucket_size;
  430. }
  431. void dump_statics() const
  432. {
  433. const size_type slots = 128;
  434. size_type buckets[slots + 1] = {0};
  435. size_type steps[slots + 1] = {0};
  436. for (size_type bucket = 0; bucket < _num_buckets; ++bucket) {
  437. auto bsize = get_bucket_info(bucket, steps, slots);
  438. if (bsize > 0)
  439. buckets[bsize] ++;
  440. }
  441. size_type sumb = 0, collision = 0, sumc = 0, finds = 0, sumn = 0;
  442. puts("============== buckets size ration =========");
  443. for (size_type i = 0; i < sizeof(buckets) / sizeof(buckets[0]); i++) {
  444. const auto bucketsi = buckets[i];
  445. if (bucketsi == 0)
  446. continue;
  447. sumb += bucketsi;
  448. sumn += bucketsi * i;
  449. collision += bucketsi * (i - 1);
  450. finds += bucketsi * i * (i + 1) / 2;
  451. printf(" %2u %8u %2.2lf| %.2lf\n", i, bucketsi, bucketsi * 100.0 * i / _num_filled, sumn * 100.0 / _num_filled);
  452. }
  453. puts("========== collision miss ration ===========");
  454. for (size_type i = 0; i < sizeof(steps) / sizeof(steps[0]); i++) {
  455. sumc += steps[i];
  456. if (steps[i] <= 2)
  457. continue;
  458. printf(" %2u %8u %.2lf %.2lf\n", i, steps[i], steps[i] * 100.0 / collision, sumc * 100.0 / collision);
  459. }
  460. if (sumb == 0) return;
  461. printf(" _num_filled/bucket_size/packed collision/cache_miss/hit_find = %u/%.2lf/%zd/ %.2lf%%/%.2lf%%/%.2lf\n",
  462. _num_filled, _num_filled * 1.0 / sumb, sizeof(value_type), (collision * 100.0 / _num_filled), (collision - steps[0]) * 100.0 / _num_filled, finds * 1.0 / _num_filled);
  463. assert(sumn == _num_filled);
  464. assert(sumc == collision);
  465. puts("============== buckets size end =============");
  466. }
  467. #endif
  468. // ------------------------------------------------------------
  469. template<typename K=KeyT>
  470. inline iterator find(const K& key) noexcept
  471. {
  472. return {this, find_filled_slot(key)};
  473. }
  474. template<typename K=KeyT>
  475. inline const_iterator find(const K& key) const noexcept
  476. {
  477. return {this, find_filled_slot(key)};
  478. }
  479. template<typename K=KeyT>
  480. ValueT& at(const K& key)
  481. {
  482. const auto slot = find_filled_slot(key);
  483. //throw
  484. return EMH_VAL(_pairs, slot);
  485. }
  486. template<typename K=KeyT>
  487. const ValueT& at(const K& key) const
  488. {
  489. const auto slot = find_filled_slot(key);
  490. //throw
  491. return EMH_VAL(_pairs, slot);
  492. }
  493. template<typename K=KeyT>
  494. inline bool contains(const K& key) const noexcept
  495. {
  496. return find_filled_slot(key) != _num_filled;
  497. }
  498. template<typename K=KeyT>
  499. inline size_type count(const K& key) const noexcept
  500. {
  501. return find_filled_slot(key) == _num_filled ? 0 : 1;
  502. //return find_sorted_bucket(key) == END ? 0 : 1;
  503. //return find_hash_bucket(key) == END ? 0 : 1;
  504. }
  505. template<typename K=KeyT>
  506. std::pair<iterator, iterator> equal_range(const K& key)
  507. {
  508. const auto found = find(key);
  509. if (found.second == _num_filled)
  510. return { found, found };
  511. else
  512. return { found, std::next(found) };
  513. }
  514. void merge(HashMap& rhs)
  515. {
  516. if (empty()) {
  517. *this = std::move(rhs);
  518. return;
  519. }
  520. for (auto rit = rhs.begin(); rit != rhs.end(); ) {
  521. auto fit = find(rit->first);
  522. if (fit == end()) {
  523. insert_unique(rit->first, std::move(rit->second));
  524. rit = rhs.erase(rit);
  525. } else {
  526. ++rit;
  527. }
  528. }
  529. }
  530. /// Returns the matching ValueT or nullptr if k isn't found.
  531. bool try_get(const KeyT& key, ValueT& val) const noexcept
  532. {
  533. const auto slot = find_filled_slot(key);
  534. const auto found = slot != _num_filled;
  535. if (found) {
  536. val = EMH_VAL(_pairs, slot);
  537. }
  538. return found;
  539. }
  540. /// Returns the matching ValueT or nullptr if k isn't found.
  541. ValueT* try_get(const KeyT& key) noexcept
  542. {
  543. const auto slot = find_filled_slot(key);
  544. return slot != _num_filled ? &EMH_VAL(_pairs, slot) : nullptr;
  545. }
  546. /// Const version of the above
  547. ValueT* try_get(const KeyT& key) const noexcept
  548. {
  549. const auto slot = find_filled_slot(key);
  550. return slot != _num_filled ? &EMH_VAL(_pairs, slot) : nullptr;
  551. }
  552. /// set value if key exist
  553. bool try_set(const KeyT& key, const ValueT& val) noexcept
  554. {
  555. const auto slot = find_filled_slot(key);
  556. if (slot == _num_filled)
  557. return false;
  558. EMH_VAL(_pairs, slot) = val;
  559. return true;
  560. }
  561. /// set value if key exist
  562. bool try_set(const KeyT& key, ValueT&& val) noexcept
  563. {
  564. const auto slot = find_filled_slot(key);
  565. if (slot == _num_filled)
  566. return false;
  567. EMH_VAL(_pairs, slot) = std::move(val);
  568. return true;
  569. }
  570. /// Convenience function.
  571. ValueT get_or_return_default(const KeyT& key) const noexcept
  572. {
  573. const auto slot = find_filled_slot(key);
  574. return slot == _num_filled ? ValueT() : EMH_VAL(_pairs, slot);
  575. }
  576. // -----------------------------------------------------
  577. std::pair<iterator, bool> do_insert(const value_type& value) noexcept
  578. {
  579. const auto key_hash = hash_key(value.first);
  580. const auto bucket = find_or_allocate(value.first, key_hash);
  581. const auto bempty = EMH_EMPTY(_index, bucket);
  582. if (bempty) {
  583. EMH_NEW(value.first, value.second, bucket, key_hash);
  584. }
  585. const auto slot = EMH_SLOT(_index, bucket);
  586. return { {this, slot}, bempty };
  587. }
  588. std::pair<iterator, bool> do_insert(value_type&& value) noexcept
  589. {
  590. const auto key_hash = hash_key(value.first);
  591. const auto bucket = find_or_allocate(value.first, key_hash);
  592. const auto bempty = EMH_EMPTY(_index, bucket);
  593. if (bempty) {
  594. EMH_NEW(std::move(value.first), std::move(value.second), bucket, key_hash);
  595. }
  596. const auto slot = EMH_SLOT(_index, bucket);
  597. return { {this, slot}, bempty };
  598. }
  599. template<typename K, typename V>
  600. std::pair<iterator, bool> do_insert(K&& key, V&& val) noexcept
  601. {
  602. const auto key_hash = hash_key(key);
  603. const auto bucket = find_or_allocate(key, key_hash);
  604. const auto bempty = EMH_EMPTY(_index, bucket);
  605. if (bempty) {
  606. EMH_NEW(std::forward<K>(key), std::forward<V>(val), bucket, key_hash);
  607. }
  608. const auto slot = EMH_SLOT(_index, bucket);
  609. return { {this, slot}, bempty };
  610. }
  611. template<typename K, typename V>
  612. std::pair<iterator, bool> do_assign(K&& key, V&& val) noexcept
  613. {
  614. check_expand_need();
  615. const auto key_hash = hash_key(key);
  616. const auto bucket = find_or_allocate(key, key_hash);
  617. const auto bempty = EMH_EMPTY(_index, bucket);
  618. if (bempty) {
  619. EMH_NEW(std::forward<K>(key), std::forward<V>(val), bucket, key_hash);
  620. } else {
  621. EMH_VAL(_pairs, EMH_SLOT(_index, bucket)) = std::move(val);
  622. }
  623. const auto slot = EMH_SLOT(_index, bucket);
  624. return { {this, slot}, bempty };
  625. }
  626. std::pair<iterator, bool> insert(const value_type& p)
  627. {
  628. check_expand_need();
  629. return do_insert(p);
  630. }
  631. std::pair<iterator, bool> insert(value_type && p)
  632. {
  633. check_expand_need();
  634. return do_insert(std::move(p));
  635. }
  636. void insert(std::initializer_list<value_type> ilist)
  637. {
  638. reserve(ilist.size() + _num_filled, false);
  639. for (auto it = ilist.begin(); it != ilist.end(); ++it)
  640. do_insert(*it);
  641. }
  642. template <typename Iter>
  643. void insert(Iter first, Iter last)
  644. {
  645. reserve(std::distance(first, last) + _num_filled, false);
  646. for (; first != last; ++first)
  647. do_insert(first->first, first->second);
  648. }
  649. #if 0
  650. template <typename Iter>
  651. void insert_unique(Iter begin, Iter end)
  652. {
  653. reserve(std::distance(begin, end) + _num_filled, false);
  654. for (; begin != end; ++begin) {
  655. insert_unique(*begin);
  656. }
  657. }
  658. #endif
  659. template<typename K, typename V>
  660. size_type insert_unique(K&& key, V&& val)
  661. {
  662. check_expand_need();
  663. const auto key_hash = hash_key(key);
  664. auto bucket = find_unique_bucket(key_hash);
  665. EMH_NEW(std::forward<K>(key), std::forward<V>(val), bucket, key_hash);
  666. return bucket;
  667. }
  668. size_type insert_unique(value_type&& value)
  669. {
  670. return insert_unique(std::move(value.first), std::move(value.second));
  671. }
  672. inline size_type insert_unique(const value_type& value)
  673. {
  674. return insert_unique(value.first, value.second);
  675. }
  676. template <class... Args>
  677. inline std::pair<iterator, bool> emplace(Args&&... args) noexcept
  678. {
  679. check_expand_need();
  680. return do_insert(std::forward<Args>(args)...);
  681. }
  682. //no any optimize for position
  683. template <class... Args>
  684. iterator emplace_hint(const_iterator hint, Args&&... args)
  685. {
  686. (void)hint;
  687. check_expand_need();
  688. return do_insert(std::forward<Args>(args)...).first;
  689. }
  690. template<class... Args>
  691. std::pair<iterator, bool> try_emplace(const KeyT& k, Args&&... args)
  692. {
  693. check_expand_need();
  694. return do_insert(k, std::forward<Args>(args)...);
  695. }
  696. template<class... Args>
  697. std::pair<iterator, bool> try_emplace(KeyT&& k, Args&&... args)
  698. {
  699. check_expand_need();
  700. return do_insert(std::move(k), std::forward<Args>(args)...);
  701. }
  702. template <class... Args>
  703. inline size_type emplace_unique(Args&&... args)
  704. {
  705. return insert_unique(std::forward<Args>(args)...);
  706. }
  707. std::pair<iterator, bool> insert_or_assign(const KeyT& key, ValueT&& val) { return do_assign(key, std::forward<ValueT>(val)); }
  708. std::pair<iterator, bool> insert_or_assign(KeyT&& key, ValueT&& val) { return do_assign(std::move(key), std::forward<ValueT>(val)); }
  709. /// Return the old value or ValueT() if it didn't exist.
  710. ValueT set_get(const KeyT& key, const ValueT& val)
  711. {
  712. check_expand_need();
  713. const auto key_hash = hash_key(key);
  714. const auto bucket = find_or_allocate(key, key_hash);
  715. if (EMH_EMPTY(_index, bucket)) {
  716. EMH_NEW(key, val, bucket, key_hash);
  717. return ValueT();
  718. } else {
  719. const auto slot = EMH_SLOT(_index, bucket);
  720. ValueT old_value(val);
  721. std::swap(EMH_VAL(_pairs, slot), old_value);
  722. return old_value;
  723. }
  724. }
  725. /// Like std::map<KeyT, ValueT>::operator[].
  726. ValueT& operator[](const KeyT& key) noexcept
  727. {
  728. check_expand_need();
  729. const auto key_hash = hash_key(key);
  730. const auto bucket = find_or_allocate(key, key_hash);
  731. if (EMH_EMPTY(_index, bucket)) {
  732. /* Check if inserting a value rather than overwriting an old entry */
  733. EMH_NEW(key, std::move(ValueT()), bucket, key_hash);
  734. }
  735. const auto slot = EMH_SLOT(_index, bucket);
  736. return EMH_VAL(_pairs, slot);
  737. }
  738. ValueT& operator[](KeyT&& key) noexcept
  739. {
  740. check_expand_need();
  741. const auto key_hash = hash_key(key);
  742. const auto bucket = find_or_allocate(key, key_hash);
  743. if (EMH_EMPTY(_index, bucket)) {
  744. EMH_NEW(std::move(key), std::move(ValueT()), bucket, key_hash);
  745. }
  746. const auto slot = EMH_SLOT(_index, bucket);
  747. return EMH_VAL(_pairs, slot);
  748. }
  749. /// Erase an element from the hash table.
  750. /// return 0 if element was not found
  751. size_type erase(const KeyT& key) noexcept
  752. {
  753. const auto key_hash = hash_key(key);
  754. const auto sbucket = find_filled_bucket(key, key_hash);
  755. if (sbucket == INACTIVE)
  756. return 0;
  757. const auto main_bucket = key_hash & _mask;
  758. erase_slot(sbucket, (size_type)main_bucket);
  759. return 1;
  760. }
  761. //iterator erase(const_iterator begin_it, const_iterator end_it)
  762. iterator erase(const const_iterator& cit) noexcept
  763. {
  764. const auto slot = (size_type)(cit.kv_ - _pairs);
  765. size_type main_bucket;
  766. const auto sbucket = find_slot_bucket(slot, main_bucket); //TODO
  767. erase_slot(sbucket, main_bucket);
  768. return {this, slot};
  769. }
  770. //only last >= first
  771. iterator erase(const_iterator first, const_iterator last) noexcept
  772. {
  773. auto esize = long(last.kv_ - first.kv_);
  774. auto tsize = long((_pairs + _num_filled) - last.kv_); //last to tail size
  775. auto next = first;
  776. while (tsize -- > 0) {
  777. if (esize-- <= 0)
  778. break;
  779. next = ++erase(next);
  780. }
  781. //fast erase from last
  782. next = this->last();
  783. while (esize -- > 0)
  784. next = --erase(next);
  785. return {this, size_type(next.kv_ - _pairs)};
  786. }
  787. template<typename Pred>
  788. size_type erase_if(Pred pred)
  789. {
  790. auto old_size = size();
  791. for (auto it = begin(); it != end();) {
  792. if (pred(*it))
  793. it = erase(it);
  794. else
  795. ++it;
  796. }
  797. return old_size - size();
  798. }
  799. static constexpr bool is_triviall_destructable()
  800. {
  801. #if __cplusplus >= 201402L || _MSC_VER > 1600
  802. return !(std::is_trivially_destructible<KeyT>::value && std::is_trivially_destructible<ValueT>::value);
  803. #else
  804. return !(std::is_pod<KeyT>::value && std::is_pod<ValueT>::value);
  805. #endif
  806. }
  807. static constexpr bool is_copy_trivially()
  808. {
  809. #if __cplusplus >= 201103L || _MSC_VER > 1600
  810. return (std::is_trivially_copyable<KeyT>::value && std::is_trivially_copyable<ValueT>::value);
  811. #else
  812. return (std::is_pod<KeyT>::value && std::is_pod<ValueT>::value);
  813. #endif
  814. }
  815. void clearkv()
  816. {
  817. if (is_triviall_destructable()) {
  818. while (_num_filled --)
  819. _pairs[_num_filled].~value_type();
  820. }
  821. }
  822. /// Remove all elements, keeping full capacity.
  823. void clear() noexcept
  824. {
  825. clearkv();
  826. if (_num_filled > 0)
  827. memset((char*)_index, INACTIVE, sizeof(_index[0]) * _num_buckets);
  828. _last = _num_filled = 0;
  829. _etail = INACTIVE;
  830. #if EMH_HIGH_LOAD
  831. _ehead = 0;
  832. #endif
  833. }
  834. void shrink_to_fit(const float min_factor = EMH_DEFAULT_LOAD_FACTOR / 4)
  835. {
  836. if (load_factor() < min_factor && bucket_count() > 10) //safe guard
  837. rehash(_num_filled + 1);
  838. }
  839. #if EMH_HIGH_LOAD
  840. void set_empty()
  841. {
  842. auto prev = 0;
  843. for (int32_t bucket = 1; bucket < _num_buckets; ++bucket) {
  844. if (EMH_EMPTY(_index, bucket)) {
  845. if (prev != 0) {
  846. EMH_PREVET(_index, bucket) = prev;
  847. EMH_BUCKET(_index, prev) = -bucket;
  848. }
  849. else
  850. _ehead = bucket;
  851. prev = bucket;
  852. }
  853. }
  854. EMH_PREVET(_index, _ehead) = prev;
  855. EMH_BUCKET(_index, prev) = 0-_ehead;
  856. _ehead = 0-EMH_BUCKET(_index, _ehead);
  857. }
  858. void clear_empty()
  859. {
  860. auto prev = EMH_PREVET(_index, _ehead);
  861. while (prev != _ehead) {
  862. EMH_BUCKET(_index, prev) = INACTIVE;
  863. prev = EMH_PREVET(_index, prev);
  864. }
  865. EMH_BUCKET(_index, _ehead) = INACTIVE;
  866. _ehead = 0;
  867. }
  868. //prev-ehead->next
  869. size_type pop_empty(const size_type bucket)
  870. {
  871. const auto prev_bucket = EMH_PREVET(_index, bucket);
  872. const int next_bucket = 0-EMH_BUCKET(_index, bucket);
  873. EMH_PREVET(_index, next_bucket) = prev_bucket;
  874. EMH_BUCKET(_index, prev_bucket) = -next_bucket;
  875. _ehead = next_bucket;
  876. return bucket;
  877. }
  878. //ehead->bucket->next
  879. void push_empty(const int32_t bucket)
  880. {
  881. const int next_bucket = 0-EMH_BUCKET(_index, _ehead);
  882. assert(next_bucket > 0);
  883. EMH_PREVET(_index, bucket) = _ehead;
  884. EMH_BUCKET(_index, bucket) = -next_bucket;
  885. EMH_PREVET(_index, next_bucket) = bucket;
  886. EMH_BUCKET(_index, _ehead) = -bucket;
  887. // _ehead = bucket;
  888. }
  889. #endif
  890. /// Make room for this many elements
  891. bool reserve(uint64_t num_elems, bool force)
  892. {
  893. (void)force;
  894. #if EMH_HIGH_LOAD == 0
  895. const auto required_buckets = num_elems * _mlf >> 27;
  896. if (EMH_LIKELY(required_buckets < _mask)) // && !force
  897. return false;
  898. #elif EMH_HIGH_LOAD
  899. const auto required_buckets = num_elems + num_elems * 1 / 9;
  900. if (EMH_LIKELY(required_buckets < _mask))
  901. return false;
  902. else if (_num_buckets < 16 && _num_filled < _num_buckets)
  903. return false;
  904. else if (_num_buckets > EMH_HIGH_LOAD) {
  905. if (_ehead == 0) {
  906. set_empty();
  907. return false;
  908. } else if (/*_num_filled + 100 < _num_buckets && */EMH_BUCKET(_index, _ehead) != 0-_ehead) {
  909. return false;
  910. }
  911. }
  912. #endif
  913. #if EMH_STATIS
  914. if (_num_filled > EMH_STATIS) dump_statics();
  915. #endif
  916. //assert(required_buckets < max_size());
  917. rehash(required_buckets + 2);
  918. return true;
  919. }
  920. static value_type* alloc_bucket(size_type num_buckets)
  921. {
  922. auto new_pairs = (char*)malloc((uint64_t)num_buckets * sizeof(value_type));
  923. return (value_type *)(new_pairs);
  924. }
  925. static Index* alloc_index(size_type num_buckets)
  926. {
  927. auto new_index = (char*)malloc((uint64_t)(EAD + num_buckets) * sizeof(Index));
  928. return (Index *)(new_index);
  929. }
  930. bool reserve(size_type required_buckets) noexcept
  931. {
  932. if (_num_filled != required_buckets)
  933. return reserve(required_buckets, true);
  934. _last = 0;
  935. #if EMH_HIGH_LOAD
  936. _ehead = 0;
  937. #endif
  938. #if EMH_SORT
  939. std::sort(_pairs, _pairs + _num_filled, [this](const value_type & l, const value_type & r) {
  940. const auto hashl = (size_type)hash_key(l.first) & _mask, hashr = (size_type)hash_key(r.first) & _mask;
  941. return hashl < hashr;
  942. //return l.first < r.first;
  943. });
  944. #endif
  945. memset((char*)_index, INACTIVE, sizeof(_index[0]) * _num_buckets);
  946. for (size_type slot = 0; slot < _num_filled; slot++) {
  947. const auto& key = EMH_KEY(_pairs, slot);
  948. const auto key_hash = hash_key(key);
  949. const auto bucket = size_type(key_hash & _mask);
  950. auto& next_bucket = EMH_BUCKET(_index, bucket);
  951. if ((int)next_bucket < 0)
  952. EMH_INDEX(_index, bucket) = {1, slot | EMH_KEYMASK(key_hash, _mask)};
  953. else {
  954. EMH_HSLOT(_index, bucket) |= EMH_KEYMASK(key_hash, _mask);
  955. next_bucket ++;
  956. }
  957. }
  958. return true;
  959. }
  960. void rebuild(size_type num_buckets) noexcept
  961. {
  962. free(_index);
  963. auto new_pairs = (value_type*)alloc_bucket((size_type)(num_buckets * max_load_factor()) + 4);
  964. if (is_copy_trivially()) {
  965. memcpy((char*)new_pairs, (char*)_pairs, _num_filled * sizeof(value_type));
  966. } else {
  967. for (size_type slot = 0; slot < _num_filled; slot++) {
  968. new(new_pairs + slot) value_type(std::move(_pairs[slot]));
  969. if (is_triviall_destructable())
  970. _pairs[slot].~value_type();
  971. }
  972. }
  973. free(_pairs);
  974. _pairs = new_pairs;
  975. _index = (Index*)alloc_index (num_buckets);
  976. memset((char*)_index, INACTIVE, sizeof(_index[0]) * num_buckets);
  977. memset((char*)(_index + num_buckets), 0, sizeof(_index[0]) * EAD);
  978. }
  979. void rehash(uint64_t required_buckets)
  980. {
  981. if (required_buckets < _num_filled)
  982. return;
  983. assert(required_buckets < max_size());
  984. auto num_buckets = _num_filled > (1u << 16) ? (1u << 16) : 4u;
  985. while (num_buckets < required_buckets) { num_buckets *= 2; }
  986. #if EMH_REHASH_LOG
  987. auto last = _last;
  988. size_type collision = 0;
  989. #endif
  990. #if EMH_HIGH_LOAD
  991. _ehead = 0;
  992. #endif
  993. _last = _mask / 4;
  994. _mask = num_buckets - 1;
  995. #if EMH_PACK_TAIL > 1
  996. _last = _mask;
  997. num_buckets += num_buckets * EMH_PACK_TAIL / 100; //add more 5-10%
  998. #endif
  999. _num_buckets = num_buckets;
  1000. rebuild(num_buckets);
  1001. #ifdef EMH_SORT
  1002. std::sort(_pairs, _pairs + _num_filled, [this](const value_type & l, const value_type & r) {
  1003. const auto hashl = hash_key(l.first), hashr = hash_key(r.first);
  1004. auto diff = int64_t((hashl & _mask) - (hashr & _mask));
  1005. if (diff != 0)
  1006. return diff < 0;
  1007. return hashl < hashr;
  1008. // return l.first < r.first;
  1009. });
  1010. #endif
  1011. _etail = INACTIVE;
  1012. for (size_type slot = 0; slot < _num_filled; ++slot) {
  1013. const auto& key = EMH_KEY(_pairs, slot);
  1014. const auto key_hash = hash_key(key);
  1015. const auto bucket = find_unique_bucket(key_hash);
  1016. EMH_INDEX(_index, bucket) = {bucket, slot | EMH_KEYMASK(key_hash, _mask)};
  1017. #if EMH_REHASH_LOG
  1018. if (bucket != hash_main(bucket))
  1019. collision ++;
  1020. #endif
  1021. }
  1022. #if EMH_REHASH_LOG
  1023. if (_num_filled > EMH_REHASH_LOG) {
  1024. auto mbucket = _num_filled - collision;
  1025. char buff[255] = {0};
  1026. sprintf(buff, " _num_filled/aver_size/K.V/pack/collision|last = %u/%.2lf/%s.%s/%zd|%.2lf%%,%.2lf%%",
  1027. _num_filled, double (_num_filled) / mbucket, typeid(KeyT).name(), typeid(ValueT).name(), sizeof(_pairs[0]), collision * 100.0 / _num_filled, last * 100.0 / _num_buckets);
  1028. #ifdef EMH_LOG
  1029. static uint32_t ihashs = 0; EMH_LOG() << "hash_nums = " << ihashs ++ << "|" <<__FUNCTION__ << "|" << buff << endl;
  1030. #else
  1031. puts(buff);
  1032. #endif
  1033. }
  1034. #endif
  1035. }
  1036. private:
  1037. // Can we fit another element?
  1038. inline bool check_expand_need()
  1039. {
  1040. return reserve(_num_filled, false);
  1041. }
  1042. size_type slot_to_bucket(const size_type slot) const noexcept
  1043. {
  1044. size_type main_bucket;
  1045. return find_slot_bucket(slot, main_bucket); //TODO
  1046. }
  1047. //very slow
  1048. void erase_slot(const size_type sbucket, const size_type main_bucket) noexcept
  1049. {
  1050. const auto slot = EMH_SLOT(_index, sbucket);
  1051. const auto ebucket = erase_bucket(sbucket, main_bucket);
  1052. const auto last_slot = --_num_filled;
  1053. if (EMH_LIKELY(slot != last_slot)) {
  1054. const auto last_bucket = (_etail == INACTIVE || ebucket == _etail)
  1055. ? slot_to_bucket(last_slot) : _etail;
  1056. EMH_KV(_pairs, slot) = std::move(EMH_KV(_pairs, last_slot));
  1057. EMH_HSLOT(_index, last_bucket) = slot | (EMH_HSLOT(_index, last_bucket) & ~_mask);
  1058. }
  1059. if (is_triviall_destructable())
  1060. _pairs[last_slot].~value_type();
  1061. _etail = INACTIVE;
  1062. EMH_INDEX(_index, ebucket) = {INACTIVE, 0};
  1063. #if EMH_HIGH_LOAD
  1064. if (_ehead) {
  1065. if (10 * _num_filled < 8 * _num_buckets)
  1066. clear_empty();
  1067. else if (ebucket)
  1068. push_empty(ebucket);
  1069. }
  1070. #endif
  1071. }
  1072. size_type erase_bucket(const size_type bucket, const size_type main_bucket) noexcept
  1073. {
  1074. const auto next_bucket = EMH_BUCKET(_index, bucket);
  1075. if (bucket == main_bucket) {
  1076. if (main_bucket != next_bucket) {
  1077. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1078. EMH_INDEX(_index, main_bucket) = {
  1079. (nbucket == next_bucket) ? main_bucket : nbucket,
  1080. EMH_HSLOT(_index, next_bucket)
  1081. };
  1082. }
  1083. return next_bucket;
  1084. }
  1085. const auto prev_bucket = find_prev_bucket(main_bucket, bucket);
  1086. EMH_BUCKET(_index, prev_bucket) = (bucket == next_bucket) ? prev_bucket : next_bucket;
  1087. return bucket;
  1088. }
  1089. // Find the slot with this key, or return bucket size
  1090. size_type find_slot_bucket(const size_type slot, size_type& main_bucket) const
  1091. {
  1092. const auto key_hash = hash_key(EMH_KEY(_pairs, slot));
  1093. const auto bucket = main_bucket = size_type(key_hash & _mask);
  1094. if (slot == EMH_SLOT(_index, bucket))
  1095. return bucket;
  1096. auto next_bucket = EMH_BUCKET(_index, bucket);
  1097. while (true) {
  1098. if (EMH_LIKELY(slot == EMH_SLOT(_index, next_bucket)))
  1099. return next_bucket;
  1100. next_bucket = EMH_BUCKET(_index, next_bucket);
  1101. }
  1102. return INACTIVE;
  1103. }
  1104. // Find the slot with this key, or return bucket size
  1105. size_type find_filled_bucket(const KeyT& key, uint64_t key_hash) const noexcept
  1106. {
  1107. const auto bucket = size_type(key_hash & _mask);
  1108. auto next_bucket = EMH_BUCKET(_index, bucket);
  1109. if (EMH_UNLIKELY((int)next_bucket < 0))
  1110. return INACTIVE;
  1111. if (EMH_EQHASH(bucket, key_hash)) {
  1112. const auto slot = EMH_SLOT(_index, bucket);
  1113. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, slot))))
  1114. return bucket;
  1115. }
  1116. if (next_bucket == bucket)
  1117. return INACTIVE;
  1118. while (true) {
  1119. if (EMH_EQHASH(next_bucket, key_hash)) {
  1120. const auto slot = EMH_SLOT(_index, next_bucket);
  1121. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, slot))))
  1122. return next_bucket;
  1123. }
  1124. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1125. if (nbucket == next_bucket)
  1126. return INACTIVE;
  1127. next_bucket = nbucket;
  1128. }
  1129. return INACTIVE;
  1130. }
  1131. // Find the slot with this key, or return bucket size
  1132. template<typename K=KeyT>
  1133. size_type find_filled_slot(const K& key) const noexcept
  1134. {
  1135. const auto key_hash = hash_key(key);
  1136. const auto bucket = size_type(key_hash & _mask);
  1137. auto next_bucket = EMH_BUCKET(_index, bucket);
  1138. if ((int)next_bucket < 0)
  1139. return _num_filled;
  1140. if (EMH_EQHASH(bucket, key_hash)) {
  1141. const auto slot = EMH_SLOT(_index, bucket);
  1142. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, slot))))
  1143. return slot;
  1144. }
  1145. if (next_bucket == bucket)
  1146. return _num_filled;
  1147. while (true) {
  1148. if (EMH_EQHASH(next_bucket, key_hash)) {
  1149. const auto slot = EMH_SLOT(_index, next_bucket);
  1150. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, slot))))
  1151. return slot;
  1152. }
  1153. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1154. if (nbucket == next_bucket)
  1155. return _num_filled;
  1156. next_bucket = nbucket;
  1157. }
  1158. return _num_filled;
  1159. }
  1160. #if EMH_SORT
  1161. size_type find_hash_bucket(const KeyT& key) const noexcept
  1162. {
  1163. const auto key_hash = hash_key(key);
  1164. const auto bucket = size_type(key_hash & _mask);
  1165. const auto next_bucket = EMH_BUCKET(_index, bucket);
  1166. if ((int)next_bucket < 0)
  1167. return END;
  1168. auto slot = EMH_SLOT(_index, bucket);
  1169. if (_eq(key, EMH_KEY(_pairs, slot++)))
  1170. return slot;
  1171. else if (next_bucket == bucket)
  1172. return END;
  1173. while (true) {
  1174. const auto& okey = EMH_KEY(_pairs, slot++);
  1175. if (_eq(key, okey))
  1176. return slot;
  1177. const auto hasho = hash_key(okey);
  1178. if ((hasho & _mask) != bucket)
  1179. break;
  1180. else if (hasho > key_hash)
  1181. break;
  1182. else if (EMH_UNLIKELY(slot >= _num_filled))
  1183. break;
  1184. }
  1185. return END;
  1186. }
  1187. //only for find/can not insert
  1188. size_type find_sorted_bucket(const KeyT& key) const noexcept
  1189. {
  1190. const auto key_hash = hash_key(key);
  1191. const auto bucket = size_type(key_hash & _mask);
  1192. const auto slots = (int)(EMH_BUCKET(_index, bucket)); //TODO
  1193. if (slots < 0 /**|| key < EMH_KEY(_pairs, slot)*/)
  1194. return END;
  1195. const auto slot = EMH_SLOT(_index, bucket);
  1196. auto ormask = _index[bucket].slot & ~_mask;
  1197. auto hmask = EMH_KEYMASK(key_hash, _mask);
  1198. if ((hmask | ormask) != ormask)
  1199. return END;
  1200. if (_eq(key, EMH_KEY(_pairs, slot)))
  1201. return slot;
  1202. else if (slots == 1 || key < EMH_KEY(_pairs, slot))
  1203. return END;
  1204. #if EMH_SORT
  1205. if (key < EMH_KEY(_pairs, slot) || key > EMH_KEY(_pairs, slots + slot - 1))
  1206. return END;
  1207. #endif
  1208. for (size_type i = 1; i < slots; ++i) {
  1209. const auto& okey = EMH_KEY(_pairs, slot + i);
  1210. if (_eq(key, okey))
  1211. return slot + i;
  1212. // else if (okey > key)
  1213. // return END;
  1214. }
  1215. return END;
  1216. }
  1217. #endif
  1218. //kick out bucket and find empty to occpuy
  1219. //it will break the orgin link and relnik again.
  1220. //before: main_bucket-->prev_bucket --> bucket --> next_bucket
  1221. //atfer : main_bucket-->prev_bucket --> (removed)--> new_bucket--> next_bucket
  1222. size_type kickout_bucket(const size_type kmain, const size_type bucket) noexcept
  1223. {
  1224. const auto next_bucket = EMH_BUCKET(_index, bucket);
  1225. const auto new_bucket = find_empty_bucket(next_bucket, 2);
  1226. const auto prev_bucket = find_prev_bucket(kmain, bucket);
  1227. const auto last = next_bucket == bucket ? new_bucket : next_bucket;
  1228. EMH_INDEX(_index, new_bucket) = {last, EMH_HSLOT(_index, bucket)};
  1229. EMH_BUCKET(_index, prev_bucket) = new_bucket;
  1230. EMH_BUCKET(_index, bucket) = INACTIVE;
  1231. return bucket;
  1232. }
  1233. /*
  1234. ** inserts a new key into a hash table; first, check whether key's main
  1235. ** bucket/position is free. If not, check whether colliding node/bucket is in its main
  1236. ** position or not: if it is not, move colliding bucket to an empty place and
  1237. ** put new key in its main position; otherwise (colliding bucket is in its main
  1238. ** position), new key goes to an empty position.
  1239. */
  1240. template<typename K=KeyT>
  1241. size_type find_or_allocate(const K& key, uint64_t key_hash) noexcept
  1242. {
  1243. const auto bucket = size_type(key_hash & _mask);
  1244. auto next_bucket = EMH_BUCKET(_index, bucket);
  1245. if ((int)next_bucket < 0) {
  1246. #if EMH_HIGH_LOAD
  1247. if (next_bucket != INACTIVE)
  1248. pop_empty(bucket);
  1249. #endif
  1250. return bucket;
  1251. }
  1252. const auto slot = EMH_SLOT(_index, bucket);
  1253. if (EMH_EQHASH(bucket, key_hash))
  1254. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, slot))))
  1255. return bucket;
  1256. //check current bucket_key is in main bucket or not
  1257. const auto kmain = hash_bucket(EMH_KEY(_pairs, slot));
  1258. if (kmain != bucket)
  1259. return kickout_bucket(kmain, bucket);
  1260. else if (next_bucket == bucket)
  1261. return EMH_BUCKET(_index, next_bucket) = find_empty_bucket(next_bucket, 1);
  1262. uint32_t csize = 1;
  1263. //find next linked bucket and check key
  1264. while (true) {
  1265. const auto eslot = EMH_SLOT(_index, next_bucket);
  1266. if (EMH_EQHASH(next_bucket, key_hash)) {
  1267. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, eslot))))
  1268. return next_bucket;
  1269. }
  1270. csize += 1;
  1271. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1272. if (nbucket == next_bucket)
  1273. break;
  1274. next_bucket = nbucket;
  1275. }
  1276. //find a empty and link it to tail
  1277. const auto new_bucket = find_empty_bucket(next_bucket, csize);
  1278. return EMH_BUCKET(_index, next_bucket) = new_bucket;
  1279. }
  1280. size_type find_unique_bucket(uint64_t key_hash) noexcept
  1281. {
  1282. const auto bucket = size_type(key_hash & _mask);
  1283. auto next_bucket = EMH_BUCKET(_index, bucket);
  1284. if ((int)next_bucket < 0) {
  1285. #if EMH_HIGH_LOAD
  1286. if (next_bucket != INACTIVE)
  1287. pop_empty(bucket);
  1288. #endif
  1289. return bucket;
  1290. }
  1291. //check current bucket_key is in main bucket or not
  1292. const auto kmain = hash_main(bucket);
  1293. if (EMH_UNLIKELY(kmain != bucket))
  1294. return kickout_bucket(kmain, bucket);
  1295. else if (EMH_UNLIKELY(next_bucket != bucket))
  1296. next_bucket = find_last_bucket(next_bucket);
  1297. return EMH_BUCKET(_index, next_bucket) = find_empty_bucket(next_bucket, 2);
  1298. }
  1299. /***
  1300. Different probing techniques usually provide a trade-off between memory locality and avoidance of clustering.
  1301. Since Robin Hood hashing is relatively resilient to clustering (both primary and secondary), linear probing is the most cache friendly alternativeis typically used.
  1302. It's the core algorithm of this hash map with highly optimization/benchmark.
  1303. normaly linear probing is inefficient with high load factor, it use a new 3-way linear
  1304. probing strategy to search empty slot. from benchmark even the load factor > 0.9, it's more 2-3 timer fast than
  1305. one-way search strategy.
  1306. 1. linear or quadratic probing a few cache line for less cache miss from input slot "bucket_from".
  1307. 2. the first search slot from member variant "_last", init with 0
  1308. 3. the second search slot from calculated pos "(_num_filled + _last) & _mask", it's like a rand value
  1309. */
  1310. // key is not in this mavalue. Find a place to put it.
  1311. size_type find_empty_bucket(const size_type bucket_from, uint32_t csize) noexcept
  1312. {
  1313. #if EMH_HIGH_LOAD
  1314. if (_ehead)
  1315. return pop_empty(_ehead);
  1316. #endif
  1317. auto bucket = bucket_from;
  1318. if (EMH_EMPTY(_index, ++bucket) || EMH_EMPTY(_index, ++bucket))
  1319. return bucket;
  1320. #ifdef EMH_QUADRATIC
  1321. constexpr size_type linear_probe_length = 2 * EMH_CACHE_LINE_SIZE / sizeof(Index);//16
  1322. for (size_type offset = csize + 2, step = 4; offset <= linear_probe_length; ) {
  1323. bucket = (bucket_from + offset) & _mask;
  1324. if (EMH_EMPTY(_index, bucket) || EMH_EMPTY(_index, ++bucket))
  1325. return bucket;
  1326. offset += step; //7/8. 12. 16
  1327. }
  1328. #else
  1329. constexpr size_type quadratic_probe_length = 6u;
  1330. for (size_type offset = 4u, step = 3u; step < quadratic_probe_length; ) {
  1331. bucket = (bucket_from + offset) & _mask;
  1332. if (EMH_EMPTY(_index, bucket) || EMH_EMPTY(_index, ++bucket))
  1333. return bucket;
  1334. offset += step++;//3.4.5
  1335. }
  1336. #endif
  1337. #if EMH_PREFETCH
  1338. __builtin_prefetch(static_cast<const void*>(_index + _last + 1), 0, EMH_PREFETCH);
  1339. #endif
  1340. for (;;) {
  1341. #if EMH_PACK_TAIL
  1342. //find empty bucket and skip next
  1343. if (EMH_EMPTY(_index, _last++))// || EMH_EMPTY(_index, _last++))
  1344. return _last++ - 1;
  1345. if (EMH_UNLIKELY(_last >= _num_buckets))
  1346. _last = 0;
  1347. auto medium = (_mask / 4 + _last++) & _mask;
  1348. if (EMH_EMPTY(_index, medium))
  1349. return medium;
  1350. #else
  1351. if (EMH_EMPTY(_index, ++_last))// || EMH_EMPTY(_index, ++_last))
  1352. return _last++;
  1353. _last &= _mask;
  1354. auto medium = (_num_buckets / 2 + _last) & _mask;
  1355. if (EMH_EMPTY(_index, medium))// || EMH_EMPTY(_index, ++medium))
  1356. return _last = medium;
  1357. #endif
  1358. }
  1359. return 0;
  1360. }
  1361. size_type find_last_bucket(size_type main_bucket) const
  1362. {
  1363. auto next_bucket = EMH_BUCKET(_index, main_bucket);
  1364. if (next_bucket == main_bucket)
  1365. return main_bucket;
  1366. while (true) {
  1367. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1368. if (nbucket == next_bucket)
  1369. return next_bucket;
  1370. next_bucket = nbucket;
  1371. }
  1372. }
  1373. size_type find_prev_bucket(const size_type main_bucket, const size_type bucket) const
  1374. {
  1375. auto next_bucket = EMH_BUCKET(_index, main_bucket);
  1376. if (next_bucket == bucket)
  1377. return main_bucket;
  1378. while (true) {
  1379. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1380. if (nbucket == bucket)
  1381. return next_bucket;
  1382. next_bucket = nbucket;
  1383. }
  1384. }
  1385. inline size_type hash_bucket(const KeyT& key) const noexcept
  1386. {
  1387. return (size_type)hash_key(key) & _mask;
  1388. }
  1389. inline size_type hash_main(const size_type bucket) const noexcept
  1390. {
  1391. const auto slot = EMH_SLOT(_index, bucket);
  1392. return (size_type)hash_key(EMH_KEY(_pairs, slot)) & _mask;
  1393. }
  1394. #if EMH_INT_HASH
  1395. static constexpr uint64_t KC = UINT64_C(11400714819323198485);
  1396. static uint64_t hash64(uint64_t key)
  1397. {
  1398. #if __SIZEOF_INT128__ && EMH_INT_HASH == 1
  1399. __uint128_t r = key; r *= KC;
  1400. return (uint64_t)(r >> 64) + (uint64_t)r;
  1401. #elif EMH_INT_HASH == 2
  1402. //MurmurHash3Mixer
  1403. uint64_t h = key;
  1404. h ^= h >> 33;
  1405. h *= 0xff51afd7ed558ccd;
  1406. h ^= h >> 33;
  1407. h *= 0xc4ceb9fe1a85ec53;
  1408. h ^= h >> 33;
  1409. return h;
  1410. #elif _WIN64 && EMH_INT_HASH == 1
  1411. uint64_t high;
  1412. return _umul128(key, KC, &high) + high;
  1413. #elif EMH_INT_HASH == 3
  1414. auto ror = (key >> 32) | (key << 32);
  1415. auto low = key * 0xA24BAED4963EE407ull;
  1416. auto high = ror * 0x9FB21C651E98DF25ull;
  1417. auto mix = low + high;
  1418. return mix;
  1419. #elif EMH_INT_HASH == 1
  1420. uint64_t r = key * UINT64_C(0xca4bcaa75ec3f625);
  1421. return (r >> 32) + r;
  1422. #elif EMH_WYHASH64
  1423. return wyhash64(key, KC);
  1424. #else
  1425. uint64_t x = key;
  1426. x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9);
  1427. x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb);
  1428. x = x ^ (x >> 31);
  1429. return x;
  1430. #endif
  1431. }
  1432. #endif
  1433. #if EMH_WYHASH_HASH
  1434. //#define WYHASH_CONDOM 1
  1435. inline uint64_t wymix(uint64_t A, uint64_t B)
  1436. {
  1437. #if defined(__SIZEOF_INT128__)
  1438. __uint128_t r = A; r *= B;
  1439. #if WYHASH_CONDOM2
  1440. A ^= (uint64_t)r; B ^= (uint64_t)(r >> 64);
  1441. #else
  1442. A = (uint64_t)r; B = (uint64_t)(r >> 64);
  1443. #endif
  1444. #elif defined(_MSC_VER) && defined(_M_X64)
  1445. #if WYHASH_CONDOM2
  1446. uint64_t a, b;
  1447. a = _umul128(A, B, &b);
  1448. A ^= a; B ^= b;
  1449. #else
  1450. A = _umul128(A, B, &B);
  1451. #endif
  1452. #else
  1453. uint64_t ha = A >> 32, hb = B >> 32, la = (uint32_t)A, lb = (uint32_t)B, hi, lo;
  1454. uint64_t rh = ha * hb, rm0 = ha * lb, rm1 = hb * la, rl = la * lb, t = rl + (rm0 << 32), c = t < rl;
  1455. lo = t + (rm1 << 32); c += lo < t; hi = rh + (rm0 >> 32) + (rm1 >> 32) + c;
  1456. #if WYHASH_CONDOM2
  1457. A ^= lo; B ^= hi;
  1458. #else
  1459. A = lo; B = hi;
  1460. #endif
  1461. #endif
  1462. return A ^ B;
  1463. }
  1464. //multiply and xor mix function, aka MUM
  1465. static inline uint64_t wyr8(const uint8_t *p) { uint64_t v; memcpy(&v, p, 8); return v; }
  1466. static inline uint64_t wyr4(const uint8_t *p) { uint32_t v; memcpy(&v, p, 4); return v; }
  1467. static inline uint64_t wyr3(const uint8_t *p, size_t k) {
  1468. return (((uint64_t)p[0]) << 16) | (((uint64_t)p[k >> 1]) << 8) | p[k - 1];
  1469. }
  1470. static constexpr uint64_t secret[4] = {
  1471. 0xa0761d6478bd642full, 0xe7037ed1a0b428dbull,
  1472. 0x8ebc6af09c88c6e3ull, 0x589965cc75374cc3ull};
  1473. public:
  1474. //wyhash main function https://github.com/wangyi-fudan/wyhash
  1475. static uint64_t wyhashstr(const char *key, const size_t len)
  1476. {
  1477. uint64_t a = 0, b = 0, seed = secret[0];
  1478. const uint8_t *p = (const uint8_t*)key;
  1479. if (EMH_LIKELY(len <= 16)) {
  1480. if (EMH_LIKELY(len >= 4)) {
  1481. const auto half = (len >> 3) << 2;
  1482. a = (wyr4(p) << 32U) | wyr4(p + half); p += len - 4;
  1483. b = (wyr4(p) << 32U) | wyr4(p - half);
  1484. } else if (len) {
  1485. a = wyr3(p, len);
  1486. }
  1487. } else {
  1488. size_t i = len;
  1489. if (EMH_UNLIKELY(i > 48)) {
  1490. uint64_t see1 = seed, see2 = seed;
  1491. do {
  1492. seed = wymix(wyr8(p + 0) ^ secret[1], wyr8(p + 8) ^ seed);
  1493. see1 = wymix(wyr8(p + 16) ^ secret[2], wyr8(p + 24) ^ see1);
  1494. see2 = wymix(wyr8(p + 32) ^ secret[3], wyr8(p + 40) ^ see2);
  1495. p += 48; i -= 48;
  1496. } while (EMH_LIKELY(i > 48));
  1497. seed ^= see1 ^ see2;
  1498. }
  1499. while (i > 16) {
  1500. seed = wymix(wyr8(p) ^ secret[1], wyr8(p + 8) ^ seed);
  1501. i -= 16; p += 16;
  1502. }
  1503. a = wyr8(p + i - 16);
  1504. b = wyr8(p + i - 8);
  1505. }
  1506. return wymix(secret[1] ^ len, wymix(a ^ secret[1], b ^ seed));
  1507. }
  1508. #endif
  1509. private:
  1510. template<typename UType, typename std::enable_if<std::is_integral<UType>::value, uint32_t>::type = 0>
  1511. inline uint64_t hash_key(const UType key) const
  1512. {
  1513. #if EMH_INT_HASH
  1514. return hash64(key);
  1515. #elif EMH_IDENTITY_HASH
  1516. return key + (key >> 24);
  1517. #else
  1518. return _hasher(key);
  1519. #endif
  1520. }
  1521. template<typename UType, typename std::enable_if<std::is_same<UType, std::string>::value, uint32_t>::type = 0>
  1522. inline uint64_t hash_key(const UType& key) const
  1523. {
  1524. #if EMH_WYHASH_HASH
  1525. return wyhashstr(key.data(), key.size());
  1526. #else
  1527. return _hasher(key);
  1528. #endif
  1529. }
  1530. template<typename UType, typename std::enable_if<!std::is_integral<UType>::value && !std::is_same<UType, std::string>::value, uint32_t>::type = 0>
  1531. inline uint64_t hash_key(const UType& key) const
  1532. {
  1533. return _hasher(key);
  1534. }
  1535. private:
  1536. Index* _index;
  1537. value_type*_pairs;
  1538. HashT _hasher;
  1539. EqT _eq;
  1540. uint32_t _mlf;
  1541. size_type _mask;
  1542. size_type _num_buckets;
  1543. size_type _num_filled;
  1544. size_type _last;
  1545. #if EMH_HIGH_LOAD
  1546. size_type _ehead;
  1547. #endif
  1548. size_type _etail;
  1549. };
  1550. } // namespace emhash
  1551. #ifdef _MSC_VER
  1552. #pragma warning (disable:4267)
  1553. #pragma warning (disable:4101)
  1554. #define _CRT_NONSTDC_NO_DEPRECATE
  1555. #define strdup _strdup
  1556. #endif
  1557. #include <sstream>
  1558. #include <regex>
  1559. #include <stack>
  1560. #include <cmath>
  1561. #include <stdexcept>
  1562. #include <vector>
  1563. #include <string>
  1564. #include <cstring>
  1565. #include <chrono>
  1566. #include <string_view>
  1567. #include <queue>
  1568. #include <iomanip>
  1569. #include <memory>
  1570. #include <functional>
  1571. #include <iostream>
  1572. #ifdef POCKETPY_H
  1573. #define UNREACHABLE() throw std::runtime_error( "L" + std::to_string(__LINE__) + " UNREACHABLE()! This should be a bug, please report it");
  1574. #else
  1575. #define UNREACHABLE() throw std::runtime_error( __FILE__ + std::string(":") + std::to_string(__LINE__) + " UNREACHABLE()!");
  1576. #endif
  1577. #ifdef __EMSCRIPTEN__
  1578. #include <emscripten.h>
  1579. #endif
  1580. #define PK_VERSION "0.8.0"
  1581. typedef int64_t i64;
  1582. typedef double f64;
  1583. #define DUMMY_VAL (i64)0
  1584. #define CPP_LAMBDA(x) ([](VM* vm, const pkpy::ArgList& args) { return x; })
  1585. namespace pkpy{
  1586. template <typename T>
  1587. class shared_ptr {
  1588. int* counter = nullptr;
  1589. #define _t() ((T*)(counter + 1))
  1590. #define _inc_counter() if(counter) ++(*counter)
  1591. #define _dec_counter() if(counter && --(*counter) == 0){ _t()->~T(); free(counter); }
  1592. public:
  1593. shared_ptr() {}
  1594. shared_ptr(int* block) : counter(block) {}
  1595. shared_ptr(const shared_ptr& other) : counter(other.counter) {
  1596. _inc_counter();
  1597. }
  1598. shared_ptr(shared_ptr&& other) noexcept : counter(other.counter) {
  1599. other.counter = nullptr;
  1600. }
  1601. ~shared_ptr() {
  1602. _dec_counter();
  1603. }
  1604. bool operator==(const shared_ptr& other) const {
  1605. return counter == other.counter;
  1606. }
  1607. bool operator!=(const shared_ptr& other) const {
  1608. return counter != other.counter;
  1609. }
  1610. bool operator==(std::nullptr_t) const {
  1611. return counter == nullptr;
  1612. }
  1613. bool operator!=(std::nullptr_t) const {
  1614. return counter != nullptr;
  1615. }
  1616. shared_ptr& operator=(const shared_ptr& other) {
  1617. _dec_counter();
  1618. counter = other.counter;
  1619. _inc_counter();
  1620. return *this;
  1621. }
  1622. shared_ptr& operator=(shared_ptr&& other) noexcept {
  1623. _dec_counter();
  1624. counter = other.counter;
  1625. other.counter = nullptr;
  1626. return *this;
  1627. }
  1628. T& operator*() const {
  1629. return *_t();
  1630. }
  1631. T* operator->() const {
  1632. return _t();
  1633. }
  1634. T* get() const {
  1635. return _t();
  1636. }
  1637. int use_count() const {
  1638. return counter ? *counter : 0;
  1639. }
  1640. void reset(){
  1641. _dec_counter();
  1642. counter = nullptr;
  1643. }
  1644. };
  1645. #undef _t
  1646. #undef _inc_counter
  1647. #undef _dec_counter
  1648. template <typename T, typename U, typename... Args>
  1649. shared_ptr<T> make_shared(Args&&... args) {
  1650. static_assert(std::is_base_of<T, U>::value, "U must be derived from T");
  1651. int* p = (int*)malloc(sizeof(int) + sizeof(U));
  1652. *p = 1;
  1653. new(p+1) U(std::forward<Args>(args)...);
  1654. return shared_ptr<T>(p);
  1655. }
  1656. template <typename T, typename... Args>
  1657. shared_ptr<T> make_shared(Args&&... args) {
  1658. int* p = (int*)malloc(sizeof(int) + sizeof(T));
  1659. *p = 1;
  1660. new(p+1) T(std::forward<Args>(args)...);
  1661. return shared_ptr<T>(p);
  1662. }
  1663. };
  1664. typedef std::stringstream _StrStream;
  1665. class _Str : public std::string {
  1666. mutable std::vector<uint16_t>* _u8_index = nullptr;
  1667. mutable bool hash_initialized = false;
  1668. mutable size_t _hash;
  1669. void utf8_lazy_init() const{
  1670. if(_u8_index != nullptr) return;
  1671. _u8_index = new std::vector<uint16_t>();
  1672. _u8_index->reserve(size());
  1673. if(size() > 65535) throw std::runtime_error("String has more than 65535 bytes.");
  1674. for(uint16_t i = 0; i < size(); i++){
  1675. // https://stackoverflow.com/questions/3911536/utf-8-unicode-whats-with-0xc0-and-0x80
  1676. if((at(i) & 0xC0) != 0x80)
  1677. _u8_index->push_back(i);
  1678. }
  1679. }
  1680. public:
  1681. _Str() : std::string() {}
  1682. _Str(const char* s) : std::string(s) {}
  1683. _Str(const char* s, size_t n) : std::string(s, n) {}
  1684. _Str(const std::string& s) : std::string(s) {}
  1685. _Str(const _Str& s) : std::string(s) {
  1686. if(s._u8_index != nullptr){
  1687. _u8_index = new std::vector<uint16_t>(*s._u8_index);
  1688. }
  1689. if(s.hash_initialized){
  1690. _hash = s._hash;
  1691. hash_initialized = true;
  1692. }
  1693. }
  1694. _Str(_Str&& s) : std::string(std::move(s)) {
  1695. if(_u8_index != nullptr) delete _u8_index;
  1696. _u8_index = s._u8_index;
  1697. s._u8_index = nullptr;
  1698. if(s.hash_initialized){
  1699. _hash = s._hash;
  1700. hash_initialized = true;
  1701. }
  1702. }
  1703. inline size_t hash() const{
  1704. if(!hash_initialized){
  1705. _hash = std::hash<std::string>()(*this);
  1706. hash_initialized = true;
  1707. }
  1708. return _hash;
  1709. }
  1710. i64 __to_u8_index(i64 index) const{
  1711. utf8_lazy_init();
  1712. auto p = std::lower_bound(_u8_index->begin(), _u8_index->end(), index);
  1713. if(p != _u8_index->end() && *p != index) UNREACHABLE();
  1714. return p - _u8_index->begin();
  1715. }
  1716. int u8_length() const {
  1717. utf8_lazy_init();
  1718. return _u8_index->size();
  1719. }
  1720. _Str u8_getitem(int i) const{
  1721. return u8_substr(i, i+1);
  1722. }
  1723. _Str u8_substr(int start, int end) const{
  1724. utf8_lazy_init();
  1725. if(start >= end) return _Str();
  1726. int c_end = end >= _u8_index->size() ? size() : _u8_index->at(end);
  1727. return substr(_u8_index->at(start), c_end - _u8_index->at(start));
  1728. }
  1729. _Str __lstrip() const {
  1730. _Str copy(*this);
  1731. copy.erase(copy.begin(), std::find_if(copy.begin(), copy.end(), [](char c) {
  1732. // std::isspace(c) does not working on windows (Debug)
  1733. return c != ' ' && c != '\t' && c != '\r' && c != '\n';
  1734. }));
  1735. return _Str(copy);
  1736. }
  1737. _Str __escape(bool single_quote) const {
  1738. _StrStream ss;
  1739. ss << (single_quote ? '\'' : '"');
  1740. for (int i=0; i<length(); i++) {
  1741. char c = this->operator[](i);
  1742. switch (c) {
  1743. case '"':
  1744. if(!single_quote) ss << '\\';
  1745. ss << '"';
  1746. break;
  1747. case '\'':
  1748. if(single_quote) ss << '\\';
  1749. ss << '\'';
  1750. break;
  1751. case '\\': ss << '\\' << '\\'; break;
  1752. case '\n': ss << "\\n"; break;
  1753. case '\r': ss << "\\r"; break;
  1754. case '\t': ss << "\\t"; break;
  1755. default:
  1756. if ('\x00' <= c && c <= '\x1f') {
  1757. ss << "\\u"
  1758. << std::hex << std::setw(4) << std::setfill('0') << static_cast<int>(c);
  1759. } else {
  1760. ss << c;
  1761. }
  1762. }
  1763. }
  1764. ss << (single_quote ? '\'' : '"');
  1765. return ss.str();
  1766. }
  1767. _Str& operator=(const _Str& s){
  1768. this->std::string::operator=(s);
  1769. if(_u8_index != nullptr) delete _u8_index;
  1770. this->_u8_index = s._u8_index;
  1771. this->hash_initialized = s.hash_initialized;
  1772. this->_hash = s._hash;
  1773. return *this;
  1774. }
  1775. _Str& operator=(_Str&& s){
  1776. this->std::string::operator=(std::move(s));
  1777. if(_u8_index != nullptr) delete _u8_index;
  1778. this->_u8_index = s._u8_index;
  1779. this->hash_initialized = s.hash_initialized;
  1780. this->_hash = s._hash;
  1781. return *this;
  1782. }
  1783. operator const char*() const {
  1784. return c_str();
  1785. }
  1786. ~_Str(){
  1787. if(_u8_index != nullptr) delete _u8_index;
  1788. }
  1789. };
  1790. namespace std {
  1791. template<>
  1792. struct hash<_Str> {
  1793. inline std::size_t operator()(const _Str& s) const {
  1794. return s.hash();
  1795. }
  1796. };
  1797. }
  1798. const _Str& __class__ = _Str("__class__");
  1799. const _Str& __base__ = _Str("__base__");
  1800. const _Str& __new__ = _Str("__new__");
  1801. const _Str& __iter__ = _Str("__iter__");
  1802. const _Str& __str__ = _Str("__str__");
  1803. const _Str& __repr__ = _Str("__repr__");
  1804. const _Str& __module__ = _Str("__module__");
  1805. const _Str& __getitem__ = _Str("__getitem__");
  1806. const _Str& __setitem__ = _Str("__setitem__");
  1807. const _Str& __delitem__ = _Str("__delitem__");
  1808. const _Str& __contains__ = _Str("__contains__");
  1809. const _Str& __init__ = _Str("__init__");
  1810. const _Str& __json__ = _Str("__json__");
  1811. const _Str& __name__ = _Str("__name__");
  1812. const _Str& __len__ = _Str("__len__");
  1813. const _Str& m_append = _Str("append");
  1814. const _Str& m_eval = _Str("eval");
  1815. const _Str& m_self = _Str("self");
  1816. const _Str& __enter__ = _Str("__enter__");
  1817. const _Str& __exit__ = _Str("__exit__");
  1818. const _Str CMP_SPECIAL_METHODS[] = {
  1819. "__lt__", "__le__", "__eq__", "__ne__", "__gt__", "__ge__"
  1820. };
  1821. const _Str BINARY_SPECIAL_METHODS[] = {
  1822. "__add__", "__sub__", "__mul__", "__truediv__", "__floordiv__", "__mod__", "__pow__"
  1823. };
  1824. const _Str BITWISE_SPECIAL_METHODS[] = {
  1825. "__lshift__", "__rshift__", "__and__", "__or__", "__xor__"
  1826. };
  1827. const uint32_t __LoRangeA[] = {170,186,443,448,660,1488,1519,1568,1601,1646,1649,1749,1774,1786,1791,1808,1810,1869,1969,1994,2048,2112,2144,2208,2230,2308,2365,2384,2392,2418,2437,2447,2451,2474,2482,2486,2493,2510,2524,2527,2544,2556,2565,2575,2579,2602,2610,2613,2616,2649,2654,2674,2693,2703,2707,2730,2738,2741,2749,2768,2784,2809,2821,2831,2835,2858,2866,2869,2877,2908,2911,2929,2947,2949,2958,2962,2969,2972,2974,2979,2984,2990,3024,3077,3086,3090,3114,3133,3160,3168,3200,3205,3214,3218,3242,3253,3261,3294,3296,3313,3333,3342,3346,3389,3406,3412,3423,3450,3461,3482,3507,3517,3520,3585,3634,3648,3713,3716,3718,3724,3749,3751,3762,3773,3776,3804,3840,3904,3913,3976,4096,4159,4176,4186,4193,4197,4206,4213,4238,4352,4682,4688,4696,4698,4704,4746,4752,4786,4792,4800,4802,4808,4824,4882,4888,4992,5121,5743,5761,5792,5873,5888,5902,5920,5952,5984,5998,6016,6108,6176,6212,6272,6279,6314,6320,6400,6480,6512,6528,6576,6656,6688,6917,6981,7043,7086,7098,7168,7245,7258,7401,7406,7413,7418,8501,11568,11648,11680,11688,11696,11704,11712,11720,11728,11736,12294,12348,12353,12447,12449,12543,12549,12593,12704,12784,13312,19968,40960,40982,42192,42240,42512,42538,42606,42656,42895,42999,43003,43011,43015,43020,43072,43138,43250,43259,43261,43274,43312,43360,43396,43488,43495,43514,43520,43584,43588,43616,43633,43642,43646,43697,43701,43705,43712,43714,43739,43744,43762,43777,43785,43793,43808,43816,43968,44032,55216,55243,63744,64112,64285,64287,64298,64312,64318,64320,64323,64326,64467,64848,64914,65008,65136,65142,65382,65393,65440,65474,65482,65490,65498,65536,65549,65576,65596,65599,65616,65664,66176,66208,66304,66349,66370,66384,66432,66464,66504,66640,66816,66864,67072,67392,67424,67584,67592,67594,67639,67644,67647,67680,67712,67808,67828,67840,67872,67968,68030,68096,68112,68117,68121,68192,68224,68288,68297,68352,68416,68448,68480,68608,68864,69376,69415,69424,69600,69635,69763,69840,69891,69956,69968,70006,70019,70081,70106,70108,70144,70163,70272,70280,70282,70287,70303,70320,70405,70415,70419,70442,70450,70453,70461,70480,70493,70656,70727,70751,70784,70852,70855,71040,71128,71168,71236,71296,71352,71424,71680,71935,72096,72106,72161,72163,72192,72203,72250,72272,72284,72349,72384,72704,72714,72768,72818,72960,72968,72971,73030,73056,73063,73066,73112,73440,73728,74880,77824,82944,92160,92736,92880,92928,93027,93053,93952,94032,94208,100352,110592,110928,110948,110960,113664,113776,113792,113808,123136,123214,123584,124928,126464,126469,126497,126500,126503,126505,126516,126521,126523,126530,126535,126537,126539,126541,126545,126548,126551,126553,126555,126557,126559,126561,126564,126567,126572,126580,126585,126590,126592,126603,126625,126629,126635,131072,173824,177984,178208,183984,194560};
  1828. const uint32_t __LoRangeB[] = {170,186,443,451,660,1514,1522,1599,1610,1647,1747,1749,1775,1788,1791,1808,1839,1957,1969,2026,2069,2136,2154,2228,2237,2361,2365,2384,2401,2432,2444,2448,2472,2480,2482,2489,2493,2510,2525,2529,2545,2556,2570,2576,2600,2608,2611,2614,2617,2652,2654,2676,2701,2705,2728,2736,2739,2745,2749,2768,2785,2809,2828,2832,2856,2864,2867,2873,2877,2909,2913,2929,2947,2954,2960,2965,2970,2972,2975,2980,2986,3001,3024,3084,3088,3112,3129,3133,3162,3169,3200,3212,3216,3240,3251,3257,3261,3294,3297,3314,3340,3344,3386,3389,3406,3414,3425,3455,3478,3505,3515,3517,3526,3632,3635,3653,3714,3716,3722,3747,3749,3760,3763,3773,3780,3807,3840,3911,3948,3980,4138,4159,4181,4189,4193,4198,4208,4225,4238,4680,4685,4694,4696,4701,4744,4749,4784,4789,4798,4800,4805,4822,4880,4885,4954,5007,5740,5759,5786,5866,5880,5900,5905,5937,5969,5996,6000,6067,6108,6210,6264,6276,6312,6314,6389,6430,6509,6516,6571,6601,6678,6740,6963,6987,7072,7087,7141,7203,7247,7287,7404,7411,7414,7418,8504,11623,11670,11686,11694,11702,11710,11718,11726,11734,11742,12294,12348,12438,12447,12538,12543,12591,12686,12730,12799,19893,40943,40980,42124,42231,42507,42527,42539,42606,42725,42895,42999,43009,43013,43018,43042,43123,43187,43255,43259,43262,43301,43334,43388,43442,43492,43503,43518,43560,43586,43595,43631,43638,43642,43695,43697,43702,43709,43712,43714,43740,43754,43762,43782,43790,43798,43814,43822,44002,55203,55238,55291,64109,64217,64285,64296,64310,64316,64318,64321,64324,64433,64829,64911,64967,65019,65140,65276,65391,65437,65470,65479,65487,65495,65500,65547,65574,65594,65597,65613,65629,65786,66204,66256,66335,66368,66377,66421,66461,66499,66511,66717,66855,66915,67382,67413,67431,67589,67592,67637,67640,67644,67669,67702,67742,67826,67829,67861,67897,68023,68031,68096,68115,68119,68149,68220,68252,68295,68324,68405,68437,68466,68497,68680,68899,69404,69415,69445,69622,69687,69807,69864,69926,69956,70002,70006,70066,70084,70106,70108,70161,70187,70278,70280,70285,70301,70312,70366,70412,70416,70440,70448,70451,70457,70461,70480,70497,70708,70730,70751,70831,70853,70855,71086,71131,71215,71236,71338,71352,71450,71723,71935,72103,72144,72161,72163,72192,72242,72250,72272,72329,72349,72440,72712,72750,72768,72847,72966,72969,73008,73030,73061,73064,73097,73112,73458,74649,75075,78894,83526,92728,92766,92909,92975,93047,93071,94026,94032,100343,101106,110878,110930,110951,111355,113770,113788,113800,113817,123180,123214,123627,125124,126467,126495,126498,126500,126503,126514,126519,126521,126523,126530,126535,126537,126539,126543,126546,126548,126551,126553,126555,126557,126559,126562,126564,126570,126578,126583,126588,126590,126601,126619,126627,126633,126651,173782,177972,178205,183969,191456,195101};
  1829. bool __isLoChar(uint32_t c) {
  1830. auto index = std::lower_bound(__LoRangeA, __LoRangeA + 476, c) - __LoRangeA;
  1831. if(c == __LoRangeA[index]) return true;
  1832. index -= 1;
  1833. if(index < 0) return false;
  1834. return c >= __LoRangeA[index] && c <= __LoRangeB[index];
  1835. }
  1836. struct PyObject;
  1837. typedef pkpy::shared_ptr<PyObject> PyVar;
  1838. typedef PyVar PyVarOrNull;
  1839. typedef PyVar PyVarRef;
  1840. class PyVarList: public std::vector<PyVar> {
  1841. PyVar& at(size_t) = delete;
  1842. inline void __checkIndex(size_t i) const {
  1843. if (i >= size()){
  1844. auto msg = "std::vector index out of range, " + std::to_string(i) + " not in [0, " + std::to_string(size()) + ")";
  1845. throw std::out_of_range(msg);
  1846. }
  1847. }
  1848. public:
  1849. PyVar& operator[](size_t i) {
  1850. __checkIndex(i);
  1851. return std::vector<PyVar>::operator[](i);
  1852. }
  1853. const PyVar& operator[](size_t i) const {
  1854. __checkIndex(i);
  1855. return std::vector<PyVar>::operator[](i);
  1856. }
  1857. // define constructors the same as std::vector
  1858. using std::vector<PyVar>::vector;
  1859. };
  1860. typedef emhash8::HashMap<_Str, PyVar> PyVarDict;
  1861. namespace pkpy {
  1862. const int MAX_POOLING_N = 10;
  1863. static thread_local std::vector<PyVar*>* _poolArgList = new std::vector<PyVar*>[MAX_POOLING_N];
  1864. class ArgList {
  1865. PyVar* _args;
  1866. int _size;
  1867. void __tryAlloc(size_t n){
  1868. if(n == 0){
  1869. this->_args = nullptr;
  1870. this->_size = 0;
  1871. return;
  1872. }
  1873. if(n >= MAX_POOLING_N || _poolArgList[n].empty()){
  1874. this->_args = new PyVar[n];
  1875. this->_size = n;
  1876. }else{
  1877. this->_args = _poolArgList[n].back();
  1878. this->_size = n;
  1879. _poolArgList[n].pop_back();
  1880. }
  1881. }
  1882. void __tryRelease(){
  1883. if(_size == 0 || _args == nullptr) return;
  1884. if(_size >= MAX_POOLING_N || _poolArgList[_size].size() > 32){
  1885. delete[] _args;
  1886. }else{
  1887. for(int i = 0; i < _size; i++) _args[i].reset();
  1888. _poolArgList[_size].push_back(_args);
  1889. }
  1890. }
  1891. public:
  1892. ArgList(size_t n){
  1893. __tryAlloc(n);
  1894. }
  1895. ArgList(const ArgList& other){
  1896. __tryAlloc(other._size);
  1897. for(int i=0; i<_size; i++) _args[i] = other._args[i];
  1898. }
  1899. ArgList(ArgList&& other) noexcept {
  1900. this->_args = other._args;
  1901. this->_size = other._size;
  1902. other._args = nullptr;
  1903. other._size = 0;
  1904. }
  1905. ArgList(PyVarList&& other) noexcept {
  1906. __tryAlloc(other.size());
  1907. for(int i=0; i<_size; i++){
  1908. _args[i] = std::move(other[i]);
  1909. }
  1910. other.clear();
  1911. }
  1912. PyVar& operator[](int i){ return _args[i]; }
  1913. const PyVar& operator[](int i) const { return _args[i]; }
  1914. ArgList& operator=(ArgList&& other) noexcept {
  1915. __tryRelease();
  1916. this->_args = other._args;
  1917. this->_size = other._size;
  1918. other._args = nullptr;
  1919. other._size = 0;
  1920. return *this;
  1921. }
  1922. inline int size() const { return _size; }
  1923. PyVarList toList() const {
  1924. PyVarList ret(_size);
  1925. for(int i=0; i<_size; i++) ret[i] = _args[i];
  1926. return ret;
  1927. }
  1928. void extend_self(const PyVar& self){
  1929. static_assert(std::is_standard_layout_v<PyVar>);
  1930. PyVar* old_args = _args;
  1931. int old_size = _size;
  1932. __tryAlloc(old_size+1);
  1933. _args[0] = self;
  1934. if(old_size == 0) return;
  1935. memcpy((void*)(_args+1), (void*)old_args, sizeof(PyVar)*old_size);
  1936. memset((void*)old_args, 0, sizeof(PyVar)*old_size);
  1937. if(old_size >= MAX_POOLING_N || _poolArgList[old_size].size() > 32){
  1938. delete[] old_args;
  1939. }else{
  1940. _poolArgList[old_size].push_back(old_args);
  1941. }
  1942. }
  1943. ~ArgList(){
  1944. __tryRelease();
  1945. }
  1946. };
  1947. const ArgList& noArg(){
  1948. static const ArgList ret(0);
  1949. return ret;
  1950. }
  1951. template<typename T>
  1952. ArgList oneArg(T&& a) {
  1953. ArgList ret(1);
  1954. ret[0] = std::forward<T>(a);
  1955. return ret;
  1956. }
  1957. template<typename T1, typename T2>
  1958. ArgList twoArgs(T1&& a, T2&& b) {
  1959. ArgList ret(2);
  1960. ret[0] = std::forward<T1>(a);
  1961. ret[1] = std::forward<T2>(b);
  1962. return ret;
  1963. }
  1964. }
  1965. const char* __BUILTINS_CODE = R"(
  1966. def print(*args, sep=' ', end='\n'):
  1967. s = sep.join([str(i) for i in args])
  1968. __sys_stdout_write(s + end)
  1969. def round(x, ndigits=0):
  1970. assert ndigits >= 0
  1971. if ndigits == 0:
  1972. return x >= 0 ? int(x + 0.5) : int(x - 0.5)
  1973. if x >= 0:
  1974. return int(x * 10**ndigits + 0.5) / 10**ndigits
  1975. else:
  1976. return int(x * 10**ndigits - 0.5) / 10**ndigits
  1977. def isinstance(obj, cls):
  1978. assert type(cls) is type
  1979. obj_t = type(obj)
  1980. while obj_t is not None:
  1981. if obj_t is cls:
  1982. return True
  1983. obj_t = obj_t.__base__
  1984. return False
  1985. def abs(x):
  1986. return x < 0 ? -x : x
  1987. def max(a, b):
  1988. return a > b ? a : b
  1989. def min(a, b):
  1990. return a < b ? a : b
  1991. def sum(iterable):
  1992. res = 0
  1993. for i in iterable:
  1994. res += i
  1995. return res
  1996. def map(f, iterable):
  1997. return [f(i) for i in iterable]
  1998. def zip(a, b):
  1999. return [(a[i], b[i]) for i in range(min(len(a), len(b)))]
  2000. def reversed(iterable):
  2001. a = list(iterable)
  2002. return [a[i] for i in range(len(a)-1, -1, -1)]
  2003. def sorted(iterable, key=None, reverse=False):
  2004. if key is None:
  2005. key = lambda x: x
  2006. a = [key(i) for i in iterable]
  2007. b = list(iterable)
  2008. for i in range(len(a)):
  2009. for j in range(i+1, len(a)):
  2010. if (a[i] > a[j]) ^ reverse:
  2011. a[i], a[j] = a[j], a[i]
  2012. b[i], b[j] = b[j], b[i]
  2013. return b
  2014. ##### str #####
  2015. str.__mul__ = lambda self, n: ''.join([self for _ in range(n)])
  2016. def __str4split(self, sep):
  2017. if sep == "":
  2018. return list(self)
  2019. res = []
  2020. i = 0
  2021. while i < len(self):
  2022. if self[i:i+len(sep)] == sep:
  2023. res.append(self[:i])
  2024. self = self[i+len(sep):]
  2025. i = 0
  2026. else:
  2027. i += 1
  2028. res.append(self)
  2029. return res
  2030. str.split = __str4split
  2031. del __str4split
  2032. def __str4index(self, sub):
  2033. for i in range(len(self)):
  2034. if self[i:i+len(sub)] == sub:
  2035. return i
  2036. return -1
  2037. str.index = __str4index
  2038. del __str4index
  2039. def __str4strip(self, chars=None):
  2040. chars = chars or ' \t\n\r'
  2041. i = 0
  2042. while i < len(self) and self[i] in chars:
  2043. i += 1
  2044. j = len(self) - 1
  2045. while j >= 0 and self[j] in chars:
  2046. j -= 1
  2047. return self[i:j+1]
  2048. str.strip = __str4strip
  2049. del __str4strip
  2050. ##### list #####
  2051. list.__repr__ = lambda self: '[' + ', '.join([repr(i) for i in self]) + ']'
  2052. tuple.__repr__ = lambda self: '(' + ', '.join([repr(i) for i in self]) + ')'
  2053. list.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
  2054. tuple.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
  2055. def __list4extend(self, other):
  2056. for i in other:
  2057. self.append(i)
  2058. list.extend = __list4extend
  2059. del __list4extend
  2060. def __list4remove(self, value):
  2061. for i in range(len(self)):
  2062. if self[i] == value:
  2063. del self[i]
  2064. return True
  2065. return False
  2066. list.remove = __list4remove
  2067. del __list4remove
  2068. def __list4index(self, value):
  2069. for i in range(len(self)):
  2070. if self[i] == value:
  2071. return i
  2072. return -1
  2073. list.index = __list4index
  2074. del __list4index
  2075. def __list4pop(self, i=-1):
  2076. res = self[i]
  2077. del self[i]
  2078. return res
  2079. list.pop = __list4pop
  2080. del __list4pop
  2081. def __list4__mul__(self, n):
  2082. a = []
  2083. for i in range(n):
  2084. a.extend(self)
  2085. return a
  2086. list.__mul__ = __list4__mul__
  2087. del __list4__mul__
  2088. def __iterable4__eq__(self, other):
  2089. if len(self) != len(other):
  2090. return False
  2091. for i in range(len(self)):
  2092. if self[i] != other[i]:
  2093. return False
  2094. return True
  2095. list.__eq__ = __iterable4__eq__
  2096. tuple.__eq__ = __iterable4__eq__
  2097. list.__ne__ = lambda self, other: not self.__eq__(other)
  2098. tuple.__ne__ = lambda self, other: not self.__eq__(other)
  2099. del __iterable4__eq__
  2100. def __iterable4count(self, x):
  2101. res = 0
  2102. for i in self:
  2103. if i == x:
  2104. res += 1
  2105. return res
  2106. list.count = __iterable4count
  2107. tuple.count = __iterable4count
  2108. del __iterable4count
  2109. def __iterable4__contains__(self, item):
  2110. for i in self:
  2111. if i == item:
  2112. return True
  2113. return False
  2114. list.__contains__ = __iterable4__contains__
  2115. tuple.__contains__ = __iterable4__contains__
  2116. del __iterable4__contains__
  2117. list.__new__ = lambda obj: [i for i in obj]
  2118. # https://github.com/python/cpython/blob/main/Objects/dictobject.c
  2119. class dict:
  2120. def __init__(self, capacity=16):
  2121. self._capacity = capacity
  2122. self._a = [None] * self._capacity
  2123. self._len = 0
  2124. def __len__(self):
  2125. return self._len
  2126. def __probe(self, key):
  2127. i = hash(key) % self._capacity
  2128. while self._a[i] is not None:
  2129. if self._a[i][0] == key:
  2130. return True, i
  2131. i = (i + 1) % self._capacity
  2132. return False, i
  2133. def __getitem__(self, key):
  2134. ok, i = self.__probe(key)
  2135. if not ok:
  2136. raise KeyError(key)
  2137. return self._a[i][1]
  2138. def __contains__(self, key):
  2139. ok, i = self.__probe(key)
  2140. return ok
  2141. def __setitem__(self, key, value):
  2142. ok, i = self.__probe(key)
  2143. if ok:
  2144. self._a[i][1] = value
  2145. else:
  2146. self._a[i] = [key, value]
  2147. self._len += 1
  2148. if self._len > self._capacity * 0.8:
  2149. self._capacity *= 2
  2150. self.__rehash()
  2151. def __delitem__(self, key):
  2152. ok, i = self.__probe(key)
  2153. if not ok:
  2154. raise KeyError(key)
  2155. self._a[i] = None
  2156. self._len -= 1
  2157. def __rehash(self):
  2158. old_a = self._a
  2159. self._a = [None] * self._capacity
  2160. self._len = 0
  2161. for kv in old_a:
  2162. if kv is not None:
  2163. self[kv[0]] = kv[1]
  2164. def keys(self):
  2165. return [kv[0] for kv in self._a if kv is not None]
  2166. def values(self):
  2167. return [kv[1] for kv in self._a if kv is not None]
  2168. def items(self):
  2169. return [kv for kv in self._a if kv is not None]
  2170. def clear(self):
  2171. self._a = [None] * self._capacity
  2172. self._len = 0
  2173. def update(self, other):
  2174. for k, v in other.items():
  2175. self[k] = v
  2176. def copy(self):
  2177. d = dict()
  2178. for kv in self._a:
  2179. if kv is not None:
  2180. d[kv[0]] = kv[1]
  2181. return d
  2182. def __repr__(self):
  2183. a = [repr(k)+': '+repr(v) for k,v in self.items()]
  2184. return '{'+ ', '.join(a) + '}'
  2185. def __json__(self):
  2186. a = []
  2187. for k,v in self.items():
  2188. if type(k) is not str:
  2189. raise TypeError('json keys must be strings, got ' + repr(k) )
  2190. a.append(k.__json__()+': '+v.__json__())
  2191. return '{'+ ', '.join(a) + '}'
  2192. class set:
  2193. def __init__(self, iterable=None):
  2194. iterable = iterable or []
  2195. self._a = dict()
  2196. for item in iterable:
  2197. self.add(item)
  2198. def add(self, elem):
  2199. self._a[elem] = None
  2200. def discard(self, elem):
  2201. if elem in self._a:
  2202. del self._a[elem]
  2203. def remove(self, elem):
  2204. del self._a[elem]
  2205. def clear(self):
  2206. self._a.clear()
  2207. def update(self,other):
  2208. for elem in other:
  2209. self.add(elem)
  2210. return self
  2211. def __len__(self):
  2212. return len(self._a)
  2213. def copy(self):
  2214. return set(self._a.keys())
  2215. def __and__(self, other):
  2216. ret = set()
  2217. for elem in self:
  2218. if elem in other:
  2219. ret.add(elem)
  2220. return ret
  2221. def __or__(self, other):
  2222. ret = self.copy()
  2223. for elem in other:
  2224. ret.add(elem)
  2225. return ret
  2226. def __sub__(self, other):
  2227. ret = set()
  2228. for elem in self:
  2229. if elem not in other:
  2230. ret.add(elem)
  2231. return ret
  2232. def __xor__(self, other):
  2233. ret = set()
  2234. for elem in self:
  2235. if elem not in other:
  2236. ret.add(elem)
  2237. for elem in other:
  2238. if elem not in self:
  2239. ret.add(elem)
  2240. return ret
  2241. def union(self, other):
  2242. return self | other
  2243. def intersection(self, other):
  2244. return self & other
  2245. def difference(self, other):
  2246. return self - other
  2247. def symmetric_difference(self, other):
  2248. return self ^ other
  2249. def __eq__(self, other):
  2250. return self.__xor__(other).__len__() == 0
  2251. def __ne__(self, other):
  2252. return self.__xor__(other).__len__() != 0
  2253. def isdisjoint(self, other):
  2254. return self.__and__(other).__len__() == 0
  2255. def issubset(self, other):
  2256. return self.__sub__(other).__len__() == 0
  2257. def issuperset(self, other):
  2258. return other.__sub__(self).__len__() == 0
  2259. def __contains__(self, elem):
  2260. return elem in self._a
  2261. def __repr__(self):
  2262. if len(self) == 0:
  2263. return 'set()'
  2264. return '{'+ ', '.join(self._a.keys()) + '}'
  2265. def __iter__(self):
  2266. return self._a.keys().__iter__()
  2267. )";
  2268. const char* __RANDOM_CODE = R"(
  2269. import time as _time
  2270. __all__ = ['Random', 'seed', 'random', 'randint', 'uniform']
  2271. def _int32(x):
  2272. return int(0xffffffff & x)
  2273. class Random:
  2274. def __init__(self, seed=None):
  2275. if seed is None:
  2276. seed = int(_time.time() * 1000000)
  2277. seed = _int32(seed)
  2278. self.mt = [0] * 624
  2279. self.mt[0] = seed
  2280. self.mti = 0
  2281. for i in range(1, 624):
  2282. self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i)
  2283. def extract_number(self):
  2284. if self.mti == 0:
  2285. self.twist()
  2286. y = self.mt[self.mti]
  2287. y = y ^ y >> 11
  2288. y = y ^ y << 7 & 2636928640
  2289. y = y ^ y << 15 & 4022730752
  2290. y = y ^ y >> 18
  2291. self.mti = (self.mti + 1) % 624
  2292. return _int32(y)
  2293. def twist(self):
  2294. for i in range(0, 624):
  2295. y = _int32((self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff))
  2296. self.mt[i] = (y >> 1) ^ self.mt[(i + 397) % 624]
  2297. if y % 2 != 0:
  2298. self.mt[i] = self.mt[i] ^ 0x9908b0df
  2299. def seed(self, x):
  2300. assert type(x) is int
  2301. self.mt = [0] * 624
  2302. self.mt[0] = _int32(x)
  2303. self.mti = 0
  2304. for i in range(1, 624):
  2305. self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i)
  2306. def random(self):
  2307. return self.extract_number() / 2 ** 32
  2308. def randint(self, a, b):
  2309. assert type(a) is int and type(b) is int
  2310. assert a <= b
  2311. return int(self.random() * (b - a + 1)) + a
  2312. def uniform(self, a, b):
  2313. assert type(a) is int or type(a) is float
  2314. assert type(b) is int or type(b) is float
  2315. if a > b:
  2316. a, b = b, a
  2317. return self.random() * (b - a) + a
  2318. def shuffle(self, L):
  2319. for i in range(len(L)):
  2320. j = self.randint(i, len(L) - 1)
  2321. L[i], L[j] = L[j], L[i]
  2322. def choice(self, L):
  2323. return L[self.randint(0, len(L) - 1)]
  2324. _inst = Random()
  2325. seed = _inst.seed
  2326. random = _inst.random
  2327. randint = _inst.randint
  2328. uniform = _inst.uniform
  2329. shuffle = _inst.shuffle
  2330. choice = _inst.choice
  2331. )";
  2332. class NeedMoreLines {
  2333. public:
  2334. NeedMoreLines(bool isClassDef) : isClassDef(isClassDef) {}
  2335. bool isClassDef;
  2336. };
  2337. enum CompileMode {
  2338. EXEC_MODE,
  2339. EVAL_MODE,
  2340. SINGLE_MODE, // for REPL
  2341. JSON_MODE,
  2342. };
  2343. struct SourceMetadata {
  2344. const char* source;
  2345. _Str filename;
  2346. std::vector<const char*> lineStarts;
  2347. CompileMode mode;
  2348. std::pair<const char*,const char*> getLine(int lineno) const {
  2349. if(lineno == -1) return {nullptr, nullptr};
  2350. lineno -= 1;
  2351. if(lineno < 0) lineno = 0;
  2352. const char* _start = lineStarts.at(lineno);
  2353. const char* i = _start;
  2354. while(*i != '\n' && *i != '\0') i++;
  2355. return {_start, i};
  2356. }
  2357. SourceMetadata(const char* source, _Str filename, CompileMode mode) {
  2358. source = strdup(source);
  2359. // Skip utf8 BOM if there is any.
  2360. if (strncmp(source, "\xEF\xBB\xBF", 3) == 0) source += 3;
  2361. this->filename = filename;
  2362. this->source = source;
  2363. lineStarts.push_back(source);
  2364. this->mode = mode;
  2365. }
  2366. _Str snapshot(int lineno, const char* cursor=nullptr){
  2367. _StrStream ss;
  2368. ss << " " << "File \"" << filename << "\", line " << lineno << '\n';
  2369. std::pair<const char*,const char*> pair = getLine(lineno);
  2370. _Str line = "<?>";
  2371. int removedSpaces = 0;
  2372. if(pair.first && pair.second){
  2373. line = _Str(pair.first, pair.second-pair.first).__lstrip();
  2374. removedSpaces = pair.second - pair.first - line.size();
  2375. if(line.empty()) line = "<?>";
  2376. }
  2377. ss << " " << line << '\n';
  2378. if(cursor && line != "<?>" && cursor >= pair.first && cursor <= pair.second){
  2379. auto column = cursor - pair.first - removedSpaces;
  2380. if(column >= 0){
  2381. ss << " " << std::string(column, ' ') << "^\n";
  2382. }
  2383. }
  2384. return ss.str();
  2385. }
  2386. ~SourceMetadata(){
  2387. free((void*)source);
  2388. }
  2389. };
  2390. typedef pkpy::shared_ptr<SourceMetadata> _Source;
  2391. class _Error : public std::exception {
  2392. private:
  2393. _Str _what;
  2394. public:
  2395. _Error(_Str type, _Str msg, _Str desc){
  2396. _what = desc + type + ": " + msg;
  2397. }
  2398. const char* what() const noexcept override {
  2399. return _what.c_str();
  2400. }
  2401. };
  2402. class CompileError : public _Error {
  2403. public:
  2404. CompileError(_Str type, _Str msg, _Str snapshot)
  2405. : _Error(type, msg, snapshot) {}
  2406. };
  2407. class RuntimeError : public _Error {
  2408. private:
  2409. static _Str __concat(std::stack<_Str> snapshots){
  2410. _StrStream ss;
  2411. ss << "Traceback (most recent call last):" << '\n';
  2412. while(!snapshots.empty()){
  2413. ss << snapshots.top();
  2414. snapshots.pop();
  2415. }
  2416. return ss.str();
  2417. }
  2418. public:
  2419. RuntimeError(_Str type, _Str msg, const std::stack<_Str>& snapshots)
  2420. : _Error(type, msg, __concat(snapshots)) {}
  2421. };
  2422. struct CodeObject;
  2423. struct BaseRef;
  2424. class VM;
  2425. class Frame;
  2426. //typedef PyVar (*_CppFuncRaw)(VM*, const pkpy::ArgList&);
  2427. typedef std::function<PyVar(VM*, const pkpy::ArgList&)> _CppFuncRaw;
  2428. typedef pkpy::shared_ptr<CodeObject> _Code;
  2429. struct _CppFunc {
  2430. _CppFuncRaw f;
  2431. int argc; // DONOT include self
  2432. bool method;
  2433. _CppFunc(_CppFuncRaw f, int argc, bool method) : f(f), argc(argc), method(method) {}
  2434. inline PyVar operator()(VM* vm, const pkpy::ArgList& args) const;
  2435. };
  2436. struct Function {
  2437. _Str name;
  2438. _Code code;
  2439. std::vector<_Str> args;
  2440. _Str starredArg; // empty if no *arg
  2441. PyVarDict kwArgs; // empty if no k=v
  2442. std::vector<_Str> kwArgsOrder;
  2443. bool hasName(const _Str& val) const {
  2444. bool _0 = std::find(args.begin(), args.end(), val) != args.end();
  2445. bool _1 = starredArg == val;
  2446. bool _2 = kwArgs.find(val) != kwArgs.end();
  2447. return _0 || _1 || _2;
  2448. }
  2449. };
  2450. struct _BoundMethod {
  2451. PyVar obj;
  2452. PyVar method;
  2453. };
  2454. struct _Range {
  2455. i64 start = 0;
  2456. i64 stop = -1;
  2457. i64 step = 1;
  2458. };
  2459. struct _Slice {
  2460. int start = 0;
  2461. int stop = 0x7fffffff;
  2462. void normalize(int len){
  2463. if(start < 0) start += len;
  2464. if(stop < 0) stop += len;
  2465. if(start < 0) start = 0;
  2466. if(stop > len) stop = len;
  2467. }
  2468. };
  2469. class BaseIterator {
  2470. protected:
  2471. VM* vm;
  2472. PyVar _ref; // keep a reference to the object so it will not be deleted while iterating
  2473. public:
  2474. virtual PyVar next() = 0;
  2475. virtual bool hasNext() = 0;
  2476. PyVarRef var;
  2477. BaseIterator(VM* vm, PyVar _ref) : vm(vm), _ref(_ref) {}
  2478. virtual ~BaseIterator() = default;
  2479. };
  2480. typedef pkpy::shared_ptr<Function> _Func;
  2481. typedef pkpy::shared_ptr<BaseIterator> _Iterator;
  2482. struct PyObject {
  2483. PyVar _type;
  2484. PyVarDict attribs;
  2485. inline bool is_type(const PyVar& type) const noexcept{ return this->_type == type; }
  2486. inline virtual void* value() = 0;
  2487. PyObject(const PyVar& type) : _type(type) {}
  2488. virtual ~PyObject() = default;
  2489. };
  2490. template <typename T>
  2491. struct Py_ : PyObject {
  2492. T _valueT;
  2493. Py_(T val, const PyVar& type) : PyObject(type), _valueT(val) {}
  2494. virtual void* value() override { return &_valueT; }
  2495. };
  2496. #define UNION_GET(T, obj) (((Py_<T>*)((obj).get()))->_valueT)
  2497. #define UNION_NAME(obj) UNION_GET(_Str, (obj)->attribs[__name__])
  2498. #define UNION_TP_NAME(obj) UNION_GET(_Str, (obj)->_type->attribs[__name__])
  2499. class RangeIterator : public BaseIterator {
  2500. private:
  2501. i64 current;
  2502. _Range r;
  2503. public:
  2504. RangeIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
  2505. this->r = UNION_GET(_Range, _ref);
  2506. this->current = r.start;
  2507. }
  2508. bool hasNext() override {
  2509. if(r.step > 0){
  2510. return current < r.stop;
  2511. }else{
  2512. return current > r.stop;
  2513. }
  2514. }
  2515. PyVar next() override;
  2516. };
  2517. class VectorIterator : public BaseIterator {
  2518. private:
  2519. size_t index = 0;
  2520. const PyVarList* vec;
  2521. public:
  2522. VectorIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
  2523. vec = &UNION_GET(PyVarList, _ref);
  2524. }
  2525. bool hasNext(){
  2526. return index < vec->size();
  2527. }
  2528. PyVar next(){
  2529. return vec->operator[](index++);
  2530. }
  2531. };
  2532. class StringIterator : public BaseIterator {
  2533. private:
  2534. int index = 0;
  2535. _Str str;
  2536. public:
  2537. StringIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
  2538. str = UNION_GET(_Str, _ref);
  2539. }
  2540. bool hasNext(){
  2541. return index < str.u8_length();
  2542. }
  2543. PyVar next();
  2544. };
  2545. typedef uint8_t _TokenType;
  2546. constexpr const char* __TOKENS[] = {
  2547. "@error", "@eof", "@eol", "@sof",
  2548. ".", ",", ":", ";", "#", "(", ")", "[", "]", "{", "}", "%",
  2549. "+", "-", "*", "/", "//", "**", "=", ">", "<", "...", "->",
  2550. "<<", ">>", "&", "|", "^", "?",
  2551. "==", "!=", ">=", "<=",
  2552. "+=", "-=", "*=", "/=", "//=", "%=", "&=", "|=", "^=",
  2553. /** KW_BEGIN **/
  2554. "class", "import", "as", "def", "lambda", "pass", "del", "from", "with",
  2555. "None", "in", "is", "and", "or", "not", "True", "False", "global", "try", "except", "finally",
  2556. "goto", "label", // extended keywords, not available in cpython
  2557. "while", "for", "if", "elif", "else", "break", "continue", "return", "assert", "raise",
  2558. /** KW_END **/
  2559. "is not", "not in",
  2560. "@id", "@num", "@str", "@fstr",
  2561. "@indent", "@dedent"
  2562. };
  2563. const _TokenType __TOKENS_LEN = sizeof(__TOKENS) / sizeof(__TOKENS[0]);
  2564. constexpr _TokenType TK(const char* const token) {
  2565. for(int k=0; k<__TOKENS_LEN; k++){
  2566. const char* i = __TOKENS[k];
  2567. const char* j = token;
  2568. while(*i && *j && *i == *j) { i++; j++;}
  2569. if(*i == *j) return k;
  2570. }
  2571. return 0;
  2572. }
  2573. #define TK_STR(t) __TOKENS[t]
  2574. const _TokenType __KW_BEGIN = TK("class");
  2575. const _TokenType __KW_END = TK("raise");
  2576. const emhash8::HashMap<std::string_view, _TokenType> __KW_MAP = [](){
  2577. emhash8::HashMap<std::string_view, _TokenType> map;
  2578. for(int k=__KW_BEGIN; k<=__KW_END; k++) map[__TOKENS[k]] = k;
  2579. return map;
  2580. }();
  2581. struct Token{
  2582. _TokenType type;
  2583. const char* start; //< Begining of the token in the source.
  2584. int length; //< Number of chars of the token.
  2585. int line; //< Line number of the token (1 based).
  2586. PyVar value; //< Literal value of the token.
  2587. const _Str str() const { return _Str(start, length);}
  2588. const _Str info() const {
  2589. _StrStream ss;
  2590. _Str raw = str();
  2591. if (raw == _Str("\n")) raw = "\\n";
  2592. ss << line << ": " << TK_STR(type) << " '" << raw << "'";
  2593. return ss.str();
  2594. }
  2595. };
  2596. enum Precedence {
  2597. PREC_NONE,
  2598. PREC_ASSIGNMENT, // =
  2599. PREC_COMMA, // ,
  2600. PREC_TERNARY, // ?:
  2601. PREC_LOGICAL_OR, // or
  2602. PREC_LOGICAL_AND, // and
  2603. PREC_EQUALITY, // == !=
  2604. PREC_TEST, // in is
  2605. PREC_COMPARISION, // < > <= >=
  2606. PREC_BITWISE_OR, // |
  2607. PREC_BITWISE_XOR, // ^
  2608. PREC_BITWISE_AND, // &
  2609. PREC_BITWISE_SHIFT, // << >>
  2610. PREC_TERM, // + -
  2611. PREC_FACTOR, // * / % //
  2612. PREC_UNARY, // - not
  2613. PREC_EXPONENT, // **
  2614. PREC_CALL, // ()
  2615. PREC_SUBSCRIPT, // []
  2616. PREC_ATTRIB, // .index
  2617. PREC_PRIMARY,
  2618. };
  2619. // The context of the parsing phase for the compiler.
  2620. struct Parser {
  2621. _Source src;
  2622. const char* token_start;
  2623. const char* curr_char;
  2624. int current_line = 1;
  2625. Token prev, curr;
  2626. std::queue<Token> nexts;
  2627. std::stack<int> indents;
  2628. int brackets_level = 0;
  2629. Token next_token(){
  2630. if(nexts.empty()){
  2631. return Token{TK("@error"), token_start, (int)(curr_char - token_start), current_line};
  2632. }
  2633. Token t = nexts.front();
  2634. if(t.type == TK("@eof") && indents.size()>1){
  2635. nexts.pop();
  2636. indents.pop();
  2637. return Token{TK("@dedent"), token_start, 0, current_line};
  2638. }
  2639. nexts.pop();
  2640. return t;
  2641. }
  2642. inline char peekchar() const{ return *curr_char; }
  2643. bool match_n_chars(int n, char c0){
  2644. const char* c = curr_char;
  2645. for(int i=0; i<n; i++){
  2646. if(*c == '\0') return false;
  2647. if(*c != c0) return false;
  2648. c++;
  2649. }
  2650. for(int i=0; i<n; i++) eatchar_include_newline();
  2651. return true;
  2652. }
  2653. int eat_spaces(){
  2654. int count = 0;
  2655. while (true) {
  2656. switch (peekchar()) {
  2657. case ' ' : count+=1; break;
  2658. case '\t': count+=4; break;
  2659. default: return count;
  2660. }
  2661. eatchar();
  2662. }
  2663. }
  2664. bool eat_indentation(){
  2665. if(brackets_level > 0) return true;
  2666. int spaces = eat_spaces();
  2667. if(peekchar() == '#') skip_line_comment();
  2668. if(peekchar() == '\0' || peekchar() == '\n') return true;
  2669. // https://docs.python.org/3/reference/lexical_analysis.html#indentation
  2670. if(spaces > indents.top()){
  2671. indents.push(spaces);
  2672. nexts.push(Token{TK("@indent"), token_start, 0, current_line});
  2673. } else if(spaces < indents.top()){
  2674. while(spaces < indents.top()){
  2675. indents.pop();
  2676. nexts.push(Token{TK("@dedent"), token_start, 0, current_line});
  2677. }
  2678. if(spaces != indents.top()){
  2679. return false;
  2680. }
  2681. }
  2682. return true;
  2683. }
  2684. char eatchar() {
  2685. char c = peekchar();
  2686. if(c == '\n') throw std::runtime_error("eatchar() cannot consume a newline");
  2687. curr_char++;
  2688. return c;
  2689. }
  2690. char eatchar_include_newline() {
  2691. char c = peekchar();
  2692. curr_char++;
  2693. if (c == '\n'){
  2694. current_line++;
  2695. src->lineStarts.push_back(curr_char);
  2696. }
  2697. return c;
  2698. }
  2699. int eat_name() {
  2700. curr_char--;
  2701. while(true){
  2702. uint8_t c = peekchar();
  2703. int u8bytes = 0;
  2704. if((c & 0b10000000) == 0b00000000) u8bytes = 1;
  2705. else if((c & 0b11100000) == 0b11000000) u8bytes = 2;
  2706. else if((c & 0b11110000) == 0b11100000) u8bytes = 3;
  2707. else if((c & 0b11111000) == 0b11110000) u8bytes = 4;
  2708. else return 1;
  2709. if(u8bytes == 1){
  2710. if(isalpha(c) || c=='_' || isdigit(c)) {
  2711. curr_char++;
  2712. continue;
  2713. }else{
  2714. break;
  2715. }
  2716. }
  2717. // handle multibyte char
  2718. std::string u8str(curr_char, u8bytes);
  2719. if(u8str.size() != u8bytes) return 2;
  2720. uint32_t value = 0;
  2721. for(int k=0; k < u8bytes; k++){
  2722. uint8_t b = u8str[k];
  2723. if(k==0){
  2724. if(u8bytes == 2) value = (b & 0b00011111) << 6;
  2725. else if(u8bytes == 3) value = (b & 0b00001111) << 12;
  2726. else if(u8bytes == 4) value = (b & 0b00000111) << 18;
  2727. }else{
  2728. value |= (b & 0b00111111) << (6*(u8bytes-k-1));
  2729. }
  2730. }
  2731. if(__isLoChar(value)) curr_char += u8bytes;
  2732. else break;
  2733. }
  2734. int length = (int)(curr_char - token_start);
  2735. if(length == 0) return 3;
  2736. std::string_view name(token_start, length);
  2737. if(src->mode == JSON_MODE){
  2738. if(name == "true"){
  2739. set_next_token(TK("True"));
  2740. } else if(name == "false"){
  2741. set_next_token(TK("False"));
  2742. } else if(name == "null"){
  2743. set_next_token(TK("None"));
  2744. } else {
  2745. return 4;
  2746. }
  2747. return 0;
  2748. }
  2749. if(__KW_MAP.count(name)){
  2750. if(name == "not"){
  2751. if(strncmp(curr_char, " in", 3) == 0){
  2752. curr_char += 3;
  2753. set_next_token(TK("not in"));
  2754. return 0;
  2755. }
  2756. }else if(name == "is"){
  2757. if(strncmp(curr_char, " not", 4) == 0){
  2758. curr_char += 4;
  2759. set_next_token(TK("is not"));
  2760. return 0;
  2761. }
  2762. }
  2763. set_next_token(__KW_MAP.at(name));
  2764. } else {
  2765. set_next_token(TK("@id"));
  2766. }
  2767. return 0;
  2768. }
  2769. void skip_line_comment() {
  2770. char c;
  2771. while ((c = peekchar()) != '\0') {
  2772. if (c == '\n') return;
  2773. eatchar();
  2774. }
  2775. }
  2776. // If the current char is [c] consume it and advance char by 1 and returns
  2777. // true otherwise returns false.
  2778. bool matchchar(char c) {
  2779. if (peekchar() != c) return false;
  2780. eatchar_include_newline();
  2781. return true;
  2782. }
  2783. // Initialize the next token as the type.
  2784. void set_next_token(_TokenType type, PyVar value=nullptr) {
  2785. switch(type){
  2786. case TK("{"): case TK("["): case TK("("): brackets_level++; break;
  2787. case TK(")"): case TK("]"): case TK("}"): brackets_level--; break;
  2788. }
  2789. nexts.push( Token{
  2790. type,
  2791. token_start,
  2792. (int)(curr_char - token_start),
  2793. current_line - ((type == TK("@eol")) ? 1 : 0),
  2794. value
  2795. });
  2796. }
  2797. void set_next_token_2(char c, _TokenType one, _TokenType two) {
  2798. if (matchchar(c)) set_next_token(two);
  2799. else set_next_token(one);
  2800. }
  2801. Parser(_Source src) {
  2802. this->src = src;
  2803. this->token_start = src->source;
  2804. this->curr_char = src->source;
  2805. this->nexts.push(Token{TK("@sof"), token_start, 0, current_line});
  2806. this->indents.push(0);
  2807. }
  2808. };
  2809. class Frame;
  2810. struct BaseRef {
  2811. virtual PyVar get(VM*, Frame*) const = 0;
  2812. virtual void set(VM*, Frame*, PyVar) const = 0;
  2813. virtual void del(VM*, Frame*) const = 0;
  2814. virtual ~BaseRef() = default;
  2815. };
  2816. enum NameScope {
  2817. NAME_LOCAL = 0,
  2818. NAME_GLOBAL = 1,
  2819. NAME_ATTR = 2,
  2820. };
  2821. struct NameRef : BaseRef {
  2822. const std::pair<_Str, NameScope>* pair;
  2823. NameRef(const std::pair<_Str, NameScope>& pair) : pair(&pair) {}
  2824. PyVar get(VM* vm, Frame* frame) const;
  2825. void set(VM* vm, Frame* frame, PyVar val) const;
  2826. void del(VM* vm, Frame* frame) const;
  2827. };
  2828. struct AttrRef : BaseRef {
  2829. mutable PyVar obj;
  2830. const NameRef attr;
  2831. AttrRef(PyVar obj, const NameRef attr) : obj(obj), attr(attr) {}
  2832. PyVar get(VM* vm, Frame* frame) const;
  2833. void set(VM* vm, Frame* frame, PyVar val) const;
  2834. void del(VM* vm, Frame* frame) const;
  2835. };
  2836. struct IndexRef : BaseRef {
  2837. mutable PyVar obj;
  2838. PyVar index;
  2839. IndexRef(PyVar obj, PyVar index) : obj(obj), index(index) {}
  2840. PyVar get(VM* vm, Frame* frame) const;
  2841. void set(VM* vm, Frame* frame, PyVar val) const;
  2842. void del(VM* vm, Frame* frame) const;
  2843. };
  2844. struct TupleRef : BaseRef {
  2845. PyVarList varRefs;
  2846. TupleRef(const PyVarList& varRefs) : varRefs(varRefs) {}
  2847. TupleRef(PyVarList&& varRefs) : varRefs(std::move(varRefs)) {}
  2848. PyVar get(VM* vm, Frame* frame) const;
  2849. void set(VM* vm, Frame* frame, PyVar val) const;
  2850. void del(VM* vm, Frame* frame) const;
  2851. };
  2852. enum Opcode {
  2853. #define OPCODE(name) OP_##name,
  2854. #ifdef OPCODE
  2855. OPCODE(NO_OP)
  2856. OPCODE(POP_TOP)
  2857. OPCODE(DUP_TOP)
  2858. OPCODE(CALL)
  2859. OPCODE(RETURN_VALUE)
  2860. OPCODE(BINARY_OP)
  2861. OPCODE(COMPARE_OP)
  2862. OPCODE(BITWISE_OP)
  2863. OPCODE(IS_OP)
  2864. OPCODE(CONTAINS_OP)
  2865. OPCODE(UNARY_NEGATIVE)
  2866. OPCODE(UNARY_NOT)
  2867. OPCODE(BUILD_LIST)
  2868. OPCODE(BUILD_MAP)
  2869. OPCODE(BUILD_SET)
  2870. OPCODE(BUILD_SLICE)
  2871. OPCODE(BUILD_CLASS)
  2872. OPCODE(BUILD_SMART_TUPLE)
  2873. OPCODE(BUILD_STRING)
  2874. OPCODE(LIST_APPEND)
  2875. OPCODE(IMPORT_NAME)
  2876. OPCODE(PRINT_EXPR)
  2877. OPCODE(GET_ITER)
  2878. OPCODE(FOR_ITER)
  2879. OPCODE(WITH_ENTER)
  2880. OPCODE(WITH_EXIT)
  2881. OPCODE(LOOP_BREAK)
  2882. OPCODE(LOOP_CONTINUE)
  2883. OPCODE(POP_JUMP_IF_FALSE)
  2884. OPCODE(JUMP_ABSOLUTE)
  2885. OPCODE(SAFE_JUMP_ABSOLUTE)
  2886. OPCODE(JUMP_IF_TRUE_OR_POP)
  2887. OPCODE(JUMP_IF_FALSE_OR_POP)
  2888. OPCODE(GOTO)
  2889. OPCODE(LOAD_CONST)
  2890. OPCODE(LOAD_NONE)
  2891. OPCODE(LOAD_TRUE)
  2892. OPCODE(LOAD_FALSE)
  2893. OPCODE(LOAD_EVAL_FN)
  2894. OPCODE(LOAD_LAMBDA)
  2895. OPCODE(LOAD_ELLIPSIS)
  2896. OPCODE(LOAD_NAME)
  2897. OPCODE(LOAD_NAME_REF)
  2898. OPCODE(ASSERT)
  2899. OPCODE(RAISE_ERROR)
  2900. OPCODE(BUILD_INDEX_REF)
  2901. OPCODE(BUILD_ATTR_REF)
  2902. OPCODE(STORE_NAME)
  2903. OPCODE(STORE_FUNCTION)
  2904. OPCODE(STORE_REF)
  2905. OPCODE(DELETE_REF)
  2906. #endif
  2907. #undef OPCODE
  2908. };
  2909. static const char* OP_NAMES[] = {
  2910. #define OPCODE(name) #name,
  2911. #ifdef OPCODE
  2912. OPCODE(NO_OP)
  2913. OPCODE(POP_TOP)
  2914. OPCODE(DUP_TOP)
  2915. OPCODE(CALL)
  2916. OPCODE(RETURN_VALUE)
  2917. OPCODE(BINARY_OP)
  2918. OPCODE(COMPARE_OP)
  2919. OPCODE(BITWISE_OP)
  2920. OPCODE(IS_OP)
  2921. OPCODE(CONTAINS_OP)
  2922. OPCODE(UNARY_NEGATIVE)
  2923. OPCODE(UNARY_NOT)
  2924. OPCODE(BUILD_LIST)
  2925. OPCODE(BUILD_MAP)
  2926. OPCODE(BUILD_SET)
  2927. OPCODE(BUILD_SLICE)
  2928. OPCODE(BUILD_CLASS)
  2929. OPCODE(BUILD_SMART_TUPLE)
  2930. OPCODE(BUILD_STRING)
  2931. OPCODE(LIST_APPEND)
  2932. OPCODE(IMPORT_NAME)
  2933. OPCODE(PRINT_EXPR)
  2934. OPCODE(GET_ITER)
  2935. OPCODE(FOR_ITER)
  2936. OPCODE(WITH_ENTER)
  2937. OPCODE(WITH_EXIT)
  2938. OPCODE(LOOP_BREAK)
  2939. OPCODE(LOOP_CONTINUE)
  2940. OPCODE(POP_JUMP_IF_FALSE)
  2941. OPCODE(JUMP_ABSOLUTE)
  2942. OPCODE(SAFE_JUMP_ABSOLUTE)
  2943. OPCODE(JUMP_IF_TRUE_OR_POP)
  2944. OPCODE(JUMP_IF_FALSE_OR_POP)
  2945. OPCODE(GOTO)
  2946. OPCODE(LOAD_CONST)
  2947. OPCODE(LOAD_NONE)
  2948. OPCODE(LOAD_TRUE)
  2949. OPCODE(LOAD_FALSE)
  2950. OPCODE(LOAD_EVAL_FN)
  2951. OPCODE(LOAD_LAMBDA)
  2952. OPCODE(LOAD_ELLIPSIS)
  2953. OPCODE(LOAD_NAME)
  2954. OPCODE(LOAD_NAME_REF)
  2955. OPCODE(ASSERT)
  2956. OPCODE(RAISE_ERROR)
  2957. OPCODE(BUILD_INDEX_REF)
  2958. OPCODE(BUILD_ATTR_REF)
  2959. OPCODE(STORE_NAME)
  2960. OPCODE(STORE_FUNCTION)
  2961. OPCODE(STORE_REF)
  2962. OPCODE(DELETE_REF)
  2963. #endif
  2964. #undef OPCODE
  2965. };
  2966. struct Bytecode{
  2967. uint8_t op;
  2968. int arg;
  2969. int line;
  2970. uint16_t block; // the block id of this bytecode
  2971. };
  2972. _Str pad(const _Str& s, const int n){
  2973. if(s.size() >= n) return s.substr(0, n);
  2974. return s + std::string(n - s.size(), ' ');
  2975. }
  2976. enum CodeBlockType {
  2977. NO_BLOCK,
  2978. FOR_LOOP,
  2979. WHILE_LOOP,
  2980. CONTEXT_MANAGER,
  2981. TRY_EXCEPT,
  2982. };
  2983. struct CodeBlock {
  2984. CodeBlockType type;
  2985. std::vector<int> id;
  2986. int parent; // parent index in co_blocks
  2987. int start; // start index of this block in co_code, inclusive
  2988. int end; // end index of this block in co_code, exclusive
  2989. std::string to_string() const {
  2990. if(parent == -1) return "";
  2991. std::string s = "[";
  2992. for(int i = 0; i < id.size(); i++){
  2993. s += std::to_string(id[i]);
  2994. if(i != id.size()-1) s += "-";
  2995. }
  2996. s += ": type=";
  2997. s += std::to_string(type);
  2998. s += "]";
  2999. return s;
  3000. }
  3001. bool operator==(const std::vector<int>& other) const{ return id == other; }
  3002. bool operator!=(const std::vector<int>& other) const{ return id != other; }
  3003. int depth() const{ return id.size(); }
  3004. };
  3005. struct CodeObject {
  3006. _Source src;
  3007. _Str name;
  3008. CodeObject(_Source src, _Str name) {
  3009. this->src = src;
  3010. this->name = name;
  3011. }
  3012. std::vector<Bytecode> co_code;
  3013. PyVarList co_consts;
  3014. std::vector<std::pair<_Str, NameScope>> co_names;
  3015. std::vector<_Str> co_global_names;
  3016. std::vector<CodeBlock> co_blocks = { CodeBlock{NO_BLOCK, {}, -1} };
  3017. // tmp variables
  3018. int _currBlockIndex = 0;
  3019. bool __isCurrBlockLoop() const {
  3020. return co_blocks[_currBlockIndex].type == FOR_LOOP || co_blocks[_currBlockIndex].type == WHILE_LOOP;
  3021. }
  3022. void __enterBlock(CodeBlockType type){
  3023. const CodeBlock& currBlock = co_blocks[_currBlockIndex];
  3024. std::vector<int> copy(currBlock.id);
  3025. copy.push_back(-1);
  3026. int t = 0;
  3027. while(true){
  3028. copy[copy.size()-1] = t;
  3029. auto it = std::find(co_blocks.begin(), co_blocks.end(), copy);
  3030. if(it == co_blocks.end()) break;
  3031. t++;
  3032. }
  3033. co_blocks.push_back(CodeBlock{type, copy, _currBlockIndex, (int)co_code.size()});
  3034. _currBlockIndex = co_blocks.size()-1;
  3035. }
  3036. void __exitBlock(){
  3037. co_blocks[_currBlockIndex].end = co_code.size();
  3038. _currBlockIndex = co_blocks[_currBlockIndex].parent;
  3039. if(_currBlockIndex < 0) UNREACHABLE();
  3040. }
  3041. // for goto use
  3042. // goto/label should be put at toplevel statements
  3043. emhash8::HashMap<_Str, int> co_labels;
  3044. void add_label(const _Str& label){
  3045. if(co_labels.find(label) != co_labels.end()){
  3046. _Str msg = "label '" + label + "' already exists";
  3047. throw std::runtime_error(msg.c_str());
  3048. }
  3049. co_labels[label] = co_code.size();
  3050. }
  3051. int add_name(_Str name, NameScope scope){
  3052. if(scope == NAME_LOCAL && std::find(co_global_names.begin(), co_global_names.end(), name) != co_global_names.end()){
  3053. scope = NAME_GLOBAL;
  3054. }
  3055. auto p = std::make_pair(name, scope);
  3056. for(int i=0; i<co_names.size(); i++){
  3057. if(co_names[i] == p) return i;
  3058. }
  3059. co_names.push_back(p);
  3060. return co_names.size() - 1;
  3061. }
  3062. int add_const(PyVar v){
  3063. co_consts.push_back(v);
  3064. return co_consts.size() - 1;
  3065. }
  3066. void optimize_level_1(){
  3067. for(int i=0; i<co_code.size(); i++){
  3068. if(co_code[i].op >= OP_BINARY_OP && co_code[i].op <= OP_CONTAINS_OP){
  3069. for(int j=0; j<2; j++){
  3070. Bytecode& bc = co_code[i-j-1];
  3071. if(bc.op >= OP_LOAD_CONST && bc.op <= OP_LOAD_NAME_REF){
  3072. if(bc.op == OP_LOAD_NAME_REF){
  3073. bc.op = OP_LOAD_NAME;
  3074. }
  3075. }else{
  3076. break;
  3077. }
  3078. }
  3079. }else if(co_code[i].op == OP_CALL){
  3080. int ARGC = co_code[i].arg & 0xFFFF;
  3081. int KWARGC = (co_code[i].arg >> 16) & 0xFFFF;
  3082. if(KWARGC != 0) continue;
  3083. for(int j=0; j<ARGC+1; j++){
  3084. Bytecode& bc = co_code[i-j-1];
  3085. if(bc.op >= OP_LOAD_CONST && bc.op <= OP_LOAD_NAME_REF){
  3086. if(bc.op == OP_LOAD_NAME_REF){
  3087. bc.op = OP_LOAD_NAME;
  3088. }
  3089. }else{
  3090. break;
  3091. }
  3092. }
  3093. }
  3094. }
  3095. }
  3096. void optimize(int level=1){
  3097. optimize_level_1();
  3098. }
  3099. };
  3100. class Frame {
  3101. private:
  3102. std::vector<PyVar> s_data;
  3103. int ip = -1;
  3104. int next_ip = 0;
  3105. public:
  3106. const _Code code;
  3107. PyVar _module;
  3108. pkpy::shared_ptr<PyVarDict> _locals;
  3109. inline PyVarDict& f_locals() noexcept { return *_locals; }
  3110. inline PyVarDict& f_globals() noexcept { return _module->attribs; }
  3111. Frame(const _Code code, PyVar _module, pkpy::shared_ptr<PyVarDict> _locals)
  3112. : code(code), _module(_module), _locals(_locals) {
  3113. }
  3114. inline const Bytecode& next_bytecode() {
  3115. ip = next_ip;
  3116. next_ip = ip + 1;
  3117. return code->co_code[ip];
  3118. }
  3119. _Str curr_snapshot(){
  3120. int line = code->co_code[ip].line;
  3121. return code->src->snapshot(line);
  3122. }
  3123. inline int stack_size() const{ return s_data.size(); }
  3124. inline bool has_next_bytecode() const{ return next_ip < code->co_code.size(); }
  3125. inline PyVar pop(){
  3126. if(s_data.empty()) throw std::runtime_error("s_data.empty() is true");
  3127. PyVar v = std::move(s_data.back());
  3128. s_data.pop_back();
  3129. return v;
  3130. }
  3131. inline void __pop(){
  3132. if(s_data.empty()) throw std::runtime_error("s_data.empty() is true");
  3133. s_data.pop_back();
  3134. }
  3135. inline void try_deref(VM*, PyVar&);
  3136. inline PyVar pop_value(VM* vm){
  3137. PyVar value = pop();
  3138. try_deref(vm, value);
  3139. return value;
  3140. }
  3141. inline PyVar top_value(VM* vm){
  3142. PyVar value = top();
  3143. try_deref(vm, value);
  3144. return value;
  3145. }
  3146. inline PyVar& top(){
  3147. if(s_data.empty()) throw std::runtime_error("s_data.empty() is true");
  3148. return s_data.back();
  3149. }
  3150. inline PyVar top_value_offset(VM* vm, int n){
  3151. PyVar value = s_data[s_data.size() + n];
  3152. try_deref(vm, value);
  3153. return value;
  3154. }
  3155. template<typename T>
  3156. inline void push(T&& obj){ s_data.push_back(std::forward<T>(obj)); }
  3157. inline void jump_abs(int i){ next_ip = i; }
  3158. void jump_abs_safe(int target){
  3159. const Bytecode& prev = code->co_code[ip];
  3160. int i = prev.block;
  3161. next_ip = target;
  3162. if(next_ip >= code->co_code.size()){
  3163. while(i>=0){
  3164. if(code->co_blocks[i].type == FOR_LOOP) pop();
  3165. i = code->co_blocks[i].parent;
  3166. }
  3167. }else{
  3168. const Bytecode& next = code->co_code[target];
  3169. while(i>=0 && i!=next.block){
  3170. if(code->co_blocks[i].type == FOR_LOOP) pop();
  3171. i = code->co_blocks[i].parent;
  3172. }
  3173. if(i!=next.block) throw std::runtime_error("invalid jump");
  3174. }
  3175. }
  3176. pkpy::ArgList pop_n_values_reversed(VM* vm, int n){
  3177. int new_size = s_data.size() - n;
  3178. if(new_size < 0) throw std::runtime_error("stack_size() < n");
  3179. pkpy::ArgList v(n);
  3180. for(int i=n-1; i>=0; i--){
  3181. v[i] = std::move(s_data[new_size + i]);
  3182. try_deref(vm, v[i]);
  3183. }
  3184. s_data.resize(new_size);
  3185. return v;
  3186. }
  3187. pkpy::ArgList pop_n_reversed(int n){
  3188. pkpy::ArgList v(n);
  3189. for(int i=n-1; i>=0; i--) v[i] = pop();
  3190. return v;
  3191. }
  3192. };
  3193. #define __DEF_PY_AS_C(type, ctype, ptype) \
  3194. inline ctype& Py##type##_AS_C(const PyVar& obj) { \
  3195. check_type(obj, ptype); \
  3196. return UNION_GET(ctype, obj); \
  3197. }
  3198. #define __DEF_PY(type, ctype, ptype) \
  3199. inline PyVar Py##type(ctype value) { \
  3200. return new_object(ptype, value); \
  3201. }
  3202. #define DEF_NATIVE(type, ctype, ptype) \
  3203. __DEF_PY(type, ctype, ptype) \
  3204. __DEF_PY_AS_C(type, ctype, ptype)
  3205. class VM {
  3206. std::vector<PyVar> _small_integers; // [-5, 256]
  3207. protected:
  3208. std::deque< std::unique_ptr<Frame> > callstack;
  3209. PyVar __py2py_call_signal;
  3210. PyVar run_frame(Frame* frame){
  3211. while(frame->has_next_bytecode()){
  3212. const Bytecode& byte = frame->next_bytecode();
  3213. //printf("[%d] %s (%d)\n", frame->stack_size(), OP_NAMES[byte.op], byte.arg);
  3214. //printf("%s\n", frame->code->src->getLine(byte.line).c_str());
  3215. switch (byte.op)
  3216. {
  3217. case OP_NO_OP: break; // do nothing
  3218. case OP_LOAD_CONST: frame->push(frame->code->co_consts[byte.arg]); break;
  3219. case OP_LOAD_LAMBDA: {
  3220. PyVar obj = frame->code->co_consts[byte.arg];
  3221. setattr(obj, __module__, frame->_module);
  3222. frame->push(obj);
  3223. } break;
  3224. case OP_LOAD_NAME_REF: {
  3225. frame->push(PyRef(NameRef(frame->code->co_names[byte.arg])));
  3226. } break;
  3227. case OP_LOAD_NAME: {
  3228. frame->push(NameRef(frame->code->co_names[byte.arg]).get(this, frame));
  3229. } break;
  3230. case OP_STORE_NAME: {
  3231. const auto& p = frame->code->co_names[byte.arg];
  3232. NameRef(p).set(this, frame, frame->pop_value(this));
  3233. } break;
  3234. case OP_BUILD_ATTR_REF: {
  3235. const auto& attr = frame->code->co_names[byte.arg];
  3236. PyVar obj = frame->pop_value(this);
  3237. frame->push(PyRef(AttrRef(obj, NameRef(attr))));
  3238. } break;
  3239. case OP_BUILD_INDEX_REF: {
  3240. PyVar index = frame->pop_value(this);
  3241. PyVarRef obj = frame->pop_value(this);
  3242. frame->push(PyRef(IndexRef(obj, index)));
  3243. } break;
  3244. case OP_STORE_REF: {
  3245. PyVar obj = frame->pop_value(this);
  3246. PyVarRef r = frame->pop();
  3247. PyRef_AS_C(r)->set(this, frame, std::move(obj));
  3248. } break;
  3249. case OP_DELETE_REF: {
  3250. PyVarRef r = frame->pop();
  3251. PyRef_AS_C(r)->del(this, frame);
  3252. } break;
  3253. case OP_BUILD_SMART_TUPLE:
  3254. {
  3255. pkpy::ArgList items = frame->pop_n_reversed(byte.arg);
  3256. bool done = false;
  3257. for(int i=0; i<items.size(); i++){
  3258. if(!items[i]->is_type(_tp_ref)) {
  3259. done = true;
  3260. PyVarList values = items.toList();
  3261. for(int j=i; j<values.size(); j++) frame->try_deref(this, values[j]);
  3262. frame->push(PyTuple(values));
  3263. break;
  3264. }
  3265. }
  3266. if(done) break;
  3267. frame->push(PyRef(TupleRef(items.toList())));
  3268. } break;
  3269. case OP_BUILD_STRING:
  3270. {
  3271. pkpy::ArgList items = frame->pop_n_values_reversed(this, byte.arg);
  3272. _StrStream ss;
  3273. for(int i=0; i<items.size(); i++) ss << PyStr_AS_C(asStr(items[i]));
  3274. frame->push(PyStr(ss.str()));
  3275. } break;
  3276. case OP_LOAD_EVAL_FN: {
  3277. frame->push(builtins->attribs[m_eval]);
  3278. } break;
  3279. case OP_LIST_APPEND: {
  3280. pkpy::ArgList args(2);
  3281. args[1] = frame->pop_value(this); // obj
  3282. args[0] = frame->top_value_offset(this, -2); // list
  3283. fast_call(m_append, std::move(args));
  3284. } break;
  3285. case OP_STORE_FUNCTION:
  3286. {
  3287. PyVar obj = frame->pop_value(this);
  3288. const _Func& fn = PyFunction_AS_C(obj);
  3289. setattr(obj, __module__, frame->_module);
  3290. frame->f_globals()[fn->name] = obj;
  3291. } break;
  3292. case OP_BUILD_CLASS:
  3293. {
  3294. const _Str& clsName = frame->code->co_names[byte.arg].first;
  3295. PyVar clsBase = frame->pop_value(this);
  3296. if(clsBase == None) clsBase = _tp_object;
  3297. check_type(clsBase, _tp_type);
  3298. PyVar cls = new_user_type_object(frame->_module, clsName, clsBase);
  3299. while(true){
  3300. PyVar fn = frame->pop_value(this);
  3301. if(fn == None) break;
  3302. const _Func& f = PyFunction_AS_C(fn);
  3303. setattr(fn, __module__, frame->_module);
  3304. setattr(cls, f->name, fn);
  3305. }
  3306. } break;
  3307. case OP_RETURN_VALUE: return frame->pop_value(this);
  3308. case OP_PRINT_EXPR:
  3309. {
  3310. const PyVar expr = frame->top_value(this);
  3311. if(expr == None) break;
  3312. *_stdout << PyStr_AS_C(asRepr(expr)) << '\n';
  3313. } break;
  3314. case OP_POP_TOP: frame->__pop(); break;
  3315. case OP_BINARY_OP:
  3316. {
  3317. pkpy::ArgList args(2);
  3318. args[1] = frame->pop_value(this);
  3319. args[0] = frame->top_value(this);
  3320. frame->top() = fast_call(BINARY_SPECIAL_METHODS[byte.arg], std::move(args));
  3321. } break;
  3322. case OP_BITWISE_OP:
  3323. {
  3324. frame->push(
  3325. fast_call(BITWISE_SPECIAL_METHODS[byte.arg],
  3326. frame->pop_n_values_reversed(this, 2))
  3327. );
  3328. } break;
  3329. case OP_COMPARE_OP:
  3330. {
  3331. pkpy::ArgList args(2);
  3332. args[1] = frame->pop_value(this);
  3333. args[0] = frame->top_value(this);
  3334. frame->top() = fast_call(CMP_SPECIAL_METHODS[byte.arg], std::move(args));
  3335. } break;
  3336. case OP_IS_OP:
  3337. {
  3338. PyVar rhs = frame->pop_value(this);
  3339. bool ret_c = rhs == frame->top_value(this);
  3340. if(byte.arg == 1) ret_c = !ret_c;
  3341. frame->top() = PyBool(ret_c);
  3342. } break;
  3343. case OP_CONTAINS_OP:
  3344. {
  3345. PyVar rhs = frame->pop_value(this);
  3346. bool ret_c = PyBool_AS_C(call(rhs, __contains__, pkpy::oneArg(frame->pop_value(this))));
  3347. if(byte.arg == 1) ret_c = !ret_c;
  3348. frame->push(PyBool(ret_c));
  3349. } break;
  3350. case OP_UNARY_NEGATIVE:
  3351. frame->top() = num_negated(frame->top_value(this));
  3352. break;
  3353. case OP_UNARY_NOT:
  3354. {
  3355. PyVar obj = frame->pop_value(this);
  3356. const PyVar& obj_bool = asBool(obj);
  3357. frame->push(PyBool(!PyBool_AS_C(obj_bool)));
  3358. } break;
  3359. case OP_POP_JUMP_IF_FALSE:
  3360. if(!PyBool_AS_C(asBool(frame->pop_value(this)))) frame->jump_abs(byte.arg);
  3361. break;
  3362. case OP_LOAD_NONE: frame->push(None); break;
  3363. case OP_LOAD_TRUE: frame->push(True); break;
  3364. case OP_LOAD_FALSE: frame->push(False); break;
  3365. case OP_LOAD_ELLIPSIS: frame->push(Ellipsis); break;
  3366. case OP_ASSERT:
  3367. {
  3368. PyVar expr = frame->pop_value(this);
  3369. if(asBool(expr) != True) _error("AssertionError", "");
  3370. } break;
  3371. case OP_RAISE_ERROR:
  3372. {
  3373. _Str msg = PyStr_AS_C(asRepr(frame->pop_value(this)));
  3374. _Str type = PyStr_AS_C(frame->pop_value(this));
  3375. _error(type, msg);
  3376. } break;
  3377. case OP_BUILD_LIST:
  3378. {
  3379. frame->push(PyList(
  3380. frame->pop_n_values_reversed(this, byte.arg).toList()
  3381. ));
  3382. } break;
  3383. case OP_BUILD_MAP:
  3384. {
  3385. pkpy::ArgList items = frame->pop_n_values_reversed(this, byte.arg*2);
  3386. PyVar obj = call(builtins->attribs["dict"]);
  3387. for(int i=0; i<items.size(); i+=2){
  3388. call(obj, __setitem__, pkpy::twoArgs(items[i], items[i+1]));
  3389. }
  3390. frame->push(obj);
  3391. } break;
  3392. case OP_BUILD_SET:
  3393. {
  3394. PyVar list = PyList(
  3395. frame->pop_n_values_reversed(this, byte.arg).toList()
  3396. );
  3397. PyVar obj = call(builtins->attribs["set"], pkpy::oneArg(list));
  3398. frame->push(obj);
  3399. } break;
  3400. case OP_DUP_TOP: frame->push(frame->top_value(this)); break;
  3401. case OP_CALL:
  3402. {
  3403. int ARGC = byte.arg & 0xFFFF;
  3404. int KWARGC = (byte.arg >> 16) & 0xFFFF;
  3405. pkpy::ArgList kwargs(0);
  3406. if(KWARGC > 0) kwargs = frame->pop_n_values_reversed(this, KWARGC*2);
  3407. pkpy::ArgList args = frame->pop_n_values_reversed(this, ARGC);
  3408. PyVar callable = frame->pop_value(this);
  3409. PyVar ret = call(callable, std::move(args), kwargs, true);
  3410. if(ret == __py2py_call_signal) return ret;
  3411. frame->push(std::move(ret));
  3412. } break;
  3413. case OP_JUMP_ABSOLUTE: frame->jump_abs(byte.arg); break;
  3414. case OP_SAFE_JUMP_ABSOLUTE: frame->jump_abs_safe(byte.arg); break;
  3415. case OP_GOTO: {
  3416. PyVar obj = frame->pop_value(this);
  3417. const _Str& label = PyStr_AS_C(obj);
  3418. int* target = frame->code->co_labels.try_get(label);
  3419. if(target == nullptr){
  3420. _error("KeyError", "label '" + label + "' not found");
  3421. }
  3422. frame->jump_abs_safe(*target);
  3423. } break;
  3424. case OP_GET_ITER:
  3425. {
  3426. PyVar obj = frame->pop_value(this);
  3427. PyVarOrNull iter_fn = getattr(obj, __iter__, false);
  3428. if(iter_fn != nullptr){
  3429. PyVar tmp = call(iter_fn);
  3430. PyVarRef var = frame->pop();
  3431. check_type(var, _tp_ref);
  3432. PyIter_AS_C(tmp)->var = var;
  3433. frame->push(std::move(tmp));
  3434. }else{
  3435. typeError("'" + UNION_TP_NAME(obj) + "' object is not iterable");
  3436. }
  3437. } break;
  3438. case OP_FOR_ITER:
  3439. {
  3440. // top() must be PyIter, so no need to try_deref()
  3441. auto& it = PyIter_AS_C(frame->top());
  3442. if(it->hasNext()){
  3443. PyRef_AS_C(it->var)->set(this, frame, it->next());
  3444. }else{
  3445. int blockEnd = frame->code->co_blocks[byte.block].end;
  3446. frame->jump_abs_safe(blockEnd);
  3447. }
  3448. } break;
  3449. case OP_LOOP_CONTINUE:
  3450. {
  3451. int blockStart = frame->code->co_blocks[byte.block].start;
  3452. frame->jump_abs(blockStart);
  3453. } break;
  3454. case OP_LOOP_BREAK:
  3455. {
  3456. int blockEnd = frame->code->co_blocks[byte.block].end;
  3457. frame->jump_abs_safe(blockEnd);
  3458. } break;
  3459. case OP_JUMP_IF_FALSE_OR_POP:
  3460. {
  3461. const PyVar expr = frame->top_value(this);
  3462. if(asBool(expr)==False) frame->jump_abs(byte.arg);
  3463. else frame->pop_value(this);
  3464. } break;
  3465. case OP_JUMP_IF_TRUE_OR_POP:
  3466. {
  3467. const PyVar expr = frame->top_value(this);
  3468. if(asBool(expr)==True) frame->jump_abs(byte.arg);
  3469. else frame->pop_value(this);
  3470. } break;
  3471. case OP_BUILD_SLICE:
  3472. {
  3473. PyVar stop = frame->pop_value(this);
  3474. PyVar start = frame->pop_value(this);
  3475. _Slice s;
  3476. if(start != None) {check_type(start, _tp_int); s.start = (int)PyInt_AS_C(start);}
  3477. if(stop != None) {check_type(stop, _tp_int); s.stop = (int)PyInt_AS_C(stop);}
  3478. frame->push(PySlice(s));
  3479. } break;
  3480. case OP_IMPORT_NAME:
  3481. {
  3482. const _Str& name = frame->code->co_names[byte.arg].first;
  3483. auto it = _modules.find(name);
  3484. if(it == _modules.end()){
  3485. auto it2 = _lazy_modules.find(name);
  3486. if(it2 == _lazy_modules.end()){
  3487. _error("ImportError", "module '" + name + "' not found");
  3488. }else{
  3489. const _Str& source = it2->second;
  3490. _Code code = compile(source, name, EXEC_MODE);
  3491. PyVar _m = new_module(name);
  3492. _exec(code, _m, pkpy::make_shared<PyVarDict>());
  3493. frame->push(_m);
  3494. _lazy_modules.erase(it2);
  3495. }
  3496. }else{
  3497. frame->push(it->second);
  3498. }
  3499. } break;
  3500. // TODO: using "goto" inside with block may cause __exit__ not called
  3501. case OP_WITH_ENTER: call(frame->pop_value(this), __enter__); break;
  3502. case OP_WITH_EXIT: call(frame->pop_value(this), __exit__); break;
  3503. default:
  3504. throw std::runtime_error(_Str("opcode ") + OP_NAMES[byte.op] + " is not implemented");
  3505. break;
  3506. }
  3507. }
  3508. if(frame->code->src->mode == EVAL_MODE || frame->code->src->mode == JSON_MODE){
  3509. if(frame->stack_size() != 1) throw std::runtime_error("stack size is not 1 in EVAL_MODE/JSON_MODE");
  3510. return frame->pop_value(this);
  3511. }
  3512. if(frame->stack_size() != 0) throw std::runtime_error("stack not empty in EXEC_MODE");
  3513. return None;
  3514. }
  3515. public:
  3516. PyVarDict _types;
  3517. PyVarDict _modules; // loaded modules
  3518. emhash8::HashMap<_Str, _Str> _lazy_modules; // lazy loaded modules
  3519. PyVar None, True, False, Ellipsis;
  3520. bool use_stdio;
  3521. std::ostream* _stdout;
  3522. std::ostream* _stderr;
  3523. PyVar builtins; // builtins module
  3524. PyVar _main; // __main__ module
  3525. int maxRecursionDepth = 1000;
  3526. VM(bool use_stdio){
  3527. this->use_stdio = use_stdio;
  3528. if(use_stdio){
  3529. std::cout.setf(std::ios::unitbuf);
  3530. std::cerr.setf(std::ios::unitbuf);
  3531. this->_stdout = &std::cout;
  3532. this->_stderr = &std::cerr;
  3533. }else{
  3534. this->_stdout = new _StrStream();
  3535. this->_stderr = new _StrStream();
  3536. }
  3537. initializeBuiltinClasses();
  3538. _small_integers.reserve(270);
  3539. for(i64 i=-5; i<=256; i++) _small_integers.push_back(new_object(_tp_int, i));
  3540. }
  3541. PyVar asStr(const PyVar& obj){
  3542. PyVarOrNull str_fn = getattr(obj, __str__, false);
  3543. if(str_fn != nullptr) return call(str_fn);
  3544. return asRepr(obj);
  3545. }
  3546. inline Frame* top_frame() const {
  3547. if(callstack.empty()) UNREACHABLE();
  3548. return callstack.back().get();
  3549. }
  3550. PyVar asRepr(const PyVar& obj){
  3551. if(obj->is_type(_tp_type)) return PyStr("<class '" + UNION_GET(_Str, obj->attribs[__name__]) + "'>");
  3552. return call(obj, __repr__);
  3553. }
  3554. PyVar asJson(const PyVar& obj){
  3555. return call(obj, __json__);
  3556. }
  3557. const PyVar& asBool(const PyVar& obj){
  3558. if(obj->is_type(_tp_bool)) return obj;
  3559. if(obj == None) return False;
  3560. if(obj->is_type(_tp_int)) return PyBool(PyInt_AS_C(obj) != 0);
  3561. if(obj->is_type(_tp_float)) return PyBool(PyFloat_AS_C(obj) != 0.0);
  3562. PyVarOrNull len_fn = getattr(obj, __len__, false);
  3563. if(len_fn != nullptr){
  3564. PyVar ret = call(len_fn);
  3565. return PyBool(PyInt_AS_C(ret) > 0);
  3566. }
  3567. return True;
  3568. }
  3569. PyVar fast_call(const _Str& name, pkpy::ArgList&& args){
  3570. PyObject* cls = args[0]->_type.get();
  3571. while(cls != None.get()) {
  3572. PyVar* val = cls->attribs.try_get(name);
  3573. if(val != nullptr) return call(*val, std::move(args));
  3574. cls = cls->attribs[__base__].get();
  3575. }
  3576. attributeError(args[0], name);
  3577. return nullptr;
  3578. }
  3579. inline PyVar call(const PyVar& _callable){
  3580. return call(_callable, pkpy::noArg(), pkpy::noArg(), false);
  3581. }
  3582. template<typename ArgT>
  3583. inline std::enable_if_t<std::is_same_v<std::remove_const_t<std::remove_reference_t<ArgT>>, pkpy::ArgList>, PyVar>
  3584. call(const PyVar& _callable, ArgT&& args){
  3585. return call(_callable, std::forward<ArgT>(args), pkpy::noArg(), false);
  3586. }
  3587. template<typename ArgT>
  3588. inline std::enable_if_t<std::is_same_v<std::remove_const_t<std::remove_reference_t<ArgT>>, pkpy::ArgList>, PyVar>
  3589. call(const PyVar& obj, const _Str& func, ArgT&& args){
  3590. return call(getattr(obj, func), std::forward<ArgT>(args), pkpy::noArg(), false);
  3591. }
  3592. inline PyVar call(const PyVar& obj, const _Str& func){
  3593. return call(getattr(obj, func), pkpy::noArg(), pkpy::noArg(), false);
  3594. }
  3595. PyVar call(const PyVar& _callable, pkpy::ArgList args, const pkpy::ArgList& kwargs, bool opCall){
  3596. if(_callable->is_type(_tp_type)){
  3597. auto it = _callable->attribs.find(__new__);
  3598. PyVar obj;
  3599. if(it != _callable->attribs.end()){
  3600. obj = call(it->second, args, kwargs, false);
  3601. }else{
  3602. obj = new_object(_callable, DUMMY_VAL);
  3603. PyVarOrNull init_fn = getattr(obj, __init__, false);
  3604. if (init_fn != nullptr) call(init_fn, args, kwargs, false);
  3605. }
  3606. return obj;
  3607. }
  3608. const PyVar* callable = &_callable;
  3609. if((*callable)->is_type(_tp_bound_method)){
  3610. auto& bm = PyBoundMethod_AS_C((*callable));
  3611. callable = &bm.method; // get unbound method
  3612. args.extend_self(bm.obj);
  3613. }
  3614. if((*callable)->is_type(_tp_native_function)){
  3615. const auto& f = UNION_GET(_CppFunc, *callable);
  3616. // _CppFunc do not support kwargs
  3617. return f(this, args);
  3618. } else if((*callable)->is_type(_tp_function)){
  3619. const _Func& fn = PyFunction_AS_C((*callable));
  3620. pkpy::shared_ptr<PyVarDict> _locals = pkpy::make_shared<PyVarDict>();
  3621. PyVarDict& locals = *_locals;
  3622. int i = 0;
  3623. for(const auto& name : fn->args){
  3624. if(i < args.size()){
  3625. locals.emplace(name, args[i++]);
  3626. continue;
  3627. }
  3628. typeError("missing positional argument '" + name + "'");
  3629. }
  3630. locals.insert(fn->kwArgs.begin(), fn->kwArgs.end());
  3631. std::vector<_Str> positional_overrided_keys;
  3632. if(!fn->starredArg.empty()){
  3633. // handle *args
  3634. PyVarList vargs;
  3635. while(i < args.size()) vargs.push_back(args[i++]);
  3636. locals.emplace(fn->starredArg, PyTuple(std::move(vargs)));
  3637. }else{
  3638. for(const auto& key : fn->kwArgsOrder){
  3639. if(i < args.size()){
  3640. locals[key] = args[i++];
  3641. positional_overrided_keys.push_back(key);
  3642. }else{
  3643. break;
  3644. }
  3645. }
  3646. if(i < args.size()) typeError("too many arguments");
  3647. }
  3648. for(int i=0; i<kwargs.size(); i+=2){
  3649. const _Str& key = PyStr_AS_C(kwargs[i]);
  3650. if(!fn->kwArgs.contains(key)){
  3651. typeError(key.__escape(true) + " is an invalid keyword argument for " + fn->name + "()");
  3652. }
  3653. const PyVar& val = kwargs[i+1];
  3654. if(!positional_overrided_keys.empty()){
  3655. auto it = std::find(positional_overrided_keys.begin(), positional_overrided_keys.end(), key);
  3656. if(it != positional_overrided_keys.end()){
  3657. typeError("multiple values for argument '" + key + "'");
  3658. }
  3659. }
  3660. locals[key] = val;
  3661. }
  3662. PyVar* it_m = (*callable)->attribs.try_get(__module__);
  3663. PyVar _module = it_m != nullptr ? *it_m : top_frame()->_module;
  3664. if(opCall){
  3665. __push_new_frame(fn->code, _module, _locals);
  3666. return __py2py_call_signal;
  3667. }
  3668. return _exec(fn->code, _module, _locals);
  3669. }
  3670. typeError("'" + UNION_TP_NAME(*callable) + "' object is not callable");
  3671. return None;
  3672. }
  3673. // repl mode is only for setting `frame->id` to 0
  3674. PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr){
  3675. if(_module == nullptr) _module = _main;
  3676. try {
  3677. _Code code = compile(source, filename, mode);
  3678. //if(filename != "<builtins>") std::cout << disassemble(code) << std::endl;
  3679. return _exec(code, _module, pkpy::make_shared<PyVarDict>());
  3680. }catch (const _Error& e){
  3681. *_stderr << e.what() << '\n';
  3682. }
  3683. catch (const std::exception& e) {
  3684. auto re = RuntimeError("UnexpectedError", e.what(), _cleanErrorAndGetSnapshots());
  3685. *_stderr << re.what() << '\n';
  3686. }
  3687. return nullptr;
  3688. }
  3689. template<typename ...Args>
  3690. Frame* __push_new_frame(Args&&... args){
  3691. if(callstack.size() > maxRecursionDepth){
  3692. throw RuntimeError("RecursionError", "maximum recursion depth exceeded", _cleanErrorAndGetSnapshots());
  3693. }
  3694. callstack.emplace_back(std::make_unique<Frame>(std::forward<Args>(args)...));
  3695. return callstack.back().get();
  3696. }
  3697. template<typename ...Args>
  3698. PyVar _exec(Args&&... args){
  3699. Frame* frame = __push_new_frame(std::forward<Args>(args)...);
  3700. Frame* frameBase = frame;
  3701. PyVar ret = nullptr;
  3702. while(true){
  3703. ret = run_frame(frame);
  3704. if(ret != __py2py_call_signal){
  3705. if(frame == frameBase){ // [ frameBase<- ]
  3706. break;
  3707. }else{
  3708. callstack.pop_back();
  3709. frame = callstack.back().get();
  3710. frame->push(ret);
  3711. }
  3712. }else{
  3713. frame = callstack.back().get(); // [ frameBase, newFrame<- ]
  3714. }
  3715. }
  3716. callstack.pop_back();
  3717. return ret;
  3718. }
  3719. PyVar new_user_type_object(PyVar mod, _Str name, PyVar base){
  3720. PyVar obj = pkpy::make_shared<PyObject, Py_<i64>>((i64)1, _tp_type);
  3721. setattr(obj, __base__, base);
  3722. _Str fullName = name;
  3723. if(mod != builtins) fullName = UNION_NAME(mod) + "." + name;
  3724. setattr(obj, __name__, PyStr(fullName));
  3725. setattr(mod, name, obj);
  3726. return obj;
  3727. }
  3728. PyVar new_type_object(_Str name, PyVar base=nullptr) {
  3729. if(base == nullptr) base = _tp_object;
  3730. PyVar obj = pkpy::make_shared<PyObject, Py_<i64>>((i64)0, _tp_type);
  3731. setattr(obj, __base__, base);
  3732. _types[name] = obj;
  3733. return obj;
  3734. }
  3735. template<typename T>
  3736. inline PyVar new_object(PyVar type, T _value) {
  3737. if(!type->is_type(_tp_type)) UNREACHABLE();
  3738. return pkpy::make_shared<PyObject, Py_<T>>(_value, type);
  3739. }
  3740. template<typename T, typename... Args>
  3741. inline PyVar new_object_c(Args&&... args) {
  3742. return new_object(T::_tp(this), T(std::forward<Args>(args)...));
  3743. }
  3744. PyVar new_module(_Str name) {
  3745. PyVar obj = new_object(_tp_module, DUMMY_VAL);
  3746. setattr(obj, __name__, PyStr(name));
  3747. _modules[name] = obj;
  3748. return obj;
  3749. }
  3750. PyVar new_module_if_not_existed(_Str name) {
  3751. PyVar* it = _modules.try_get(name);
  3752. if(it != nullptr) return *it;
  3753. return new_module(name);
  3754. }
  3755. PyVarOrNull getattr(const PyVar& obj, const _Str& name, bool throw_err=true) {
  3756. PyVarDict::iterator it;
  3757. PyObject* cls;
  3758. if(obj->is_type(_tp_super)){
  3759. const PyVar* root = &obj;
  3760. int depth = 1;
  3761. while(true){
  3762. root = &UNION_GET(PyVar, *root);
  3763. if(!(*root)->is_type(_tp_super)) break;
  3764. depth++;
  3765. }
  3766. cls = (*root)->_type.get();
  3767. for(int i=0; i<depth; i++) cls = cls->attribs[__base__].get();
  3768. it = (*root)->attribs.find(name);
  3769. if(it != (*root)->attribs.end()) return it->second;
  3770. }else{
  3771. it = obj->attribs.find(name);
  3772. if(it != obj->attribs.end()) return it->second;
  3773. cls = obj->_type.get();
  3774. }
  3775. while(cls != None.get()) {
  3776. it = cls->attribs.find(name);
  3777. if(it != cls->attribs.end()){
  3778. PyVar valueFromCls = it->second;
  3779. if(valueFromCls->is_type(_tp_function) || valueFromCls->is_type(_tp_native_function)){
  3780. return PyBoundMethod({obj, std::move(valueFromCls)});
  3781. }else{
  3782. return valueFromCls;
  3783. }
  3784. }
  3785. cls = cls->attribs[__base__].get();
  3786. }
  3787. if(throw_err) attributeError(obj, name);
  3788. return nullptr;
  3789. }
  3790. template<typename T>
  3791. inline void setattr(PyVar& obj, const _Str& name, T&& value) {
  3792. PyObject* p = obj.get();
  3793. while(p->is_type(_tp_super)) p = ((Py_<PyVar>*)p)->_valueT.get();
  3794. p->attribs[name] = std::forward<T>(value);
  3795. }
  3796. template<int ARGC>
  3797. void bindMethod(PyVar obj, _Str funcName, _CppFuncRaw fn) {
  3798. check_type(obj, _tp_type);
  3799. setattr(obj, funcName, PyNativeFunction(_CppFunc(fn, ARGC, true)));
  3800. }
  3801. template<int ARGC>
  3802. void bindFunc(PyVar obj, _Str funcName, _CppFuncRaw fn) {
  3803. setattr(obj, funcName, PyNativeFunction(_CppFunc(fn, ARGC, false)));
  3804. }
  3805. template<int ARGC>
  3806. void bindMethod(_Str typeName, _Str funcName, _CppFuncRaw fn) {
  3807. bindMethod<ARGC>(_types[typeName], funcName, fn);
  3808. }
  3809. template<int ARGC>
  3810. void bindStaticMethod(_Str typeName, _Str funcName, _CppFuncRaw fn) {
  3811. bindFunc<ARGC>(_types[typeName], funcName, fn);
  3812. }
  3813. template<int ARGC>
  3814. void bindMethodMulti(std::vector<_Str> typeNames, _Str funcName, _CppFuncRaw fn) {
  3815. for(auto& typeName : typeNames) bindMethod<ARGC>(typeName, funcName, fn);
  3816. }
  3817. template<int ARGC>
  3818. void bindBuiltinFunc(_Str funcName, _CppFuncRaw fn) {
  3819. bindFunc<ARGC>(builtins, funcName, fn);
  3820. }
  3821. inline f64 num_to_float(const PyVar& obj){
  3822. if (obj->is_type(_tp_int)){
  3823. return (f64)PyInt_AS_C(obj);
  3824. }else if(obj->is_type(_tp_float)){
  3825. return PyFloat_AS_C(obj);
  3826. }
  3827. typeError("expected int or float, got " + UNION_TP_NAME(obj));
  3828. return 0;
  3829. }
  3830. PyVar num_negated(const PyVar& obj){
  3831. if (obj->is_type(_tp_int)){
  3832. return PyInt(-PyInt_AS_C(obj));
  3833. }else if(obj->is_type(_tp_float)){
  3834. return PyFloat(-PyFloat_AS_C(obj));
  3835. }
  3836. typeError("unsupported operand type(s) for -");
  3837. return nullptr;
  3838. }
  3839. int normalized_index(int index, int size){
  3840. if(index < 0) index += size;
  3841. if(index < 0 || index >= size){
  3842. indexError("index out of range, " + std::to_string(index) + " not in [0, " + std::to_string(size) + ")");
  3843. }
  3844. return index;
  3845. }
  3846. _Str disassemble(_Code code){
  3847. std::vector<int> jumpTargets;
  3848. for(auto byte : code->co_code){
  3849. if(byte.op == OP_JUMP_ABSOLUTE || byte.op == OP_SAFE_JUMP_ABSOLUTE || byte.op == OP_POP_JUMP_IF_FALSE){
  3850. jumpTargets.push_back(byte.arg);
  3851. }
  3852. }
  3853. _StrStream ss;
  3854. ss << std::string(54, '-') << '\n';
  3855. ss << code->name << ":\n";
  3856. int prev_line = -1;
  3857. for(int i=0; i<code->co_code.size(); i++){
  3858. const Bytecode& byte = code->co_code[i];
  3859. _Str line = std::to_string(byte.line);
  3860. if(byte.line == prev_line) line = "";
  3861. else{
  3862. if(prev_line != -1) ss << "\n";
  3863. prev_line = byte.line;
  3864. }
  3865. std::string pointer;
  3866. if(std::find(jumpTargets.begin(), jumpTargets.end(), i) != jumpTargets.end()){
  3867. pointer = "-> ";
  3868. }else{
  3869. pointer = " ";
  3870. }
  3871. ss << pad(line, 8) << pointer << pad(std::to_string(i), 3);
  3872. ss << " " << pad(OP_NAMES[byte.op], 20) << " ";
  3873. // ss << pad(byte.arg == -1 ? "" : std::to_string(byte.arg), 5);
  3874. std::string argStr = byte.arg == -1 ? "" : std::to_string(byte.arg);
  3875. if(byte.op == OP_LOAD_CONST){
  3876. argStr += " (" + PyStr_AS_C(asRepr(code->co_consts[byte.arg])) + ")";
  3877. }
  3878. if(byte.op == OP_LOAD_NAME_REF || byte.op == OP_LOAD_NAME){
  3879. argStr += " (" + code->co_names[byte.arg].first.__escape(true) + ")";
  3880. }
  3881. ss << pad(argStr, 20); // may overflow
  3882. ss << code->co_blocks[byte.block].to_string();
  3883. if(i != code->co_code.size() - 1) ss << '\n';
  3884. }
  3885. _StrStream consts;
  3886. consts << "co_consts: ";
  3887. consts << PyStr_AS_C(asRepr(PyList(code->co_consts)));
  3888. _StrStream names;
  3889. names << "co_names: ";
  3890. PyVarList list;
  3891. for(int i=0; i<code->co_names.size(); i++){
  3892. list.push_back(PyStr(code->co_names[i].first));
  3893. }
  3894. names << PyStr_AS_C(asRepr(PyList(list)));
  3895. ss << '\n' << consts.str() << '\n' << names.str() << '\n';
  3896. for(int i=0; i<code->co_consts.size(); i++){
  3897. PyVar obj = code->co_consts[i];
  3898. if(obj->is_type(_tp_function)){
  3899. const auto& f = PyFunction_AS_C(obj);
  3900. ss << disassemble(f->code);
  3901. }
  3902. }
  3903. return _Str(ss.str());
  3904. }
  3905. // for quick access
  3906. PyVar _tp_object, _tp_type, _tp_int, _tp_float, _tp_bool, _tp_str;
  3907. PyVar _tp_list, _tp_tuple;
  3908. PyVar _tp_function, _tp_native_function, _tp_native_iterator, _tp_bound_method;
  3909. PyVar _tp_slice, _tp_range, _tp_module, _tp_ref;
  3910. PyVar _tp_super;
  3911. template<typename P>
  3912. inline PyVarRef PyRef(P&& value) {
  3913. static_assert(std::is_base_of<BaseRef, P>::value, "P should derive from BaseRef");
  3914. return new_object(_tp_ref, std::forward<P>(value));
  3915. }
  3916. inline const BaseRef* PyRef_AS_C(const PyVar& obj)
  3917. {
  3918. if(!obj->is_type(_tp_ref)) typeError("expected an l-value");
  3919. return (const BaseRef*)(obj->value());
  3920. }
  3921. __DEF_PY_AS_C(Int, i64, _tp_int)
  3922. inline PyVar PyInt(i64 value) {
  3923. if(value >= -5 && value <= 256) return _small_integers[value + 5];
  3924. return new_object(_tp_int, value);
  3925. }
  3926. DEF_NATIVE(Float, f64, _tp_float)
  3927. DEF_NATIVE(Str, _Str, _tp_str)
  3928. DEF_NATIVE(List, PyVarList, _tp_list)
  3929. DEF_NATIVE(Tuple, PyVarList, _tp_tuple)
  3930. DEF_NATIVE(Function, _Func, _tp_function)
  3931. DEF_NATIVE(NativeFunction, _CppFunc, _tp_native_function)
  3932. DEF_NATIVE(Iter, _Iterator, _tp_native_iterator)
  3933. DEF_NATIVE(BoundMethod, _BoundMethod, _tp_bound_method)
  3934. DEF_NATIVE(Range, _Range, _tp_range)
  3935. DEF_NATIVE(Slice, _Slice, _tp_slice)
  3936. // there is only one True/False, so no need to copy them!
  3937. inline bool PyBool_AS_C(const PyVar& obj){return obj == True;}
  3938. inline const PyVar& PyBool(bool value){return value ? True : False;}
  3939. void initializeBuiltinClasses(){
  3940. _tp_object = pkpy::make_shared<PyObject, Py_<i64>>((i64)0, nullptr);
  3941. _tp_type = pkpy::make_shared<PyObject, Py_<i64>>((i64)0, nullptr);
  3942. _types["object"] = _tp_object;
  3943. _types["type"] = _tp_type;
  3944. _tp_bool = new_type_object("bool");
  3945. _tp_int = new_type_object("int");
  3946. _tp_float = new_type_object("float");
  3947. _tp_str = new_type_object("str");
  3948. _tp_list = new_type_object("list");
  3949. _tp_tuple = new_type_object("tuple");
  3950. _tp_slice = new_type_object("slice");
  3951. _tp_range = new_type_object("range");
  3952. _tp_module = new_type_object("module");
  3953. _tp_ref = new_type_object("_ref");
  3954. _tp_function = new_type_object("function");
  3955. _tp_native_function = new_type_object("_native_function");
  3956. _tp_native_iterator = new_type_object("_native_iterator");
  3957. _tp_bound_method = new_type_object("bound_method");
  3958. _tp_super = new_type_object("super");
  3959. this->None = new_object(new_type_object("NoneType"), DUMMY_VAL);
  3960. this->Ellipsis = new_object(new_type_object("ellipsis"), DUMMY_VAL);
  3961. this->True = new_object(_tp_bool, true);
  3962. this->False = new_object(_tp_bool, false);
  3963. this->builtins = new_module("builtins");
  3964. this->_main = new_module("__main__");
  3965. setattr(_tp_type, __base__, _tp_object);
  3966. _tp_type->_type = _tp_type;
  3967. setattr(_tp_object, __base__, None);
  3968. _tp_object->_type = _tp_type;
  3969. for (auto& [name, type] : _types) {
  3970. setattr(type, __name__, PyStr(name));
  3971. }
  3972. this->__py2py_call_signal = new_object(_tp_object, DUMMY_VAL);
  3973. std::vector<_Str> publicTypes = {"type", "object", "bool", "int", "float", "str", "list", "tuple", "range"};
  3974. for (auto& name : publicTypes) {
  3975. setattr(builtins, name, _types[name]);
  3976. }
  3977. }
  3978. i64 hash(const PyVar& obj){
  3979. if (obj->is_type(_tp_int)) return PyInt_AS_C(obj);
  3980. if (obj->is_type(_tp_bool)) return PyBool_AS_C(obj) ? 1 : 0;
  3981. if (obj->is_type(_tp_float)){
  3982. f64 val = PyFloat_AS_C(obj);
  3983. return (i64)std::hash<f64>()(val);
  3984. }
  3985. if (obj->is_type(_tp_str)) return PyStr_AS_C(obj).hash();
  3986. if (obj->is_type(_tp_type)) return (i64)obj.get();
  3987. if (obj->is_type(_tp_tuple)) {
  3988. i64 x = 1000003;
  3989. for (const auto& item : PyTuple_AS_C(obj)) {
  3990. i64 y = hash(item);
  3991. x = x ^ (y + 0x9e3779b9 + (x << 6) + (x >> 2)); // recommended by Github Copilot
  3992. }
  3993. return x;
  3994. }
  3995. typeError("unhashable type: " + UNION_TP_NAME(obj));
  3996. return 0;
  3997. }
  3998. /***** Error Reporter *****/
  3999. private:
  4000. void _error(const _Str& name, const _Str& msg){
  4001. throw RuntimeError(name, msg, _cleanErrorAndGetSnapshots());
  4002. }
  4003. std::stack<_Str> _cleanErrorAndGetSnapshots(){
  4004. std::stack<_Str> snapshots;
  4005. while (!callstack.empty()){
  4006. if(snapshots.size() < 8){
  4007. snapshots.push(callstack.back()->curr_snapshot());
  4008. }
  4009. callstack.pop_back();
  4010. }
  4011. return snapshots;
  4012. }
  4013. public:
  4014. void typeError(const _Str& msg){ _error("TypeError", msg); }
  4015. void zeroDivisionError(){ _error("ZeroDivisionError", "division by zero"); }
  4016. void indexError(const _Str& msg){ _error("IndexError", msg); }
  4017. void valueError(const _Str& msg){ _error("ValueError", msg); }
  4018. void nameError(const _Str& name){ _error("NameError", "name '" + name + "' is not defined"); }
  4019. void attributeError(PyVar obj, const _Str& name){
  4020. _error("AttributeError", "type '" + UNION_TP_NAME(obj) + "' has no attribute '" + name + "'");
  4021. }
  4022. inline void check_type(const PyVar& obj, const PyVar& type){
  4023. if(!obj->is_type(type)) typeError("expected '" + UNION_NAME(type) + "', but got '" + UNION_TP_NAME(obj) + "'");
  4024. }
  4025. ~VM() {
  4026. if(!use_stdio){
  4027. delete _stdout;
  4028. delete _stderr;
  4029. }
  4030. }
  4031. _Code compile(_Str source, _Str filename, CompileMode mode);
  4032. };
  4033. /***** Pointers' Impl *****/
  4034. PyVar NameRef::get(VM* vm, Frame* frame) const{
  4035. PyVar* val;
  4036. val = frame->f_locals().try_get(pair->first);
  4037. if(val) return *val;
  4038. val = frame->f_globals().try_get(pair->first);
  4039. if(val) return *val;
  4040. val = vm->builtins->attribs.try_get(pair->first);
  4041. if(val) return *val;
  4042. vm->nameError(pair->first);
  4043. return nullptr;
  4044. }
  4045. void NameRef::set(VM* vm, Frame* frame, PyVar val) const{
  4046. switch(pair->second) {
  4047. case NAME_LOCAL: frame->f_locals()[pair->first] = std::move(val); break;
  4048. case NAME_GLOBAL:
  4049. {
  4050. PyVar* existing = frame->f_locals().try_get(pair->first);
  4051. if(existing != nullptr){
  4052. *existing = std::move(val);
  4053. }else{
  4054. frame->f_globals()[pair->first] = std::move(val);
  4055. }
  4056. } break;
  4057. default: UNREACHABLE();
  4058. }
  4059. }
  4060. void NameRef::del(VM* vm, Frame* frame) const{
  4061. switch(pair->second) {
  4062. case NAME_LOCAL: {
  4063. if(frame->f_locals().contains(pair->first)){
  4064. frame->f_locals().erase(pair->first);
  4065. }else{
  4066. vm->nameError(pair->first);
  4067. }
  4068. } break;
  4069. case NAME_GLOBAL:
  4070. {
  4071. if(frame->f_locals().contains(pair->first)){
  4072. frame->f_locals().erase(pair->first);
  4073. }else{
  4074. if(frame->f_globals().contains(pair->first)){
  4075. frame->f_globals().erase(pair->first);
  4076. }else{
  4077. vm->nameError(pair->first);
  4078. }
  4079. }
  4080. } break;
  4081. default: UNREACHABLE();
  4082. }
  4083. }
  4084. PyVar AttrRef::get(VM* vm, Frame* frame) const{
  4085. return vm->getattr(obj, attr.pair->first);
  4086. }
  4087. void AttrRef::set(VM* vm, Frame* frame, PyVar val) const{
  4088. vm->setattr(obj, attr.pair->first, val);
  4089. }
  4090. void AttrRef::del(VM* vm, Frame* frame) const{
  4091. vm->typeError("cannot delete attribute");
  4092. }
  4093. PyVar IndexRef::get(VM* vm, Frame* frame) const{
  4094. return vm->call(obj, __getitem__, pkpy::oneArg(index));
  4095. }
  4096. void IndexRef::set(VM* vm, Frame* frame, PyVar val) const{
  4097. vm->call(obj, __setitem__, pkpy::twoArgs(index, val));
  4098. }
  4099. void IndexRef::del(VM* vm, Frame* frame) const{
  4100. vm->call(obj, __delitem__, pkpy::oneArg(index));
  4101. }
  4102. PyVar TupleRef::get(VM* vm, Frame* frame) const{
  4103. PyVarList args(varRefs.size());
  4104. for (int i = 0; i < varRefs.size(); i++) {
  4105. args[i] = vm->PyRef_AS_C(varRefs[i])->get(vm, frame);
  4106. }
  4107. return vm->PyTuple(args);
  4108. }
  4109. void TupleRef::set(VM* vm, Frame* frame, PyVar val) const{
  4110. if(!val->is_type(vm->_tp_tuple) && !val->is_type(vm->_tp_list)){
  4111. vm->typeError("only tuple or list can be unpacked");
  4112. }
  4113. const PyVarList& args = UNION_GET(PyVarList, val);
  4114. if(args.size() > varRefs.size()) vm->valueError("too many values to unpack");
  4115. if(args.size() < varRefs.size()) vm->valueError("not enough values to unpack");
  4116. for (int i = 0; i < varRefs.size(); i++) {
  4117. vm->PyRef_AS_C(varRefs[i])->set(vm, frame, args[i]);
  4118. }
  4119. }
  4120. void TupleRef::del(VM* vm, Frame* frame) const{
  4121. for (auto& r : varRefs) vm->PyRef_AS_C(r)->del(vm, frame);
  4122. }
  4123. /***** Frame's Impl *****/
  4124. inline void Frame::try_deref(VM* vm, PyVar& v){
  4125. if(v->is_type(vm->_tp_ref)) v = vm->PyRef_AS_C(v)->get(vm, this);
  4126. }
  4127. /***** Iterators' Impl *****/
  4128. PyVar RangeIterator::next(){
  4129. PyVar val = vm->PyInt(current);
  4130. current += r.step;
  4131. return val;
  4132. }
  4133. PyVar StringIterator::next(){
  4134. return vm->PyStr(str.u8_getitem(index++));
  4135. }
  4136. PyVar _CppFunc::operator()(VM* vm, const pkpy::ArgList& args) const{
  4137. int args_size = args.size() - (int)method; // remove self
  4138. if(argc != -1 && args_size != argc) {
  4139. vm->typeError("expected " + std::to_string(argc) + " arguments, but got " + std::to_string(args_size));
  4140. }
  4141. return f(vm, args);
  4142. }
  4143. class Compiler;
  4144. typedef void (Compiler::*GrammarFn)();
  4145. typedef void (Compiler::*CompilerAction)();
  4146. struct GrammarRule{
  4147. GrammarFn prefix;
  4148. GrammarFn infix;
  4149. Precedence precedence;
  4150. };
  4151. enum StringType { NORMAL_STRING, RAW_STRING, F_STRING };
  4152. class Compiler {
  4153. public:
  4154. std::unique_ptr<Parser> parser;
  4155. std::stack<_Code> codes;
  4156. bool isCompilingClass = false;
  4157. int lexingCnt = 0;
  4158. VM* vm;
  4159. emhash8::HashMap<_TokenType, GrammarRule> rules;
  4160. _Code co() const{ return codes.top(); }
  4161. CompileMode mode() const{ return parser->src->mode;}
  4162. Compiler(VM* vm, const char* source, _Str filename, CompileMode mode){
  4163. this->vm = vm;
  4164. this->parser = std::make_unique<Parser>(
  4165. pkpy::make_shared<SourceMetadata>(source, filename, mode)
  4166. );
  4167. // http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/
  4168. #define METHOD(name) &Compiler::name
  4169. #define NO_INFIX nullptr, PREC_NONE
  4170. for(_TokenType i=0; i<__TOKENS_LEN; i++) rules[i] = { nullptr, NO_INFIX };
  4171. rules[TK(".")] = { nullptr, METHOD(exprAttrib), PREC_ATTRIB };
  4172. rules[TK("(")] = { METHOD(exprGrouping), METHOD(exprCall), PREC_CALL };
  4173. rules[TK("[")] = { METHOD(exprList), METHOD(exprSubscript), PREC_SUBSCRIPT };
  4174. rules[TK("{")] = { METHOD(exprMap), NO_INFIX };
  4175. rules[TK("%")] = { nullptr, METHOD(exprBinaryOp), PREC_FACTOR };
  4176. rules[TK("+")] = { nullptr, METHOD(exprBinaryOp), PREC_TERM };
  4177. rules[TK("-")] = { METHOD(exprUnaryOp), METHOD(exprBinaryOp), PREC_TERM };
  4178. rules[TK("*")] = { METHOD(exprUnaryOp), METHOD(exprBinaryOp), PREC_FACTOR };
  4179. rules[TK("/")] = { nullptr, METHOD(exprBinaryOp), PREC_FACTOR };
  4180. rules[TK("//")] = { nullptr, METHOD(exprBinaryOp), PREC_FACTOR };
  4181. rules[TK("**")] = { nullptr, METHOD(exprBinaryOp), PREC_EXPONENT };
  4182. rules[TK(">")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION };
  4183. rules[TK("<")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION };
  4184. rules[TK("==")] = { nullptr, METHOD(exprBinaryOp), PREC_EQUALITY };
  4185. rules[TK("!=")] = { nullptr, METHOD(exprBinaryOp), PREC_EQUALITY };
  4186. rules[TK(">=")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION };
  4187. rules[TK("<=")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION };
  4188. rules[TK("in")] = { nullptr, METHOD(exprBinaryOp), PREC_TEST };
  4189. rules[TK("is")] = { nullptr, METHOD(exprBinaryOp), PREC_TEST };
  4190. rules[TK("not in")] = { nullptr, METHOD(exprBinaryOp), PREC_TEST };
  4191. rules[TK("is not")] = { nullptr, METHOD(exprBinaryOp), PREC_TEST };
  4192. rules[TK("and") ] = { nullptr, METHOD(exprAnd), PREC_LOGICAL_AND };
  4193. rules[TK("or")] = { nullptr, METHOD(exprOr), PREC_LOGICAL_OR };
  4194. rules[TK("not")] = { METHOD(exprUnaryOp), nullptr, PREC_UNARY };
  4195. rules[TK("True")] = { METHOD(exprValue), NO_INFIX };
  4196. rules[TK("False")] = { METHOD(exprValue), NO_INFIX };
  4197. rules[TK("lambda")] = { METHOD(exprLambda), NO_INFIX };
  4198. rules[TK("None")] = { METHOD(exprValue), NO_INFIX };
  4199. rules[TK("...")] = { METHOD(exprValue), NO_INFIX };
  4200. rules[TK("@id")] = { METHOD(exprName), NO_INFIX };
  4201. rules[TK("@num")] = { METHOD(exprLiteral), NO_INFIX };
  4202. rules[TK("@str")] = { METHOD(exprLiteral), NO_INFIX };
  4203. rules[TK("@fstr")] = { METHOD(exprFString), NO_INFIX };
  4204. rules[TK("?")] = { nullptr, METHOD(exprTernary), PREC_TERNARY };
  4205. rules[TK("=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4206. rules[TK("+=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4207. rules[TK("-=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4208. rules[TK("*=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4209. rules[TK("/=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4210. rules[TK("//=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4211. rules[TK("%=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4212. rules[TK("&=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4213. rules[TK("|=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4214. rules[TK("^=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4215. rules[TK(",")] = { nullptr, METHOD(exprComma), PREC_COMMA };
  4216. rules[TK("<<")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_SHIFT };
  4217. rules[TK(">>")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_SHIFT };
  4218. rules[TK("&")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_AND };
  4219. rules[TK("|")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_OR };
  4220. rules[TK("^")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_XOR };
  4221. #undef METHOD
  4222. #undef NO_INFIX
  4223. #define EXPR() parsePrecedence(PREC_TERNARY) // no '=' and ',' just a simple expression
  4224. #define EXPR_TUPLE() parsePrecedence(PREC_COMMA) // no '=', but ',' is allowed
  4225. #define EXPR_ANY() parsePrecedence(PREC_ASSIGNMENT)
  4226. }
  4227. _Str eatStringUntil(char quote, bool raw) {
  4228. bool quote3 = parser->match_n_chars(2, quote);
  4229. std::vector<char> buff;
  4230. while (true) {
  4231. char c = parser->eatchar_include_newline();
  4232. if (c == quote){
  4233. if(quote3 && !parser->match_n_chars(2, quote)){
  4234. buff.push_back(c);
  4235. continue;
  4236. }
  4237. break;
  4238. }
  4239. if (c == '\0'){
  4240. if(quote3 && parser->src->mode == SINGLE_MODE){
  4241. throw NeedMoreLines(false);
  4242. }
  4243. syntaxError("EOL while scanning string literal");
  4244. }
  4245. if (c == '\n'){
  4246. if(!quote3) syntaxError("EOL while scanning string literal");
  4247. else{
  4248. buff.push_back(c);
  4249. continue;
  4250. }
  4251. }
  4252. if (!raw && c == '\\') {
  4253. switch (parser->eatchar_include_newline()) {
  4254. case '"': buff.push_back('"'); break;
  4255. case '\'': buff.push_back('\''); break;
  4256. case '\\': buff.push_back('\\'); break;
  4257. case 'n': buff.push_back('\n'); break;
  4258. case 'r': buff.push_back('\r'); break;
  4259. case 't': buff.push_back('\t'); break;
  4260. default: syntaxError("invalid escape character");
  4261. }
  4262. } else {
  4263. buff.push_back(c);
  4264. }
  4265. }
  4266. return _Str(buff.data(), buff.size());
  4267. }
  4268. void eatString(char quote, StringType type) {
  4269. _Str s = eatStringUntil(quote, type == RAW_STRING);
  4270. if(type == F_STRING){
  4271. parser->set_next_token(TK("@fstr"), vm->PyStr(s));
  4272. }else{
  4273. parser->set_next_token(TK("@str"), vm->PyStr(s));
  4274. }
  4275. }
  4276. void eatNumber() {
  4277. static const std::regex pattern("^(0x)?[0-9a-fA-F]+(\\.[0-9]+)?");
  4278. std::smatch m;
  4279. const char* i = parser->token_start;
  4280. while(*i != '\n' && *i != '\0') i++;
  4281. std::string s = std::string(parser->token_start, i);
  4282. try{
  4283. if (std::regex_search(s, m, pattern)) {
  4284. // here is m.length()-1, since the first char was eaten by lexToken()
  4285. for(int j=0; j<m.length()-1; j++) parser->eatchar();
  4286. int base = 10;
  4287. size_t size;
  4288. if (m[1].matched) base = 16;
  4289. if (m[2].matched) {
  4290. if(base == 16) syntaxError("hex literal should not contain a dot");
  4291. parser->set_next_token(TK("@num"), vm->PyFloat(std::stod(m[0], &size)));
  4292. } else {
  4293. parser->set_next_token(TK("@num"), vm->PyInt(std::stoll(m[0], &size, base)));
  4294. }
  4295. if (size != m.length()) throw std::runtime_error("length mismatch");
  4296. }
  4297. }catch(std::exception& _){
  4298. syntaxError("invalid number literal");
  4299. }
  4300. }
  4301. void lexToken(){
  4302. lexingCnt++;
  4303. _lexToken();
  4304. lexingCnt--;
  4305. }
  4306. // Lex the next token and set it as the next token.
  4307. void _lexToken() {
  4308. parser->prev = parser->curr;
  4309. parser->curr = parser->next_token();
  4310. //_Str _info = parser->curr.info(); std::cout << _info << '[' << parser->current_line << ']' << std::endl;
  4311. while (parser->peekchar() != '\0') {
  4312. parser->token_start = parser->curr_char;
  4313. char c = parser->eatchar_include_newline();
  4314. switch (c) {
  4315. case '\'': case '"': eatString(c, NORMAL_STRING); return;
  4316. case '#': parser->skip_line_comment(); break;
  4317. case '{': parser->set_next_token(TK("{")); return;
  4318. case '}': parser->set_next_token(TK("}")); return;
  4319. case ',': parser->set_next_token(TK(",")); return;
  4320. case ':': parser->set_next_token(TK(":")); return;
  4321. case ';': parser->set_next_token(TK(";")); return;
  4322. case '(': parser->set_next_token(TK("(")); return;
  4323. case ')': parser->set_next_token(TK(")")); return;
  4324. case '[': parser->set_next_token(TK("[")); return;
  4325. case ']': parser->set_next_token(TK("]")); return;
  4326. case '%': parser->set_next_token_2('=', TK("%"), TK("%=")); return;
  4327. case '&': parser->set_next_token_2('=', TK("&"), TK("&=")); return;
  4328. case '|': parser->set_next_token_2('=', TK("|"), TK("|=")); return;
  4329. case '^': parser->set_next_token_2('=', TK("^"), TK("^=")); return;
  4330. case '?': parser->set_next_token(TK("?")); return;
  4331. case '.': {
  4332. if(parser->matchchar('.')) {
  4333. if(parser->matchchar('.')) {
  4334. parser->set_next_token(TK("..."));
  4335. } else {
  4336. syntaxError("invalid token '..'");
  4337. }
  4338. } else {
  4339. parser->set_next_token(TK("."));
  4340. }
  4341. return;
  4342. }
  4343. case '=': parser->set_next_token_2('=', TK("="), TK("==")); return;
  4344. case '+': parser->set_next_token_2('=', TK("+"), TK("+=")); return;
  4345. case '>': {
  4346. if(parser->matchchar('=')) parser->set_next_token(TK(">="));
  4347. else if(parser->matchchar('>')) parser->set_next_token(TK(">>"));
  4348. else parser->set_next_token(TK(">"));
  4349. return;
  4350. }
  4351. case '<': {
  4352. if(parser->matchchar('=')) parser->set_next_token(TK("<="));
  4353. else if(parser->matchchar('<')) parser->set_next_token(TK("<<"));
  4354. else parser->set_next_token(TK("<"));
  4355. return;
  4356. }
  4357. case '-': {
  4358. if(parser->matchchar('=')) parser->set_next_token(TK("-="));
  4359. else if(parser->matchchar('>')) parser->set_next_token(TK("->"));
  4360. else parser->set_next_token(TK("-"));
  4361. return;
  4362. }
  4363. case '!':
  4364. if(parser->matchchar('=')) parser->set_next_token(TK("!="));
  4365. else syntaxError("expected '=' after '!'");
  4366. break;
  4367. case '*':
  4368. if (parser->matchchar('*')) {
  4369. parser->set_next_token(TK("**")); // '**'
  4370. } else {
  4371. parser->set_next_token_2('=', TK("*"), TK("*="));
  4372. }
  4373. return;
  4374. case '/':
  4375. if(parser->matchchar('/')) {
  4376. parser->set_next_token_2('=', TK("//"), TK("//="));
  4377. } else {
  4378. parser->set_next_token_2('=', TK("/"), TK("/="));
  4379. }
  4380. return;
  4381. case '\r': break; // just ignore '\r'
  4382. case ' ': case '\t': parser->eat_spaces(); break;
  4383. case '\n': {
  4384. parser->set_next_token(TK("@eol"));
  4385. if(!parser->eat_indentation()) indentationError("unindent does not match any outer indentation level");
  4386. return;
  4387. }
  4388. default: {
  4389. if(c == 'f'){
  4390. if(parser->matchchar('\'')) {eatString('\'', F_STRING); return;}
  4391. if(parser->matchchar('"')) {eatString('"', F_STRING); return;}
  4392. }else if(c == 'r'){
  4393. if(parser->matchchar('\'')) {eatString('\'', RAW_STRING); return;}
  4394. if(parser->matchchar('"')) {eatString('"', RAW_STRING); return;}
  4395. }
  4396. if (c >= '0' && c <= '9') {
  4397. eatNumber();
  4398. return;
  4399. }
  4400. switch (parser->eat_name())
  4401. {
  4402. case 0: break;
  4403. case 1: syntaxError("invalid char: " + std::string(1, c));
  4404. case 2: syntaxError("invalid utf8 sequence: " + std::string(1, c));
  4405. case 3: syntaxError("@id contains invalid char"); break;
  4406. case 4: syntaxError("invalid JSON token"); break;
  4407. default: UNREACHABLE();
  4408. }
  4409. return;
  4410. }
  4411. }
  4412. }
  4413. parser->token_start = parser->curr_char;
  4414. parser->set_next_token(TK("@eof"));
  4415. }
  4416. inline _TokenType peek() {
  4417. return parser->curr.type;
  4418. }
  4419. // not sure this will work
  4420. _TokenType peek_next() {
  4421. if(parser->nexts.empty()) return TK("@eof");
  4422. return parser->nexts.front().type;
  4423. }
  4424. bool match(_TokenType expected) {
  4425. if (peek() != expected) return false;
  4426. lexToken();
  4427. return true;
  4428. }
  4429. void consume(_TokenType expected) {
  4430. if (!match(expected)){
  4431. _StrStream ss;
  4432. ss << "expected '" << TK_STR(expected) << "', but got '" << TK_STR(peek()) << "'";
  4433. syntaxError(ss.str());
  4434. }
  4435. }
  4436. bool matchNewLines(bool repl_throw=false) {
  4437. bool consumed = false;
  4438. if (peek() == TK("@eol")) {
  4439. while (peek() == TK("@eol")) lexToken();
  4440. consumed = true;
  4441. }
  4442. if (repl_throw && peek() == TK("@eof")){
  4443. throw NeedMoreLines(isCompilingClass);
  4444. }
  4445. return consumed;
  4446. }
  4447. bool matchEndStatement() {
  4448. if (match(TK(";"))) { matchNewLines(); return true; }
  4449. if (matchNewLines() || peek()==TK("@eof")) return true;
  4450. if (peek() == TK("@dedent")) return true;
  4451. return false;
  4452. }
  4453. void consumeEndStatement() {
  4454. if (!matchEndStatement()) syntaxError("expected statement end");
  4455. }
  4456. void exprLiteral() {
  4457. PyVar value = parser->prev.value;
  4458. int index = co()->add_const(value);
  4459. emit(OP_LOAD_CONST, index);
  4460. }
  4461. void exprFString() {
  4462. static const std::regex pattern(R"(\{(.*?)\})");
  4463. PyVar value = parser->prev.value;
  4464. _Str s = vm->PyStr_AS_C(value);
  4465. std::sregex_iterator begin(s.begin(), s.end(), pattern);
  4466. std::sregex_iterator end;
  4467. int size = 0;
  4468. int i = 0;
  4469. for(auto it = begin; it != end; it++) {
  4470. std::smatch m = *it;
  4471. if (i < m.position()) {
  4472. std::string literal = s.substr(i, m.position() - i);
  4473. emit(OP_LOAD_CONST, co()->add_const(vm->PyStr(literal)));
  4474. size++;
  4475. }
  4476. emit(OP_LOAD_EVAL_FN);
  4477. emit(OP_LOAD_CONST, co()->add_const(vm->PyStr(m[1].str())));
  4478. emit(OP_CALL, 1);
  4479. size++;
  4480. i = (int)(m.position() + m.length());
  4481. }
  4482. if (i < s.size()) {
  4483. std::string literal = s.substr(i, s.size() - i);
  4484. emit(OP_LOAD_CONST, co()->add_const(vm->PyStr(literal)));
  4485. size++;
  4486. }
  4487. emit(OP_BUILD_STRING, size);
  4488. }
  4489. void exprLambda() {
  4490. _Func func = pkpy::make_shared<Function>();
  4491. func->name = "<lambda>";
  4492. if(!match(TK(":"))){
  4493. __compileFunctionArgs(func, false);
  4494. consume(TK(":"));
  4495. }
  4496. func->code = pkpy::make_shared<CodeObject>(parser->src, func->name);
  4497. this->codes.push(func->code);
  4498. EXPR_TUPLE();
  4499. emit(OP_RETURN_VALUE);
  4500. func->code->optimize();
  4501. this->codes.pop();
  4502. emit(OP_LOAD_LAMBDA, co()->add_const(vm->PyFunction(func)));
  4503. }
  4504. void exprAssign() {
  4505. _TokenType op = parser->prev.type;
  4506. if(op == TK("=")) { // a = (expr)
  4507. EXPR_TUPLE();
  4508. emit(OP_STORE_REF);
  4509. }else{ // a += (expr) -> a = a + (expr)
  4510. emit(OP_DUP_TOP);
  4511. EXPR();
  4512. switch (op) {
  4513. case TK("+="): emit(OP_BINARY_OP, 0); break;
  4514. case TK("-="): emit(OP_BINARY_OP, 1); break;
  4515. case TK("*="): emit(OP_BINARY_OP, 2); break;
  4516. case TK("/="): emit(OP_BINARY_OP, 3); break;
  4517. case TK("//="): emit(OP_BINARY_OP, 4); break;
  4518. case TK("%="): emit(OP_BINARY_OP, 5); break;
  4519. case TK("&="): emit(OP_BITWISE_OP, 2); break;
  4520. case TK("|="): emit(OP_BITWISE_OP, 3); break;
  4521. case TK("^="): emit(OP_BITWISE_OP, 4); break;
  4522. default: UNREACHABLE();
  4523. }
  4524. emit(OP_STORE_REF);
  4525. }
  4526. }
  4527. void exprComma() {
  4528. int size = 1; // an expr is in the stack now
  4529. do {
  4530. EXPR(); // NOTE: "1," will fail, "1,2" will be ok
  4531. size++;
  4532. } while(match(TK(",")));
  4533. emit(OP_BUILD_SMART_TUPLE, size);
  4534. }
  4535. void exprOr() {
  4536. int patch = emit(OP_JUMP_IF_TRUE_OR_POP);
  4537. parsePrecedence(PREC_LOGICAL_OR);
  4538. patch_jump(patch);
  4539. }
  4540. void exprAnd() {
  4541. int patch = emit(OP_JUMP_IF_FALSE_OR_POP);
  4542. parsePrecedence(PREC_LOGICAL_AND);
  4543. patch_jump(patch);
  4544. }
  4545. void exprTernary() {
  4546. int patch = emit(OP_POP_JUMP_IF_FALSE);
  4547. EXPR(); // if true
  4548. int patch2 = emit(OP_JUMP_ABSOLUTE);
  4549. consume(TK(":"));
  4550. patch_jump(patch);
  4551. EXPR(); // if false
  4552. patch_jump(patch2);
  4553. }
  4554. void exprBinaryOp() {
  4555. _TokenType op = parser->prev.type;
  4556. parsePrecedence((Precedence)(rules[op].precedence + 1));
  4557. switch (op) {
  4558. case TK("+"): emit(OP_BINARY_OP, 0); break;
  4559. case TK("-"): emit(OP_BINARY_OP, 1); break;
  4560. case TK("*"): emit(OP_BINARY_OP, 2); break;
  4561. case TK("/"): emit(OP_BINARY_OP, 3); break;
  4562. case TK("//"): emit(OP_BINARY_OP, 4); break;
  4563. case TK("%"): emit(OP_BINARY_OP, 5); break;
  4564. case TK("**"): emit(OP_BINARY_OP, 6); break;
  4565. case TK("<"): emit(OP_COMPARE_OP, 0); break;
  4566. case TK("<="): emit(OP_COMPARE_OP, 1); break;
  4567. case TK("=="): emit(OP_COMPARE_OP, 2); break;
  4568. case TK("!="): emit(OP_COMPARE_OP, 3); break;
  4569. case TK(">"): emit(OP_COMPARE_OP, 4); break;
  4570. case TK(">="): emit(OP_COMPARE_OP, 5); break;
  4571. case TK("in"): emit(OP_CONTAINS_OP, 0); break;
  4572. case TK("not in"): emit(OP_CONTAINS_OP, 1); break;
  4573. case TK("is"): emit(OP_IS_OP, 0); break;
  4574. case TK("is not"): emit(OP_IS_OP, 1); break;
  4575. case TK("<<"): emit(OP_BITWISE_OP, 0); break;
  4576. case TK(">>"): emit(OP_BITWISE_OP, 1); break;
  4577. case TK("&"): emit(OP_BITWISE_OP, 2); break;
  4578. case TK("|"): emit(OP_BITWISE_OP, 3); break;
  4579. case TK("^"): emit(OP_BITWISE_OP, 4); break;
  4580. default: UNREACHABLE();
  4581. }
  4582. }
  4583. void exprUnaryOp() {
  4584. _TokenType op = parser->prev.type;
  4585. parsePrecedence((Precedence)(PREC_UNARY + 1));
  4586. switch (op) {
  4587. case TK("-"): emit(OP_UNARY_NEGATIVE); break;
  4588. case TK("not"): emit(OP_UNARY_NOT); break;
  4589. case TK("*"): syntaxError("cannot use '*' as unary operator"); break;
  4590. default: UNREACHABLE();
  4591. }
  4592. }
  4593. void exprGrouping() {
  4594. matchNewLines(mode()==SINGLE_MODE);
  4595. EXPR_TUPLE();
  4596. matchNewLines(mode()==SINGLE_MODE);
  4597. consume(TK(")"));
  4598. }
  4599. void exprList() {
  4600. int _patch = emit(OP_NO_OP);
  4601. int _body_start = co()->co_code.size();
  4602. int ARGC = 0;
  4603. do {
  4604. matchNewLines(mode()==SINGLE_MODE);
  4605. if (peek() == TK("]")) break;
  4606. EXPR(); ARGC++;
  4607. matchNewLines(mode()==SINGLE_MODE);
  4608. if(ARGC == 1 && match(TK("for"))) goto __LISTCOMP;
  4609. } while (match(TK(",")));
  4610. matchNewLines(mode()==SINGLE_MODE);
  4611. consume(TK("]"));
  4612. emit(OP_BUILD_LIST, ARGC);
  4613. return;
  4614. __LISTCOMP:
  4615. int _body_end_return = emit(OP_JUMP_ABSOLUTE, -1);
  4616. int _body_end = co()->co_code.size();
  4617. co()->co_code[_patch].op = OP_JUMP_ABSOLUTE;
  4618. co()->co_code[_patch].arg = _body_end;
  4619. emit(OP_BUILD_LIST, 0);
  4620. EXPR_FOR_VARS();consume(TK("in"));EXPR_TUPLE();
  4621. matchNewLines(mode()==SINGLE_MODE);
  4622. int _skipPatch = emit(OP_JUMP_ABSOLUTE);
  4623. int _cond_start = co()->co_code.size();
  4624. int _cond_end_return = -1;
  4625. if(match(TK("if"))) {
  4626. EXPR_TUPLE();
  4627. _cond_end_return = emit(OP_JUMP_ABSOLUTE, -1);
  4628. }
  4629. patch_jump(_skipPatch);
  4630. emit(OP_GET_ITER);
  4631. co()->__enterBlock(FOR_LOOP);
  4632. emit(OP_FOR_ITER);
  4633. if(_cond_end_return != -1) { // there is an if condition
  4634. emit(OP_JUMP_ABSOLUTE, _cond_start);
  4635. patch_jump(_cond_end_return);
  4636. int ifpatch = emit(OP_POP_JUMP_IF_FALSE);
  4637. emit(OP_JUMP_ABSOLUTE, _body_start);
  4638. patch_jump(_body_end_return);
  4639. emit(OP_LIST_APPEND);
  4640. patch_jump(ifpatch);
  4641. }else{
  4642. emit(OP_JUMP_ABSOLUTE, _body_start);
  4643. patch_jump(_body_end_return);
  4644. emit(OP_LIST_APPEND);
  4645. }
  4646. emit(OP_LOOP_CONTINUE, -1, true);
  4647. co()->__exitBlock();
  4648. matchNewLines(mode()==SINGLE_MODE);
  4649. consume(TK("]"));
  4650. }
  4651. void exprMap() {
  4652. bool parsing_dict = false;
  4653. int size = 0;
  4654. do {
  4655. matchNewLines(mode()==SINGLE_MODE);
  4656. if (peek() == TK("}")) break;
  4657. EXPR();
  4658. if(peek() == TK(":")) parsing_dict = true;
  4659. if(parsing_dict){
  4660. consume(TK(":"));
  4661. EXPR();
  4662. }
  4663. size++;
  4664. matchNewLines(mode()==SINGLE_MODE);
  4665. } while (match(TK(",")));
  4666. consume(TK("}"));
  4667. if(size == 0 || parsing_dict) emit(OP_BUILD_MAP, size);
  4668. else emit(OP_BUILD_SET, size);
  4669. }
  4670. void exprCall() {
  4671. int ARGC = 0;
  4672. int KWARGC = 0;
  4673. do {
  4674. matchNewLines(mode()==SINGLE_MODE);
  4675. if (peek() == TK(")")) break;
  4676. if(peek() == TK("@id") && peek_next() == TK("=")) {
  4677. consume(TK("@id"));
  4678. const _Str& key = parser->prev.str();
  4679. emit(OP_LOAD_CONST, co()->add_const(vm->PyStr(key)));
  4680. consume(TK("="));
  4681. EXPR();
  4682. KWARGC++;
  4683. } else{
  4684. if(KWARGC > 0) syntaxError("positional argument follows keyword argument");
  4685. EXPR();
  4686. ARGC++;
  4687. }
  4688. matchNewLines(mode()==SINGLE_MODE);
  4689. } while (match(TK(",")));
  4690. consume(TK(")"));
  4691. emit(OP_CALL, (KWARGC << 16) | ARGC);
  4692. }
  4693. void exprName() {
  4694. Token tkname = parser->prev;
  4695. int index = co()->add_name(
  4696. tkname.str(),
  4697. codes.size()>1 ? NAME_LOCAL : NAME_GLOBAL
  4698. );
  4699. emit(OP_LOAD_NAME_REF, index);
  4700. }
  4701. void exprAttrib() {
  4702. consume(TK("@id"));
  4703. const _Str& name = parser->prev.str();
  4704. int index = co()->add_name(name, NAME_ATTR);
  4705. emit(OP_BUILD_ATTR_REF, index);
  4706. }
  4707. // [:], [:b]
  4708. // [a], [a:], [a:b]
  4709. void exprSubscript() {
  4710. if(match(TK(":"))){
  4711. emit(OP_LOAD_NONE);
  4712. if(match(TK("]"))){
  4713. emit(OP_LOAD_NONE);
  4714. }else{
  4715. EXPR_TUPLE();
  4716. consume(TK("]"));
  4717. }
  4718. emit(OP_BUILD_SLICE);
  4719. }else{
  4720. EXPR_TUPLE();
  4721. if(match(TK(":"))){
  4722. if(match(TK("]"))){
  4723. emit(OP_LOAD_NONE);
  4724. }else{
  4725. EXPR_TUPLE();
  4726. consume(TK("]"));
  4727. }
  4728. emit(OP_BUILD_SLICE);
  4729. }else{
  4730. consume(TK("]"));
  4731. }
  4732. }
  4733. emit(OP_BUILD_INDEX_REF);
  4734. }
  4735. void exprValue() {
  4736. _TokenType op = parser->prev.type;
  4737. switch (op) {
  4738. case TK("None"): emit(OP_LOAD_NONE); break;
  4739. case TK("True"): emit(OP_LOAD_TRUE); break;
  4740. case TK("False"): emit(OP_LOAD_FALSE); break;
  4741. case TK("..."): emit(OP_LOAD_ELLIPSIS); break;
  4742. default: UNREACHABLE();
  4743. }
  4744. }
  4745. int emit(Opcode opcode, int arg=-1, bool keepline=false) {
  4746. int line = parser->prev.line;
  4747. co()->co_code.push_back(
  4748. Bytecode{(uint8_t)opcode, arg, line, (uint16_t)co()->_currBlockIndex}
  4749. );
  4750. int i = co()->co_code.size() - 1;
  4751. if(keepline && i>=1) co()->co_code[i].line = co()->co_code[i-1].line;
  4752. return i;
  4753. }
  4754. inline void patch_jump(int addr_index) {
  4755. int target = co()->co_code.size();
  4756. co()->co_code[addr_index].arg = target;
  4757. }
  4758. void compileBlockBody(){
  4759. __compileBlockBody(&Compiler::compileStatement);
  4760. }
  4761. void __compileBlockBody(CompilerAction action) {
  4762. consume(TK(":"));
  4763. if(!matchNewLines(mode()==SINGLE_MODE)){
  4764. syntaxError("expected a new line after ':'");
  4765. }
  4766. consume(TK("@indent"));
  4767. while (peek() != TK("@dedent")) {
  4768. matchNewLines();
  4769. (this->*action)();
  4770. matchNewLines();
  4771. }
  4772. consume(TK("@dedent"));
  4773. }
  4774. Token compileImportPath() {
  4775. consume(TK("@id"));
  4776. Token tkmodule = parser->prev;
  4777. int index = co()->add_name(tkmodule.str(), NAME_GLOBAL);
  4778. emit(OP_IMPORT_NAME, index);
  4779. return tkmodule;
  4780. }
  4781. // import a as b
  4782. void compileRegularImport() {
  4783. do {
  4784. Token tkmodule = compileImportPath();
  4785. if (match(TK("as"))) {
  4786. consume(TK("@id"));
  4787. tkmodule = parser->prev;
  4788. }
  4789. int index = co()->add_name(tkmodule.str(), NAME_GLOBAL);
  4790. emit(OP_STORE_NAME, index);
  4791. } while (match(TK(",")));
  4792. consumeEndStatement();
  4793. }
  4794. // from a import b as c, d as e
  4795. void compileFromImport() {
  4796. Token tkmodule = compileImportPath();
  4797. consume(TK("import"));
  4798. do {
  4799. emit(OP_DUP_TOP);
  4800. consume(TK("@id"));
  4801. Token tkname = parser->prev;
  4802. int index = co()->add_name(tkname.str(), NAME_GLOBAL);
  4803. emit(OP_BUILD_ATTR_REF, index);
  4804. if (match(TK("as"))) {
  4805. consume(TK("@id"));
  4806. tkname = parser->prev;
  4807. }
  4808. index = co()->add_name(tkname.str(), NAME_GLOBAL);
  4809. emit(OP_STORE_NAME, index);
  4810. } while (match(TK(",")));
  4811. emit(OP_POP_TOP);
  4812. consumeEndStatement();
  4813. }
  4814. void parsePrecedence(Precedence precedence) {
  4815. lexToken();
  4816. GrammarFn prefix = rules[parser->prev.type].prefix;
  4817. if (prefix == nullptr) syntaxError(_Str("expected an expression, but got ") + TK_STR(parser->prev.type));
  4818. (this->*prefix)();
  4819. while (rules[peek()].precedence >= precedence) {
  4820. lexToken();
  4821. _TokenType op = parser->prev.type;
  4822. GrammarFn infix = rules[op].infix;
  4823. if(infix == nullptr) throw std::runtime_error("(infix == nullptr) is true");
  4824. (this->*infix)();
  4825. }
  4826. }
  4827. void compileIfStatement() {
  4828. matchNewLines();
  4829. EXPR_TUPLE();
  4830. int ifpatch = emit(OP_POP_JUMP_IF_FALSE);
  4831. compileBlockBody();
  4832. if (match(TK("elif"))) {
  4833. int exit_jump = emit(OP_JUMP_ABSOLUTE);
  4834. patch_jump(ifpatch);
  4835. compileIfStatement();
  4836. patch_jump(exit_jump);
  4837. } else if (match(TK("else"))) {
  4838. int exit_jump = emit(OP_JUMP_ABSOLUTE);
  4839. patch_jump(ifpatch);
  4840. compileBlockBody();
  4841. patch_jump(exit_jump);
  4842. } else {
  4843. patch_jump(ifpatch);
  4844. }
  4845. }
  4846. void compileWhileLoop() {
  4847. co()->__enterBlock(WHILE_LOOP);
  4848. EXPR_TUPLE();
  4849. int patch = emit(OP_POP_JUMP_IF_FALSE);
  4850. compileBlockBody();
  4851. emit(OP_LOOP_CONTINUE, -1, true);
  4852. patch_jump(patch);
  4853. co()->__exitBlock();
  4854. }
  4855. void EXPR_FOR_VARS(){
  4856. int size = 0;
  4857. do {
  4858. consume(TK("@id"));
  4859. exprName(); size++;
  4860. } while (match(TK(",")));
  4861. if(size > 1) emit(OP_BUILD_SMART_TUPLE, size);
  4862. }
  4863. void compileForLoop() {
  4864. EXPR_FOR_VARS();consume(TK("in")); EXPR_TUPLE();
  4865. emit(OP_GET_ITER);
  4866. co()->__enterBlock(FOR_LOOP);
  4867. emit(OP_FOR_ITER);
  4868. compileBlockBody();
  4869. emit(OP_LOOP_CONTINUE, -1, true);
  4870. co()->__exitBlock();
  4871. }
  4872. void compileTryExcept() {
  4873. co()->__enterBlock(TRY_EXCEPT);
  4874. compileBlockBody();
  4875. int patch = emit(OP_JUMP_ABSOLUTE);
  4876. co()->__exitBlock();
  4877. consume(TK("except"));
  4878. if(match(TK("@id"))){ // exception name
  4879. compileBlockBody();
  4880. }
  4881. if(match(TK("finally"))){
  4882. consume(TK(":"));
  4883. syntaxError("finally is not supported yet");
  4884. }
  4885. patch_jump(patch);
  4886. }
  4887. void compileStatement() {
  4888. if (match(TK("break"))) {
  4889. if (!co()->__isCurrBlockLoop()) syntaxError("'break' outside loop");
  4890. consumeEndStatement();
  4891. emit(OP_LOOP_BREAK);
  4892. } else if (match(TK("continue"))) {
  4893. if (!co()->__isCurrBlockLoop()) syntaxError("'continue' not properly in loop");
  4894. consumeEndStatement();
  4895. emit(OP_LOOP_CONTINUE);
  4896. } else if (match(TK("return"))) {
  4897. if (codes.size() == 1)
  4898. syntaxError("'return' outside function");
  4899. if(matchEndStatement()){
  4900. emit(OP_LOAD_NONE);
  4901. }else{
  4902. EXPR_TUPLE();
  4903. consumeEndStatement();
  4904. }
  4905. emit(OP_RETURN_VALUE, -1, true);
  4906. } else if (match(TK("if"))) {
  4907. compileIfStatement();
  4908. } else if (match(TK("while"))) {
  4909. compileWhileLoop();
  4910. } else if (match(TK("for"))) {
  4911. compileForLoop();
  4912. } else if (match(TK("try"))) {
  4913. compileTryExcept();
  4914. }else if(match(TK("assert"))){
  4915. EXPR();
  4916. emit(OP_ASSERT);
  4917. consumeEndStatement();
  4918. } else if(match(TK("with"))){
  4919. EXPR();
  4920. consume(TK("as"));
  4921. consume(TK("@id"));
  4922. Token tkname = parser->prev;
  4923. int index = co()->add_name(
  4924. tkname.str(),
  4925. codes.size()>1 ? NAME_LOCAL : NAME_GLOBAL
  4926. );
  4927. emit(OP_STORE_NAME, index);
  4928. emit(OP_LOAD_NAME_REF, index);
  4929. emit(OP_WITH_ENTER);
  4930. compileBlockBody();
  4931. emit(OP_LOAD_NAME_REF, index);
  4932. emit(OP_WITH_EXIT);
  4933. } else if(match(TK("label"))){
  4934. if(mode() != EXEC_MODE) syntaxError("'label' is only available in EXEC_MODE");
  4935. consume(TK(".")); consume(TK("@id"));
  4936. co()->add_label(parser->prev.str());
  4937. consumeEndStatement();
  4938. } else if(match(TK("goto"))){
  4939. // https://entrian.com/goto/
  4940. if(mode() != EXEC_MODE) syntaxError("'goto' is only available in EXEC_MODE");
  4941. consume(TK(".")); consume(TK("@id"));
  4942. emit(OP_LOAD_CONST, co()->add_const(vm->PyStr(parser->prev.str())));
  4943. emit(OP_GOTO);
  4944. consumeEndStatement();
  4945. } else if(match(TK("raise"))){
  4946. consume(TK("@id")); // dummy exception type
  4947. emit(OP_LOAD_CONST, co()->add_const(vm->PyStr(parser->prev.str())));
  4948. if(match(TK("("))){
  4949. EXPR();
  4950. consume(TK(")"));
  4951. }else{
  4952. emit(OP_LOAD_NONE); // ...?
  4953. }
  4954. emit(OP_RAISE_ERROR);
  4955. consumeEndStatement();
  4956. } else if(match(TK("del"))){
  4957. EXPR();
  4958. emit(OP_DELETE_REF);
  4959. consumeEndStatement();
  4960. } else if(match(TK("global"))){
  4961. do {
  4962. consume(TK("@id"));
  4963. co()->co_global_names.push_back(parser->prev.str());
  4964. } while (match(TK(",")));
  4965. consumeEndStatement();
  4966. } else if(match(TK("pass"))){
  4967. consumeEndStatement();
  4968. } else {
  4969. EXPR_ANY();
  4970. consumeEndStatement();
  4971. // If last op is not an assignment, pop the result.
  4972. uint8_t lastOp = co()->co_code.back().op;
  4973. if( lastOp!=OP_STORE_NAME && lastOp!=OP_STORE_REF){
  4974. if(mode()==SINGLE_MODE && parser->indents.top()==0) emit(OP_PRINT_EXPR);
  4975. emit(OP_POP_TOP);
  4976. }
  4977. }
  4978. }
  4979. void compileClass(){
  4980. consume(TK("@id"));
  4981. int clsNameIdx = co()->add_name(parser->prev.str(), NAME_GLOBAL);
  4982. int superClsNameIdx = -1;
  4983. if(match(TK("("))){
  4984. consume(TK("@id"));
  4985. superClsNameIdx = co()->add_name(parser->prev.str(), NAME_GLOBAL);
  4986. consume(TK(")"));
  4987. }
  4988. emit(OP_LOAD_NONE);
  4989. isCompilingClass = true;
  4990. __compileBlockBody(&Compiler::compileFunction);
  4991. isCompilingClass = false;
  4992. if(superClsNameIdx == -1) emit(OP_LOAD_NONE);
  4993. else emit(OP_LOAD_NAME_REF, superClsNameIdx);
  4994. emit(OP_BUILD_CLASS, clsNameIdx);
  4995. }
  4996. void __compileFunctionArgs(_Func func, bool enableTypeHints){
  4997. int state = 0; // 0 for args, 1 for *args, 2 for k=v, 3 for **kwargs
  4998. do {
  4999. if(state == 3) syntaxError("**kwargs should be the last argument");
  5000. matchNewLines();
  5001. if(match(TK("*"))){
  5002. if(state < 1) state = 1;
  5003. else syntaxError("*args should be placed before **kwargs");
  5004. }
  5005. else if(match(TK("**"))){
  5006. state = 3;
  5007. }
  5008. consume(TK("@id"));
  5009. const _Str& name = parser->prev.str();
  5010. if(func->hasName(name)) syntaxError("duplicate argument name");
  5011. // eat type hints
  5012. if(enableTypeHints && match(TK(":"))) consume(TK("@id"));
  5013. if(state == 0 && peek() == TK("=")) state = 2;
  5014. switch (state)
  5015. {
  5016. case 0: func->args.push_back(name); break;
  5017. case 1: func->starredArg = name; state+=1; break;
  5018. case 2: {
  5019. consume(TK("="));
  5020. PyVarOrNull value = readLiteral();
  5021. if(value == nullptr){
  5022. syntaxError(_Str("expect a literal, not ") + TK_STR(parser->curr.type));
  5023. }
  5024. func->kwArgs[name] = value;
  5025. func->kwArgsOrder.push_back(name);
  5026. } break;
  5027. case 3: syntaxError("**kwargs is not supported yet"); break;
  5028. }
  5029. } while (match(TK(",")));
  5030. }
  5031. void compileFunction(){
  5032. if(isCompilingClass){
  5033. if(match(TK("pass"))) return;
  5034. consume(TK("def"));
  5035. }
  5036. _Func func = pkpy::make_shared<Function>();
  5037. consume(TK("@id"));
  5038. func->name = parser->prev.str();
  5039. if (match(TK("(")) && !match(TK(")"))) {
  5040. __compileFunctionArgs(func, true);
  5041. consume(TK(")"));
  5042. }
  5043. // eat type hints
  5044. if(match(TK("->"))) consume(TK("@id"));
  5045. func->code = pkpy::make_shared<CodeObject>(parser->src, func->name);
  5046. this->codes.push(func->code);
  5047. compileBlockBody();
  5048. func->code->optimize();
  5049. this->codes.pop();
  5050. emit(OP_LOAD_CONST, co()->add_const(vm->PyFunction(func)));
  5051. if(!isCompilingClass) emit(OP_STORE_FUNCTION);
  5052. }
  5053. PyVarOrNull readLiteral(){
  5054. if(match(TK("-"))){
  5055. consume(TK("@num"));
  5056. PyVar val = parser->prev.value;
  5057. return vm->num_negated(val);
  5058. }
  5059. if(match(TK("@num"))) return parser->prev.value;
  5060. if(match(TK("@str"))) return parser->prev.value;
  5061. if(match(TK("True"))) return vm->PyBool(true);
  5062. if(match(TK("False"))) return vm->PyBool(false);
  5063. if(match(TK("None"))) return vm->None;
  5064. if(match(TK("..."))) return vm->Ellipsis;
  5065. return nullptr;
  5066. }
  5067. void compileTopLevelStatement() {
  5068. if (match(TK("class"))) {
  5069. compileClass();
  5070. } else if (match(TK("def"))) {
  5071. compileFunction();
  5072. } else if (match(TK("import"))) {
  5073. compileRegularImport();
  5074. } else if (match(TK("from"))) {
  5075. compileFromImport();
  5076. } else {
  5077. compileStatement();
  5078. }
  5079. }
  5080. bool _used = false;
  5081. _Code __fillCode(){
  5082. // can only be called once
  5083. if(_used) UNREACHABLE();
  5084. _used = true;
  5085. _Code code = pkpy::make_shared<CodeObject>(parser->src, _Str("<module>"));
  5086. codes.push(code);
  5087. // Lex initial tokens. current <-- next.
  5088. lexToken();
  5089. lexToken();
  5090. matchNewLines();
  5091. if(mode()==EVAL_MODE) {
  5092. EXPR_TUPLE();
  5093. consume(TK("@eof"));
  5094. code->optimize();
  5095. return code;
  5096. }else if(mode()==JSON_MODE){
  5097. PyVarOrNull value = readLiteral();
  5098. if(value != nullptr) emit(OP_LOAD_CONST, code->add_const(value));
  5099. else if(match(TK("{"))) exprMap();
  5100. else if(match(TK("["))) exprList();
  5101. else syntaxError("expect a JSON object or array");
  5102. consume(TK("@eof"));
  5103. return code; // no need to optimize for JSON decoding
  5104. }
  5105. while (!match(TK("@eof"))) {
  5106. compileTopLevelStatement();
  5107. matchNewLines();
  5108. }
  5109. code->optimize();
  5110. return code;
  5111. }
  5112. /***** Error Reporter *****/
  5113. _Str getLineSnapshot(){
  5114. int lineno = parser->curr.line;
  5115. const char* cursor = parser->curr.start;
  5116. // if error occurs in lexing, lineno should be `parser->current_line`
  5117. if(lexingCnt > 0){
  5118. lineno = parser->current_line;
  5119. cursor = parser->curr_char;
  5120. }
  5121. if(parser->peekchar() == '\n') lineno--;
  5122. return parser->src->snapshot(lineno, cursor);
  5123. }
  5124. void syntaxError(_Str msg){ throw CompileError("SyntaxError", msg, getLineSnapshot()); }
  5125. void indentationError(_Str msg){ throw CompileError("IndentationError", msg, getLineSnapshot()); }
  5126. void unexpectedError(_Str msg){ throw CompileError("UnexpectedError", msg, getLineSnapshot()); }
  5127. };
  5128. enum InputResult {
  5129. NEED_MORE_LINES = 0,
  5130. EXEC_STARTED = 1,
  5131. EXEC_SKIPPED = 2,
  5132. };
  5133. class REPL {
  5134. protected:
  5135. int need_more_lines = 0;
  5136. std::string buffer;
  5137. VM* vm;
  5138. public:
  5139. REPL(VM* vm) : vm(vm){
  5140. (*vm->_stdout) << ("pocketpy " PK_VERSION " (" __DATE__ ", " __TIME__ ")\n");
  5141. (*vm->_stdout) << ("https://github.com/blueloveTH/pocketpy" "\n");
  5142. (*vm->_stdout) << ("Type \"exit()\" to exit." "\n");
  5143. }
  5144. InputResult input(std::string line){
  5145. CompileMode mode = SINGLE_MODE;
  5146. if(need_more_lines){
  5147. buffer += line;
  5148. buffer += '\n';
  5149. int n = buffer.size();
  5150. if(n>=need_more_lines){
  5151. for(int i=buffer.size()-need_more_lines; i<buffer.size(); i++){
  5152. if(buffer[i] != '\n') goto __NOT_ENOUGH_LINES;
  5153. }
  5154. need_more_lines = 0;
  5155. line = buffer;
  5156. buffer.clear();
  5157. mode = EXEC_MODE;
  5158. }else{
  5159. __NOT_ENOUGH_LINES:
  5160. return NEED_MORE_LINES;
  5161. }
  5162. }else{
  5163. if(line.empty()) return EXEC_SKIPPED;
  5164. }
  5165. try{
  5166. vm->exec(line, "<stdin>", mode);
  5167. }catch(NeedMoreLines& ne){
  5168. buffer += line;
  5169. buffer += '\n';
  5170. need_more_lines = ne.isClassDef ? 3 : 2;
  5171. if (need_more_lines) return NEED_MORE_LINES;
  5172. }
  5173. return EXEC_STARTED;
  5174. }
  5175. };
  5176. _Code VM::compile(_Str source, _Str filename, CompileMode mode) {
  5177. Compiler compiler(this, source.c_str(), filename, mode);
  5178. try{
  5179. return compiler.__fillCode();
  5180. }catch(_Error& e){
  5181. throw e;
  5182. }catch(std::exception& e){
  5183. throw CompileError("UnexpectedError", e.what(), compiler.getLineSnapshot());
  5184. }
  5185. }
  5186. #define BIND_NUM_ARITH_OPT(name, op) \
  5187. _vm->bindMethodMulti<1>({"int","float"}, #name, [](VM* vm, const pkpy::ArgList& args){ \
  5188. if(args[0]->is_type(vm->_tp_int) && args[1]->is_type(vm->_tp_int)){ \
  5189. return vm->PyInt(vm->PyInt_AS_C(args[0]) op vm->PyInt_AS_C(args[1])); \
  5190. }else{ \
  5191. return vm->PyFloat(vm->num_to_float(args[0]) op vm->num_to_float(args[1])); \
  5192. } \
  5193. });
  5194. #define BIND_NUM_LOGICAL_OPT(name, op, is_eq) \
  5195. _vm->bindMethodMulti<1>({"int","float"}, #name, [](VM* vm, const pkpy::ArgList& args){ \
  5196. bool _0 = args[0]->is_type(vm->_tp_int) || args[0]->is_type(vm->_tp_float); \
  5197. bool _1 = args[1]->is_type(vm->_tp_int) || args[1]->is_type(vm->_tp_float); \
  5198. if(!_0 || !_1){ \
  5199. if constexpr(is_eq) return vm->PyBool(args[0].get() op args[1].get()); \
  5200. vm->typeError("unsupported operand type(s) for " #op ); \
  5201. } \
  5202. return vm->PyBool(vm->num_to_float(args[0]) op vm->num_to_float(args[1])); \
  5203. });
  5204. void __initializeBuiltinFunctions(VM* _vm) {
  5205. BIND_NUM_ARITH_OPT(__add__, +)
  5206. BIND_NUM_ARITH_OPT(__sub__, -)
  5207. BIND_NUM_ARITH_OPT(__mul__, *)
  5208. BIND_NUM_LOGICAL_OPT(__lt__, <, false)
  5209. BIND_NUM_LOGICAL_OPT(__le__, <=, false)
  5210. BIND_NUM_LOGICAL_OPT(__gt__, >, false)
  5211. BIND_NUM_LOGICAL_OPT(__ge__, >=, false)
  5212. BIND_NUM_LOGICAL_OPT(__eq__, ==, true)
  5213. BIND_NUM_LOGICAL_OPT(__ne__, !=, true)
  5214. #undef BIND_NUM_ARITH_OPT
  5215. #undef BIND_NUM_LOGICAL_OPT
  5216. _vm->bindBuiltinFunc<1>("__sys_stdout_write", [](VM* vm, const pkpy::ArgList& args) {
  5217. (*vm->_stdout) << vm->PyStr_AS_C(args[0]);
  5218. return vm->None;
  5219. });
  5220. _vm->bindBuiltinFunc<0>("super", [](VM* vm, const pkpy::ArgList& args) {
  5221. auto it = vm->top_frame()->f_locals().find(m_self);
  5222. if(it == vm->top_frame()->f_locals().end()) vm->typeError("super() can only be called in a class method");
  5223. return vm->new_object(vm->_tp_super, it->second);
  5224. });
  5225. _vm->bindBuiltinFunc<1>("eval", [](VM* vm, const pkpy::ArgList& args) {
  5226. _Code code = vm->compile(vm->PyStr_AS_C(args[0]), "<eval>", EVAL_MODE);
  5227. return vm->_exec(code, vm->top_frame()->_module, vm->top_frame()->_locals);
  5228. });
  5229. _vm->bindBuiltinFunc<1>("exec", [](VM* vm, const pkpy::ArgList& args) {
  5230. _Code code = vm->compile(vm->PyStr_AS_C(args[0]), "<exec>", EXEC_MODE);
  5231. vm->_exec(code, vm->top_frame()->_module, vm->top_frame()->_locals);
  5232. return vm->None;
  5233. });
  5234. _vm->bindBuiltinFunc<1>("repr", CPP_LAMBDA(vm->asRepr(args[0])));
  5235. _vm->bindBuiltinFunc<1>("hash", CPP_LAMBDA(vm->PyInt(vm->hash(args[0]))));
  5236. _vm->bindBuiltinFunc<1>("len", CPP_LAMBDA(vm->call(args[0], __len__, pkpy::noArg())));
  5237. _vm->bindBuiltinFunc<1>("chr", [](VM* vm, const pkpy::ArgList& args) {
  5238. i64 i = vm->PyInt_AS_C(args[0]);
  5239. if (i < 0 || i > 128) vm->valueError("chr() arg not in range(128)");
  5240. return vm->PyStr(std::string(1, (char)i));
  5241. });
  5242. _vm->bindBuiltinFunc<1>("ord", [](VM* vm, const pkpy::ArgList& args) {
  5243. _Str s = vm->PyStr_AS_C(args[0]);
  5244. if (s.size() != 1) vm->typeError("ord() expected an ASCII character");
  5245. return vm->PyInt((i64)(s.c_str()[0]));
  5246. });
  5247. _vm->bindBuiltinFunc<2>("hasattr", [](VM* vm, const pkpy::ArgList& args) {
  5248. return vm->PyBool(vm->getattr(args[0], vm->PyStr_AS_C(args[1]), false) != nullptr);
  5249. });
  5250. _vm->bindBuiltinFunc<3>("setattr", [](VM* vm, const pkpy::ArgList& args) {
  5251. PyVar obj = args[0];
  5252. vm->setattr(obj, vm->PyStr_AS_C(args[1]), args[2]);
  5253. return vm->None;
  5254. });
  5255. _vm->bindBuiltinFunc<2>("getattr", [](VM* vm, const pkpy::ArgList& args) {
  5256. _Str name = vm->PyStr_AS_C(args[1]);
  5257. return vm->getattr(args[0], name);
  5258. });
  5259. _vm->bindBuiltinFunc<1>("hex", [](VM* vm, const pkpy::ArgList& args) {
  5260. std::stringstream ss;
  5261. ss << std::hex << vm->PyInt_AS_C(args[0]);
  5262. return vm->PyStr("0x" + ss.str());
  5263. });
  5264. _vm->bindBuiltinFunc<1>("dir", [](VM* vm, const pkpy::ArgList& args) {
  5265. std::vector<_Str> names;
  5266. for (auto& [k, _] : args[0]->attribs) names.push_back(k);
  5267. for (auto& [k, _] : args[0]->_type->attribs) {
  5268. if (k.find("__") == 0) continue;
  5269. if (std::find(names.begin(), names.end(), k) == names.end()) names.push_back(k);
  5270. }
  5271. PyVarList ret;
  5272. for (const auto& name : names) ret.push_back(vm->PyStr(name));
  5273. std::sort(ret.begin(), ret.end(), [vm](const PyVar& a, const PyVar& b) {
  5274. return vm->PyStr_AS_C(a) < vm->PyStr_AS_C(b);
  5275. });
  5276. return vm->PyList(ret);
  5277. });
  5278. _vm->bindMethod<0>("object", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5279. PyVar _self = args[0];
  5280. std::stringstream ss;
  5281. ss << std::hex << (uintptr_t)_self.get();
  5282. _Str s = "<" + UNION_TP_NAME(_self) + " object at 0x" + ss.str() + ">";
  5283. return vm->PyStr(s);
  5284. });
  5285. _vm->bindMethod<1>("object", "__eq__", CPP_LAMBDA(vm->PyBool(args[0] == args[1])));
  5286. _vm->bindMethod<1>("object", "__ne__", CPP_LAMBDA(vm->PyBool(args[0] != args[1])));
  5287. _vm->bindStaticMethod<1>("type", "__new__", CPP_LAMBDA(args[0]->_type));
  5288. _vm->bindStaticMethod<-1>("range", "__new__", [](VM* vm, const pkpy::ArgList& args) {
  5289. _Range r;
  5290. switch (args.size()) {
  5291. case 1: r.stop = vm->PyInt_AS_C(args[0]); break;
  5292. case 2: r.start = vm->PyInt_AS_C(args[0]); r.stop = vm->PyInt_AS_C(args[1]); break;
  5293. case 3: r.start = vm->PyInt_AS_C(args[0]); r.stop = vm->PyInt_AS_C(args[1]); r.step = vm->PyInt_AS_C(args[2]); break;
  5294. default: vm->typeError("expected 1-3 arguments, but got " + std::to_string(args.size()));
  5295. }
  5296. return vm->PyRange(r);
  5297. });
  5298. _vm->bindMethod<0>("range", "__iter__", CPP_LAMBDA(
  5299. vm->PyIter(pkpy::make_shared<BaseIterator, RangeIterator>(vm, args[0]))
  5300. ));
  5301. _vm->bindMethod<0>("NoneType", "__repr__", CPP_LAMBDA(vm->PyStr("None")));
  5302. _vm->bindMethod<0>("NoneType", "__json__", CPP_LAMBDA(vm->PyStr("null")));
  5303. _vm->bindMethodMulti<1>({"int", "float"}, "__truediv__", [](VM* vm, const pkpy::ArgList& args) {
  5304. f64 rhs = vm->num_to_float(args[1]);
  5305. if (rhs == 0) vm->zeroDivisionError();
  5306. return vm->PyFloat(vm->num_to_float(args[0]) / rhs);
  5307. });
  5308. _vm->bindMethodMulti<1>({"int", "float"}, "__pow__", [](VM* vm, const pkpy::ArgList& args) {
  5309. if(args[0]->is_type(vm->_tp_int) && args[1]->is_type(vm->_tp_int)){
  5310. return vm->PyInt((i64)round(pow(vm->PyInt_AS_C(args[0]), vm->PyInt_AS_C(args[1]))));
  5311. }else{
  5312. return vm->PyFloat((f64)pow(vm->num_to_float(args[0]), vm->num_to_float(args[1])));
  5313. }
  5314. });
  5315. /************ PyInt ************/
  5316. _vm->bindStaticMethod<1>("int", "__new__", [](VM* vm, const pkpy::ArgList& args) {
  5317. if (args[0]->is_type(vm->_tp_int)) return args[0];
  5318. if (args[0]->is_type(vm->_tp_float)) return vm->PyInt((i64)vm->PyFloat_AS_C(args[0]));
  5319. if (args[0]->is_type(vm->_tp_bool)) return vm->PyInt(vm->PyBool_AS_C(args[0]) ? 1 : 0);
  5320. if (args[0]->is_type(vm->_tp_str)) {
  5321. const _Str& s = vm->PyStr_AS_C(args[0]);
  5322. try{
  5323. size_t parsed = 0;
  5324. i64 val = std::stoll(s, &parsed, 10);
  5325. if(parsed != s.size()) throw std::invalid_argument("");
  5326. return vm->PyInt(val);
  5327. }catch(std::invalid_argument&){
  5328. vm->valueError("invalid literal for int(): '" + s + "'");
  5329. }
  5330. }
  5331. vm->typeError("int() argument must be a int, float, bool or str");
  5332. return vm->None;
  5333. });
  5334. _vm->bindMethod<1>("int", "__floordiv__", [](VM* vm, const pkpy::ArgList& args) {
  5335. i64 rhs = vm->PyInt_AS_C(args[1]);
  5336. if(rhs == 0) vm->zeroDivisionError();
  5337. return vm->PyInt(vm->PyInt_AS_C(args[0]) / rhs);
  5338. });
  5339. _vm->bindMethod<1>("int", "__mod__", [](VM* vm, const pkpy::ArgList& args) {
  5340. i64 rhs = vm->PyInt_AS_C(args[1]);
  5341. if(rhs == 0) vm->zeroDivisionError();
  5342. return vm->PyInt(vm->PyInt_AS_C(args[0]) % rhs);
  5343. });
  5344. _vm->bindMethod<0>("int", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5345. return vm->PyStr(std::to_string(vm->PyInt_AS_C(args[0])));
  5346. });
  5347. _vm->bindMethod<0>("int", "__json__", [](VM* vm, const pkpy::ArgList& args) {
  5348. return vm->PyStr(std::to_string((int)vm->PyInt_AS_C(args[0])));
  5349. });
  5350. #define __INT_BITWISE_OP(name,op) \
  5351. _vm->bindMethod<1>("int", #name, [](VM* vm, const pkpy::ArgList& args) { \
  5352. return vm->PyInt(vm->PyInt_AS_C(args[0]) op vm->PyInt_AS_C(args[1])); \
  5353. });
  5354. __INT_BITWISE_OP(__lshift__, <<)
  5355. __INT_BITWISE_OP(__rshift__, >>)
  5356. __INT_BITWISE_OP(__and__, &)
  5357. __INT_BITWISE_OP(__or__, |)
  5358. __INT_BITWISE_OP(__xor__, ^)
  5359. #undef __INT_BITWISE_OP
  5360. /************ PyFloat ************/
  5361. _vm->bindStaticMethod<1>("float", "__new__", [](VM* vm, const pkpy::ArgList& args) {
  5362. if (args[0]->is_type(vm->_tp_int)) return vm->PyFloat((f64)vm->PyInt_AS_C(args[0]));
  5363. if (args[0]->is_type(vm->_tp_float)) return args[0];
  5364. if (args[0]->is_type(vm->_tp_bool)) return vm->PyFloat(vm->PyBool_AS_C(args[0]) ? 1.0 : 0.0);
  5365. if (args[0]->is_type(vm->_tp_str)) {
  5366. const _Str& s = vm->PyStr_AS_C(args[0]);
  5367. if(s == "inf") return vm->PyFloat(INFINITY);
  5368. if(s == "-inf") return vm->PyFloat(-INFINITY);
  5369. try{
  5370. f64 val = std::stod(s);
  5371. return vm->PyFloat(val);
  5372. }catch(std::invalid_argument&){
  5373. vm->valueError("invalid literal for float(): '" + s + "'");
  5374. }
  5375. }
  5376. vm->typeError("float() argument must be a int, float, bool or str");
  5377. return vm->None;
  5378. });
  5379. _vm->bindMethod<0>("float", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5380. f64 val = vm->PyFloat_AS_C(args[0]);
  5381. if(std::isinf(val) || std::isnan(val)) return vm->PyStr(std::to_string(val));
  5382. _StrStream ss;
  5383. ss << std::setprecision(std::numeric_limits<f64>::max_digits10-1) << val;
  5384. std::string s = ss.str();
  5385. if(std::all_of(s.begin()+1, s.end(), isdigit)) s += ".0";
  5386. return vm->PyStr(s);
  5387. });
  5388. _vm->bindMethod<0>("float", "__json__", [](VM* vm, const pkpy::ArgList& args) {
  5389. f64 val = vm->PyFloat_AS_C(args[0]);
  5390. if(std::isinf(val) || std::isnan(val)) vm->valueError("cannot jsonify 'nan' or 'inf'");
  5391. return vm->PyStr(std::to_string(val));
  5392. });
  5393. /************ PyString ************/
  5394. _vm->bindStaticMethod<1>("str", "__new__", CPP_LAMBDA(vm->asStr(args[0])));
  5395. _vm->bindMethod<1>("str", "__add__", [](VM* vm, const pkpy::ArgList& args) {
  5396. const _Str& lhs = vm->PyStr_AS_C(args[0]);
  5397. const _Str& rhs = vm->PyStr_AS_C(args[1]);
  5398. return vm->PyStr(lhs + rhs);
  5399. });
  5400. _vm->bindMethod<0>("str", "__len__", [](VM* vm, const pkpy::ArgList& args) {
  5401. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5402. return vm->PyInt(_self.u8_length());
  5403. });
  5404. _vm->bindMethod<1>("str", "__contains__", [](VM* vm, const pkpy::ArgList& args) {
  5405. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5406. const _Str& _other = vm->PyStr_AS_C(args[1]);
  5407. return vm->PyBool(_self.find(_other) != _Str::npos);
  5408. });
  5409. _vm->bindMethod<0>("str", "__str__", CPP_LAMBDA(args[0]));
  5410. _vm->bindMethod<0>("str", "__iter__", CPP_LAMBDA(
  5411. vm->PyIter(pkpy::make_shared<BaseIterator, StringIterator>(vm, args[0]))
  5412. ));
  5413. _vm->bindMethod<0>("str", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5414. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5415. return vm->PyStr(_self.__escape(true));
  5416. });
  5417. _vm->bindMethod<0>("str", "__json__", [](VM* vm, const pkpy::ArgList& args) {
  5418. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5419. return vm->PyStr(_self.__escape(false));
  5420. });
  5421. _vm->bindMethod<1>("str", "__eq__", [](VM* vm, const pkpy::ArgList& args) {
  5422. if(args[0]->is_type(vm->_tp_str) && args[1]->is_type(vm->_tp_str))
  5423. return vm->PyBool(vm->PyStr_AS_C(args[0]) == vm->PyStr_AS_C(args[1]));
  5424. return vm->PyBool(args[0] == args[1]);
  5425. });
  5426. _vm->bindMethod<1>("str", "__ne__", [](VM* vm, const pkpy::ArgList& args) {
  5427. if(args[0]->is_type(vm->_tp_str) && args[1]->is_type(vm->_tp_str))
  5428. return vm->PyBool(vm->PyStr_AS_C(args[0]) != vm->PyStr_AS_C(args[1]));
  5429. return vm->PyBool(args[0] != args[1]);
  5430. });
  5431. _vm->bindMethod<1>("str", "__getitem__", [](VM* vm, const pkpy::ArgList& args) {
  5432. const _Str& _self (vm->PyStr_AS_C(args[0]));
  5433. if(args[1]->is_type(vm->_tp_slice)){
  5434. _Slice s = vm->PySlice_AS_C(args[1]);
  5435. s.normalize(_self.u8_length());
  5436. return vm->PyStr(_self.u8_substr(s.start, s.stop));
  5437. }
  5438. int _index = (int)vm->PyInt_AS_C(args[1]);
  5439. _index = vm->normalized_index(_index, _self.u8_length());
  5440. return vm->PyStr(_self.u8_getitem(_index));
  5441. });
  5442. _vm->bindMethod<1>("str", "__gt__", [](VM* vm, const pkpy::ArgList& args) {
  5443. const _Str& _self (vm->PyStr_AS_C(args[0]));
  5444. const _Str& _obj (vm->PyStr_AS_C(args[1]));
  5445. return vm->PyBool(_self > _obj);
  5446. });
  5447. _vm->bindMethod<1>("str", "__lt__", [](VM* vm, const pkpy::ArgList& args) {
  5448. const _Str& _self (vm->PyStr_AS_C(args[0]));
  5449. const _Str& _obj (vm->PyStr_AS_C(args[1]));
  5450. return vm->PyBool(_self < _obj);
  5451. });
  5452. _vm->bindMethod<2>("str", "replace", [](VM* vm, const pkpy::ArgList& args) {
  5453. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5454. const _Str& _old = vm->PyStr_AS_C(args[1]);
  5455. const _Str& _new = vm->PyStr_AS_C(args[2]);
  5456. _Str _copy = _self;
  5457. // replace all occurences of _old with _new in _copy
  5458. size_t pos = 0;
  5459. while ((pos = _copy.find(_old, pos)) != std::string::npos) {
  5460. _copy.replace(pos, _old.length(), _new);
  5461. pos += _new.length();
  5462. }
  5463. return vm->PyStr(_copy);
  5464. });
  5465. _vm->bindMethod<1>("str", "startswith", [](VM* vm, const pkpy::ArgList& args) {
  5466. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5467. const _Str& _prefix = vm->PyStr_AS_C(args[1]);
  5468. return vm->PyBool(_self.find(_prefix) == 0);
  5469. });
  5470. _vm->bindMethod<1>("str", "endswith", [](VM* vm, const pkpy::ArgList& args) {
  5471. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5472. const _Str& _suffix = vm->PyStr_AS_C(args[1]);
  5473. return vm->PyBool(_self.rfind(_suffix) == _self.length() - _suffix.length());
  5474. });
  5475. _vm->bindMethod<1>("str", "join", [](VM* vm, const pkpy::ArgList& args) {
  5476. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5477. PyVarList* _list;
  5478. if(args[1]->is_type(vm->_tp_list)){
  5479. _list = &vm->PyList_AS_C(args[1]);
  5480. }else if(args[1]->is_type(vm->_tp_tuple)){
  5481. _list = &vm->PyTuple_AS_C(args[1]);
  5482. }else{
  5483. vm->typeError("can only join a list or tuple");
  5484. }
  5485. _StrStream ss;
  5486. for(int i = 0; i < _list->size(); i++){
  5487. if(i > 0) ss << _self;
  5488. ss << vm->PyStr_AS_C(vm->asStr(_list->operator[](i)));
  5489. }
  5490. return vm->PyStr(ss.str());
  5491. });
  5492. /************ PyList ************/
  5493. _vm->bindMethod<0>("list", "__iter__", [](VM* vm, const pkpy::ArgList& args) {
  5494. return vm->PyIter(
  5495. pkpy::make_shared<BaseIterator, VectorIterator>(vm, args[0])
  5496. );
  5497. });
  5498. _vm->bindMethod<1>("list", "append", [](VM* vm, const pkpy::ArgList& args) {
  5499. PyVarList& _self = vm->PyList_AS_C(args[0]);
  5500. _self.push_back(args[1]);
  5501. return vm->None;
  5502. });
  5503. _vm->bindMethod<2>("list", "insert", [](VM* vm, const pkpy::ArgList& args) {
  5504. PyVarList& _self = vm->PyList_AS_C(args[0]);
  5505. int _index = (int)vm->PyInt_AS_C(args[1]);
  5506. if(_index < 0) _index += _self.size();
  5507. if(_index < 0) _index = 0;
  5508. if(_index > _self.size()) _index = _self.size();
  5509. _self.insert(_self.begin() + _index, args[2]);
  5510. return vm->None;
  5511. });
  5512. _vm->bindMethod<0>("list", "clear", [](VM* vm, const pkpy::ArgList& args) {
  5513. vm->PyList_AS_C(args[0]).clear();
  5514. return vm->None;
  5515. });
  5516. _vm->bindMethod<0>("list", "copy", [](VM* vm, const pkpy::ArgList& args) {
  5517. return vm->PyList(vm->PyList_AS_C(args[0]));
  5518. });
  5519. _vm->bindMethod<1>("list", "__add__", [](VM* vm, const pkpy::ArgList& args) {
  5520. const PyVarList& _self = vm->PyList_AS_C(args[0]);
  5521. const PyVarList& _obj = vm->PyList_AS_C(args[1]);
  5522. PyVarList _new_list = _self;
  5523. _new_list.insert(_new_list.end(), _obj.begin(), _obj.end());
  5524. return vm->PyList(_new_list);
  5525. });
  5526. _vm->bindMethod<0>("list", "__len__", [](VM* vm, const pkpy::ArgList& args) {
  5527. const PyVarList& _self = vm->PyList_AS_C(args[0]);
  5528. return vm->PyInt(_self.size());
  5529. });
  5530. _vm->bindMethodMulti<1>({"list", "tuple"}, "__getitem__", [](VM* vm, const pkpy::ArgList& args) {
  5531. bool list = args[0]->is_type(vm->_tp_list);
  5532. const PyVarList& _self = list ? vm->PyList_AS_C(args[0]) : vm->PyTuple_AS_C(args[0]);
  5533. if(args[1]->is_type(vm->_tp_slice)){
  5534. _Slice s = vm->PySlice_AS_C(args[1]);
  5535. s.normalize(_self.size());
  5536. PyVarList _new_list;
  5537. for(size_t i = s.start; i < s.stop; i++) _new_list.push_back(_self[i]);
  5538. return list ? vm->PyList(_new_list) : vm->PyTuple(_new_list);
  5539. }
  5540. int _index = (int)vm->PyInt_AS_C(args[1]);
  5541. _index = vm->normalized_index(_index, _self.size());
  5542. return _self[_index];
  5543. });
  5544. _vm->bindMethod<2>("list", "__setitem__", [](VM* vm, const pkpy::ArgList& args) {
  5545. PyVarList& _self = vm->PyList_AS_C(args[0]);
  5546. int _index = (int)vm->PyInt_AS_C(args[1]);
  5547. _index = vm->normalized_index(_index, _self.size());
  5548. _self[_index] = args[2];
  5549. return vm->None;
  5550. });
  5551. _vm->bindMethod<1>("list", "__delitem__", [](VM* vm, const pkpy::ArgList& args) {
  5552. PyVarList& _self = vm->PyList_AS_C(args[0]);
  5553. int _index = (int)vm->PyInt_AS_C(args[1]);
  5554. _index = vm->normalized_index(_index, _self.size());
  5555. _self.erase(_self.begin() + _index);
  5556. return vm->None;
  5557. });
  5558. /************ PyTuple ************/
  5559. _vm->bindStaticMethod<1>("tuple", "__new__", [](VM* vm, const pkpy::ArgList& args) {
  5560. PyVarList _list = vm->PyList_AS_C(vm->call(vm->builtins->attribs["list"], args));
  5561. return vm->PyTuple(_list);
  5562. });
  5563. _vm->bindMethod<0>("tuple", "__iter__", [](VM* vm, const pkpy::ArgList& args) {
  5564. return vm->PyIter(pkpy::make_shared<BaseIterator, VectorIterator>(vm, args[0]));
  5565. });
  5566. _vm->bindMethod<0>("tuple", "__len__", [](VM* vm, const pkpy::ArgList& args) {
  5567. const PyVarList& _self = vm->PyTuple_AS_C(args[0]);
  5568. return vm->PyInt(_self.size());
  5569. });
  5570. /************ PyBool ************/
  5571. _vm->bindStaticMethod<1>("bool", "__new__", CPP_LAMBDA(vm->asBool(args[0])));
  5572. _vm->bindMethod<0>("bool", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5573. bool val = vm->PyBool_AS_C(args[0]);
  5574. return vm->PyStr(val ? "True" : "False");
  5575. });
  5576. _vm->bindMethod<0>("bool", "__json__", [](VM* vm, const pkpy::ArgList& args) {
  5577. bool val = vm->PyBool_AS_C(args[0]);
  5578. return vm->PyStr(val ? "true" : "false");
  5579. });
  5580. _vm->bindMethod<1>("bool", "__xor__", [](VM* vm, const pkpy::ArgList& args) {
  5581. bool _self = vm->PyBool_AS_C(args[0]);
  5582. bool _obj = vm->PyBool_AS_C(args[1]);
  5583. return vm->PyBool(_self ^ _obj);
  5584. });
  5585. _vm->bindMethod<0>("ellipsis", "__repr__", CPP_LAMBDA(vm->PyStr("Ellipsis")));
  5586. }
  5587. #ifdef _WIN32
  5588. #define __EXPORT __declspec(dllexport)
  5589. #elif __APPLE__
  5590. #define __EXPORT __attribute__((visibility("default"))) __attribute__((used))
  5591. #elif __EMSCRIPTEN__
  5592. #define __EXPORT EMSCRIPTEN_KEEPALIVE
  5593. #define __NO_MAIN
  5594. #else
  5595. #define __EXPORT
  5596. #endif
  5597. void __add_module_time(VM* vm){
  5598. PyVar mod = vm->new_module("time");
  5599. vm->bindFunc<0>(mod, "time", [](VM* vm, const pkpy::ArgList& args) {
  5600. auto now = std::chrono::high_resolution_clock::now();
  5601. return vm->PyFloat(std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()).count() / 1000000.0);
  5602. });
  5603. }
  5604. void __add_module_sys(VM* vm){
  5605. PyVar mod = vm->new_module("sys");
  5606. vm->bindFunc<1>(mod, "getrefcount", [](VM* vm, const pkpy::ArgList& args) {
  5607. return vm->PyInt(args[0].use_count());
  5608. });
  5609. vm->bindFunc<0>(mod, "getrecursionlimit", [](VM* vm, const pkpy::ArgList& args) {
  5610. return vm->PyInt(vm->maxRecursionDepth);
  5611. });
  5612. vm->bindFunc<1>(mod, "setrecursionlimit", [](VM* vm, const pkpy::ArgList& args) {
  5613. vm->maxRecursionDepth = (int)vm->PyInt_AS_C(args[0]);
  5614. return vm->None;
  5615. });
  5616. vm->setattr(mod, "version", vm->PyStr(PK_VERSION));
  5617. }
  5618. void __add_module_json(VM* vm){
  5619. PyVar mod = vm->new_module("json");
  5620. vm->bindFunc<1>(mod, "loads", [](VM* vm, const pkpy::ArgList& args) {
  5621. const _Str& expr = vm->PyStr_AS_C(args[0]);
  5622. _Code code = vm->compile(expr, "<json>", JSON_MODE);
  5623. return vm->_exec(code, vm->top_frame()->_module, vm->top_frame()->_locals);
  5624. });
  5625. vm->bindFunc<1>(mod, "dumps", [](VM* vm, const pkpy::ArgList& args) {
  5626. return vm->asJson(args[0]);
  5627. });
  5628. }
  5629. void __add_module_math(VM* vm){
  5630. PyVar mod = vm->new_module("math");
  5631. vm->setattr(mod, "pi", vm->PyFloat(3.1415926535897932384));
  5632. vm->setattr(mod, "e" , vm->PyFloat(2.7182818284590452354));
  5633. vm->bindFunc<1>(mod, "log", CPP_LAMBDA(vm->PyFloat(log(vm->num_to_float(args[0])))));
  5634. vm->bindFunc<1>(mod, "log10", CPP_LAMBDA(vm->PyFloat(log10(vm->num_to_float(args[0])))));
  5635. vm->bindFunc<1>(mod, "log2", CPP_LAMBDA(vm->PyFloat(log2(vm->num_to_float(args[0])))));
  5636. vm->bindFunc<1>(mod, "sin", CPP_LAMBDA(vm->PyFloat(sin(vm->num_to_float(args[0])))));
  5637. vm->bindFunc<1>(mod, "cos", CPP_LAMBDA(vm->PyFloat(cos(vm->num_to_float(args[0])))));
  5638. vm->bindFunc<1>(mod, "tan", CPP_LAMBDA(vm->PyFloat(tan(vm->num_to_float(args[0])))));
  5639. vm->bindFunc<1>(mod, "isnan", CPP_LAMBDA(vm->PyBool(std::isnan(vm->num_to_float(args[0])))));
  5640. vm->bindFunc<1>(mod, "isinf", CPP_LAMBDA(vm->PyBool(std::isinf(vm->num_to_float(args[0])))));
  5641. }
  5642. void __add_module_dis(VM* vm){
  5643. PyVar mod = vm->new_module("dis");
  5644. vm->bindFunc<1>(mod, "dis", [](VM* vm, const pkpy::ArgList& args) {
  5645. _Code code = vm->PyFunction_AS_C(args[0])->code;
  5646. (*vm->_stdout) << vm->disassemble(code);
  5647. return vm->None;
  5648. });
  5649. }
  5650. #define PY_CLASS(mod, name) inline static PyVar _tp(VM* vm) { return vm->_modules[#mod]->attribs[#name]; }
  5651. struct ReMatch {
  5652. PY_CLASS(re, Match)
  5653. i64 start;
  5654. i64 end;
  5655. std::smatch m;
  5656. ReMatch(i64 start, i64 end, std::smatch m) : start(start), end(end), m(m) {}
  5657. static PyVar _bind(VM* vm){
  5658. PyVar _tp_match = vm->new_user_type_object(vm->_modules["re"], "Match", vm->_tp_object);
  5659. vm->bindMethod<0>(_tp_match, "start", CPP_LAMBDA(vm->PyInt(UNION_GET(ReMatch, args[0]).start)));
  5660. vm->bindMethod<0>(_tp_match, "end", CPP_LAMBDA(vm->PyInt(UNION_GET(ReMatch, args[0]).end)));
  5661. vm->bindMethod<0>(_tp_match, "span", [](VM* vm, const pkpy::ArgList& args) {
  5662. auto& m = UNION_GET(ReMatch, args[0]);
  5663. return vm->PyTuple({ vm->PyInt(m.start), vm->PyInt(m.end) });
  5664. });
  5665. vm->bindMethod<1>(_tp_match, "group", [](VM* vm, const pkpy::ArgList& args) {
  5666. auto& m = UNION_GET(ReMatch, args[0]);
  5667. int index = (int)vm->PyInt_AS_C(args[1]);
  5668. index = vm->normalized_index(index, m.m.size());
  5669. return vm->PyStr(m.m[index].str());
  5670. });
  5671. return _tp_match;
  5672. }
  5673. };
  5674. PyVar __regex_search(const _Str& pattern, const _Str& string, bool fromStart, VM* vm){
  5675. std::regex re(pattern);
  5676. std::smatch m;
  5677. if(std::regex_search(string, m, re)){
  5678. if(fromStart && m.position() != 0) return vm->None;
  5679. i64 start = string.__to_u8_index(m.position());
  5680. i64 end = string.__to_u8_index(m.position() + m.length());
  5681. return vm->new_object_c<ReMatch>(start, end, m);
  5682. }
  5683. return vm->None;
  5684. };
  5685. void __add_module_re(VM* vm){
  5686. PyVar mod = vm->new_module("re");
  5687. ReMatch::_bind(vm);
  5688. vm->bindFunc<2>(mod, "match", [](VM* vm, const pkpy::ArgList& args) {
  5689. const _Str& pattern = vm->PyStr_AS_C(args[0]);
  5690. const _Str& string = vm->PyStr_AS_C(args[1]);
  5691. return __regex_search(pattern, string, true, vm);
  5692. });
  5693. vm->bindFunc<2>(mod, "search", [](VM* vm, const pkpy::ArgList& args) {
  5694. const _Str& pattern = vm->PyStr_AS_C(args[0]);
  5695. const _Str& string = vm->PyStr_AS_C(args[1]);
  5696. return __regex_search(pattern, string, false, vm);
  5697. });
  5698. vm->bindFunc<3>(mod, "sub", [](VM* vm, const pkpy::ArgList& args) {
  5699. const _Str& pattern = vm->PyStr_AS_C(args[0]);
  5700. const _Str& repl = vm->PyStr_AS_C(args[1]);
  5701. const _Str& string = vm->PyStr_AS_C(args[2]);
  5702. std::regex re(pattern);
  5703. return vm->PyStr(std::regex_replace(string, re, repl));
  5704. });
  5705. vm->bindFunc<2>(mod, "split", [](VM* vm, const pkpy::ArgList& args) {
  5706. const _Str& pattern = vm->PyStr_AS_C(args[0]);
  5707. const _Str& string = vm->PyStr_AS_C(args[1]);
  5708. std::regex re(pattern);
  5709. std::sregex_token_iterator it(string.begin(), string.end(), re, -1);
  5710. std::sregex_token_iterator end;
  5711. PyVarList vec;
  5712. for(; it != end; ++it){
  5713. vec.push_back(vm->PyStr(it->str()));
  5714. }
  5715. return vm->PyList(vec);
  5716. });
  5717. }
  5718. class _PkExported{
  5719. public:
  5720. virtual ~_PkExported() = default;
  5721. virtual void* get() = 0;
  5722. };
  5723. static std::vector<_PkExported*> _pkLookupTable;
  5724. template<typename T>
  5725. class PkExported : public _PkExported{
  5726. T* _ptr;
  5727. public:
  5728. template<typename... Args>
  5729. PkExported(Args&&... args) {
  5730. _ptr = new T(std::forward<Args>(args)...);
  5731. _pkLookupTable.push_back(this);
  5732. }
  5733. ~PkExported() override { delete _ptr; }
  5734. void* get() override { return _ptr; }
  5735. operator T*() { return _ptr; }
  5736. };
  5737. #define pkpy_allocate(T, ...) *(new PkExported<T>(__VA_ARGS__))
  5738. extern "C" {
  5739. __EXPORT
  5740. /// Delete a pointer allocated by `pkpy_xxx_xxx`.
  5741. /// It can be `VM*`, `REPL*`, `char*`, etc.
  5742. ///
  5743. /// !!!
  5744. /// If the pointer is not allocated by `pkpy_xxx_xxx`, the behavior is undefined.
  5745. /// !!!
  5746. void pkpy_delete(void* p){
  5747. for(int i = 0; i < _pkLookupTable.size(); i++){
  5748. if(_pkLookupTable[i]->get() == p){
  5749. delete _pkLookupTable[i];
  5750. _pkLookupTable.erase(_pkLookupTable.begin() + i);
  5751. return;
  5752. }
  5753. }
  5754. free(p);
  5755. }
  5756. __EXPORT
  5757. /// Run a given source on a virtual machine.
  5758. void pkpy_vm_exec(VM* vm, const char* source){
  5759. vm->exec(source, "main.py", EXEC_MODE);
  5760. }
  5761. __EXPORT
  5762. /// Get a global variable of a virtual machine.
  5763. ///
  5764. /// Return `__repr__` of the result.
  5765. /// If the variable is not found, return `nullptr`.
  5766. char* pkpy_vm_get_global(VM* vm, const char* name){
  5767. auto it = vm->_main->attribs.find(name);
  5768. if(it == vm->_main->attribs.end()) return nullptr;
  5769. try{
  5770. _Str _repr = vm->PyStr_AS_C(vm->asRepr(it->second));
  5771. return strdup(_repr.c_str());
  5772. }catch(...){
  5773. return nullptr;
  5774. }
  5775. }
  5776. __EXPORT
  5777. /// Evaluate an expression.
  5778. ///
  5779. /// Return `__repr__` of the result.
  5780. /// If there is any error, return `nullptr`.
  5781. char* pkpy_vm_eval(VM* vm, const char* source){
  5782. PyVarOrNull ret = vm->exec(source, "<eval>", EVAL_MODE);
  5783. if(ret == nullptr) return nullptr;
  5784. try{
  5785. _Str _repr = vm->PyStr_AS_C(vm->asRepr(ret));
  5786. return strdup(_repr.c_str());
  5787. }catch(...){
  5788. return nullptr;
  5789. }
  5790. }
  5791. __EXPORT
  5792. /// Create a REPL, using the given virtual machine as the backend.
  5793. REPL* pkpy_new_repl(VM* vm){
  5794. return pkpy_allocate(REPL, vm);
  5795. }
  5796. __EXPORT
  5797. /// Input a source line to an interactive console.
  5798. int pkpy_repl_input(REPL* r, const char* line){
  5799. return r->input(line);
  5800. }
  5801. __EXPORT
  5802. /// Add a source module into a virtual machine.
  5803. void pkpy_vm_add_module(VM* vm, const char* name, const char* source){
  5804. vm->_lazy_modules[name] = source;
  5805. }
  5806. __EXPORT
  5807. /// Create a virtual machine.
  5808. VM* pkpy_new_vm(bool use_stdio){
  5809. VM* vm = pkpy_allocate(VM, use_stdio);
  5810. __initializeBuiltinFunctions(vm);
  5811. __add_module_sys(vm);
  5812. __add_module_time(vm);
  5813. __add_module_json(vm);
  5814. __add_module_math(vm);
  5815. __add_module_re(vm);
  5816. __add_module_dis(vm);
  5817. // add builtins | no exception handler | must succeed
  5818. _Code code = vm->compile(__BUILTINS_CODE, "<builtins>", EXEC_MODE);
  5819. vm->_exec(code, vm->builtins, pkpy::make_shared<PyVarDict>());
  5820. pkpy_vm_add_module(vm, "random", __RANDOM_CODE);
  5821. return vm;
  5822. }
  5823. __EXPORT
  5824. /// Read the standard output and standard error as string of a virtual machine.
  5825. /// The `vm->use_stdio` should be `false`.
  5826. /// After this operation, both stream will be cleared.
  5827. ///
  5828. /// Return a json representing the result.
  5829. char* pkpy_vm_read_output(VM* vm){
  5830. if(vm->use_stdio) return nullptr;
  5831. _StrStream* s_out = (_StrStream*)(vm->_stdout);
  5832. _StrStream* s_err = (_StrStream*)(vm->_stderr);
  5833. _Str _stdout = s_out->str();
  5834. _Str _stderr = s_err->str();
  5835. _StrStream ss;
  5836. ss << '{' << "\"stdout\": " << _stdout.__escape(false);
  5837. ss << ", ";
  5838. ss << "\"stderr\": " << _stderr.__escape(false) << '}';
  5839. s_out->str("");
  5840. s_err->str("");
  5841. return strdup(ss.str().c_str());
  5842. }
  5843. }
  5844. extern "C" {
  5845. typedef i64 (*__f_int__int_int_int)(i64, i64, i64);
  5846. __EXPORT
  5847. void pkpy_vm_bind_int__int_int_int(VM* vm, const char* mod, const char* name, __f_int__int_int_int f) {
  5848. PyVar obj = vm->new_module_if_not_existed(mod);
  5849. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5850. i64 _0 = vm->PyInt_AS_C(args[0]);
  5851. i64 _1 = vm->PyInt_AS_C(args[1]);
  5852. i64 _2 = vm->PyInt_AS_C(args[2]);
  5853. i64 ret = f(_0, _1, _2);
  5854. return vm->PyInt(ret);
  5855. });
  5856. }
  5857. typedef i64 (*__f_int__float_float_float)(f64, f64, f64);
  5858. __EXPORT
  5859. void pkpy_vm_bind_int__float_float_float(VM* vm, const char* mod, const char* name, __f_int__float_float_float f) {
  5860. PyVar obj = vm->new_module_if_not_existed(mod);
  5861. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5862. f64 _0 = vm->PyFloat_AS_C(args[0]);
  5863. f64 _1 = vm->PyFloat_AS_C(args[1]);
  5864. f64 _2 = vm->PyFloat_AS_C(args[2]);
  5865. i64 ret = f(_0, _1, _2);
  5866. return vm->PyInt(ret);
  5867. });
  5868. }
  5869. typedef i64 (*__f_int__str_str_str)(const char*, const char*, const char*);
  5870. __EXPORT
  5871. void pkpy_vm_bind_int__str_str_str(VM* vm, const char* mod, const char* name, __f_int__str_str_str f) {
  5872. PyVar obj = vm->new_module_if_not_existed(mod);
  5873. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5874. const char* _0 = vm->PyStr_AS_C(args[0]);
  5875. const char* _1 = vm->PyStr_AS_C(args[1]);
  5876. const char* _2 = vm->PyStr_AS_C(args[2]);
  5877. i64 ret = f(_0, _1, _2);
  5878. return vm->PyInt(ret);
  5879. });
  5880. }
  5881. typedef i64 (*__f_int__bool_bool_bool)(bool, bool, bool);
  5882. __EXPORT
  5883. void pkpy_vm_bind_int__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_int__bool_bool_bool f) {
  5884. PyVar obj = vm->new_module_if_not_existed(mod);
  5885. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5886. bool _0 = vm->PyBool_AS_C(args[0]);
  5887. bool _1 = vm->PyBool_AS_C(args[1]);
  5888. bool _2 = vm->PyBool_AS_C(args[2]);
  5889. i64 ret = f(_0, _1, _2);
  5890. return vm->PyInt(ret);
  5891. });
  5892. }
  5893. typedef f64 (*__f_float__int_int_int)(i64, i64, i64);
  5894. __EXPORT
  5895. void pkpy_vm_bind_float__int_int_int(VM* vm, const char* mod, const char* name, __f_float__int_int_int f) {
  5896. PyVar obj = vm->new_module_if_not_existed(mod);
  5897. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5898. i64 _0 = vm->PyInt_AS_C(args[0]);
  5899. i64 _1 = vm->PyInt_AS_C(args[1]);
  5900. i64 _2 = vm->PyInt_AS_C(args[2]);
  5901. f64 ret = f(_0, _1, _2);
  5902. return vm->PyFloat(ret);
  5903. });
  5904. }
  5905. typedef f64 (*__f_float__float_float_float)(f64, f64, f64);
  5906. __EXPORT
  5907. void pkpy_vm_bind_float__float_float_float(VM* vm, const char* mod, const char* name, __f_float__float_float_float f) {
  5908. PyVar obj = vm->new_module_if_not_existed(mod);
  5909. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5910. f64 _0 = vm->PyFloat_AS_C(args[0]);
  5911. f64 _1 = vm->PyFloat_AS_C(args[1]);
  5912. f64 _2 = vm->PyFloat_AS_C(args[2]);
  5913. f64 ret = f(_0, _1, _2);
  5914. return vm->PyFloat(ret);
  5915. });
  5916. }
  5917. typedef f64 (*__f_float__str_str_str)(const char*, const char*, const char*);
  5918. __EXPORT
  5919. void pkpy_vm_bind_float__str_str_str(VM* vm, const char* mod, const char* name, __f_float__str_str_str f) {
  5920. PyVar obj = vm->new_module_if_not_existed(mod);
  5921. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5922. const char* _0 = vm->PyStr_AS_C(args[0]);
  5923. const char* _1 = vm->PyStr_AS_C(args[1]);
  5924. const char* _2 = vm->PyStr_AS_C(args[2]);
  5925. f64 ret = f(_0, _1, _2);
  5926. return vm->PyFloat(ret);
  5927. });
  5928. }
  5929. typedef f64 (*__f_float__bool_bool_bool)(bool, bool, bool);
  5930. __EXPORT
  5931. void pkpy_vm_bind_float__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_float__bool_bool_bool f) {
  5932. PyVar obj = vm->new_module_if_not_existed(mod);
  5933. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5934. bool _0 = vm->PyBool_AS_C(args[0]);
  5935. bool _1 = vm->PyBool_AS_C(args[1]);
  5936. bool _2 = vm->PyBool_AS_C(args[2]);
  5937. f64 ret = f(_0, _1, _2);
  5938. return vm->PyFloat(ret);
  5939. });
  5940. }
  5941. typedef const char* (*__f_str__int_int_int)(i64, i64, i64);
  5942. __EXPORT
  5943. void pkpy_vm_bind_str__int_int_int(VM* vm, const char* mod, const char* name, __f_str__int_int_int f) {
  5944. PyVar obj = vm->new_module_if_not_existed(mod);
  5945. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5946. i64 _0 = vm->PyInt_AS_C(args[0]);
  5947. i64 _1 = vm->PyInt_AS_C(args[1]);
  5948. i64 _2 = vm->PyInt_AS_C(args[2]);
  5949. const char* ret = f(_0, _1, _2);
  5950. return vm->PyStr(ret);
  5951. });
  5952. }
  5953. typedef const char* (*__f_str__float_float_float)(f64, f64, f64);
  5954. __EXPORT
  5955. void pkpy_vm_bind_str__float_float_float(VM* vm, const char* mod, const char* name, __f_str__float_float_float f) {
  5956. PyVar obj = vm->new_module_if_not_existed(mod);
  5957. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5958. f64 _0 = vm->PyFloat_AS_C(args[0]);
  5959. f64 _1 = vm->PyFloat_AS_C(args[1]);
  5960. f64 _2 = vm->PyFloat_AS_C(args[2]);
  5961. const char* ret = f(_0, _1, _2);
  5962. return vm->PyStr(ret);
  5963. });
  5964. }
  5965. typedef const char* (*__f_str__str_str_str)(const char*, const char*, const char*);
  5966. __EXPORT
  5967. void pkpy_vm_bind_str__str_str_str(VM* vm, const char* mod, const char* name, __f_str__str_str_str f) {
  5968. PyVar obj = vm->new_module_if_not_existed(mod);
  5969. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5970. const char* _0 = vm->PyStr_AS_C(args[0]);
  5971. const char* _1 = vm->PyStr_AS_C(args[1]);
  5972. const char* _2 = vm->PyStr_AS_C(args[2]);
  5973. const char* ret = f(_0, _1, _2);
  5974. return vm->PyStr(ret);
  5975. });
  5976. }
  5977. typedef const char* (*__f_str__bool_bool_bool)(bool, bool, bool);
  5978. __EXPORT
  5979. void pkpy_vm_bind_str__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_str__bool_bool_bool f) {
  5980. PyVar obj = vm->new_module_if_not_existed(mod);
  5981. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5982. bool _0 = vm->PyBool_AS_C(args[0]);
  5983. bool _1 = vm->PyBool_AS_C(args[1]);
  5984. bool _2 = vm->PyBool_AS_C(args[2]);
  5985. const char* ret = f(_0, _1, _2);
  5986. return vm->PyStr(ret);
  5987. });
  5988. }
  5989. typedef bool (*__f_bool__int_int_int)(i64, i64, i64);
  5990. __EXPORT
  5991. void pkpy_vm_bind_bool__int_int_int(VM* vm, const char* mod, const char* name, __f_bool__int_int_int f) {
  5992. PyVar obj = vm->new_module_if_not_existed(mod);
  5993. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  5994. i64 _0 = vm->PyInt_AS_C(args[0]);
  5995. i64 _1 = vm->PyInt_AS_C(args[1]);
  5996. i64 _2 = vm->PyInt_AS_C(args[2]);
  5997. bool ret = f(_0, _1, _2);
  5998. return vm->PyBool(ret);
  5999. });
  6000. }
  6001. typedef bool (*__f_bool__float_float_float)(f64, f64, f64);
  6002. __EXPORT
  6003. void pkpy_vm_bind_bool__float_float_float(VM* vm, const char* mod, const char* name, __f_bool__float_float_float f) {
  6004. PyVar obj = vm->new_module_if_not_existed(mod);
  6005. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6006. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6007. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6008. f64 _2 = vm->PyFloat_AS_C(args[2]);
  6009. bool ret = f(_0, _1, _2);
  6010. return vm->PyBool(ret);
  6011. });
  6012. }
  6013. typedef bool (*__f_bool__str_str_str)(const char*, const char*, const char*);
  6014. __EXPORT
  6015. void pkpy_vm_bind_bool__str_str_str(VM* vm, const char* mod, const char* name, __f_bool__str_str_str f) {
  6016. PyVar obj = vm->new_module_if_not_existed(mod);
  6017. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6018. const char* _0 = vm->PyStr_AS_C(args[0]);
  6019. const char* _1 = vm->PyStr_AS_C(args[1]);
  6020. const char* _2 = vm->PyStr_AS_C(args[2]);
  6021. bool ret = f(_0, _1, _2);
  6022. return vm->PyBool(ret);
  6023. });
  6024. }
  6025. typedef bool (*__f_bool__bool_bool_bool)(bool, bool, bool);
  6026. __EXPORT
  6027. void pkpy_vm_bind_bool__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_bool__bool_bool_bool f) {
  6028. PyVar obj = vm->new_module_if_not_existed(mod);
  6029. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6030. bool _0 = vm->PyBool_AS_C(args[0]);
  6031. bool _1 = vm->PyBool_AS_C(args[1]);
  6032. bool _2 = vm->PyBool_AS_C(args[2]);
  6033. bool ret = f(_0, _1, _2);
  6034. return vm->PyBool(ret);
  6035. });
  6036. }
  6037. typedef void (*__f_None__int_int_int)(i64, i64, i64);
  6038. __EXPORT
  6039. void pkpy_vm_bind_None__int_int_int(VM* vm, const char* mod, const char* name, __f_None__int_int_int f) {
  6040. PyVar obj = vm->new_module_if_not_existed(mod);
  6041. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6042. i64 _0 = vm->PyInt_AS_C(args[0]);
  6043. i64 _1 = vm->PyInt_AS_C(args[1]);
  6044. i64 _2 = vm->PyInt_AS_C(args[2]);
  6045. f(_0, _1, _2);
  6046. return vm->None;
  6047. });
  6048. }
  6049. typedef void (*__f_None__float_float_float)(f64, f64, f64);
  6050. __EXPORT
  6051. void pkpy_vm_bind_None__float_float_float(VM* vm, const char* mod, const char* name, __f_None__float_float_float f) {
  6052. PyVar obj = vm->new_module_if_not_existed(mod);
  6053. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6054. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6055. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6056. f64 _2 = vm->PyFloat_AS_C(args[2]);
  6057. f(_0, _1, _2);
  6058. return vm->None;
  6059. });
  6060. }
  6061. typedef void (*__f_None__str_str_str)(const char*, const char*, const char*);
  6062. __EXPORT
  6063. void pkpy_vm_bind_None__str_str_str(VM* vm, const char* mod, const char* name, __f_None__str_str_str f) {
  6064. PyVar obj = vm->new_module_if_not_existed(mod);
  6065. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6066. const char* _0 = vm->PyStr_AS_C(args[0]);
  6067. const char* _1 = vm->PyStr_AS_C(args[1]);
  6068. const char* _2 = vm->PyStr_AS_C(args[2]);
  6069. f(_0, _1, _2);
  6070. return vm->None;
  6071. });
  6072. }
  6073. typedef void (*__f_None__bool_bool_bool)(bool, bool, bool);
  6074. __EXPORT
  6075. void pkpy_vm_bind_None__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_None__bool_bool_bool f) {
  6076. PyVar obj = vm->new_module_if_not_existed(mod);
  6077. vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6078. bool _0 = vm->PyBool_AS_C(args[0]);
  6079. bool _1 = vm->PyBool_AS_C(args[1]);
  6080. bool _2 = vm->PyBool_AS_C(args[2]);
  6081. f(_0, _1, _2);
  6082. return vm->None;
  6083. });
  6084. }
  6085. typedef i64 (*__f_int__int_int)(i64, i64);
  6086. __EXPORT
  6087. void pkpy_vm_bind_int__int_int(VM* vm, const char* mod, const char* name, __f_int__int_int f) {
  6088. PyVar obj = vm->new_module_if_not_existed(mod);
  6089. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6090. i64 _0 = vm->PyInt_AS_C(args[0]);
  6091. i64 _1 = vm->PyInt_AS_C(args[1]);
  6092. i64 ret = f(_0, _1);
  6093. return vm->PyInt(ret);
  6094. });
  6095. }
  6096. typedef i64 (*__f_int__int_float)(i64, f64);
  6097. __EXPORT
  6098. void pkpy_vm_bind_int__int_float(VM* vm, const char* mod, const char* name, __f_int__int_float f) {
  6099. PyVar obj = vm->new_module_if_not_existed(mod);
  6100. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6101. i64 _0 = vm->PyInt_AS_C(args[0]);
  6102. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6103. i64 ret = f(_0, _1);
  6104. return vm->PyInt(ret);
  6105. });
  6106. }
  6107. typedef i64 (*__f_int__int_str)(i64, const char*);
  6108. __EXPORT
  6109. void pkpy_vm_bind_int__int_str(VM* vm, const char* mod, const char* name, __f_int__int_str f) {
  6110. PyVar obj = vm->new_module_if_not_existed(mod);
  6111. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6112. i64 _0 = vm->PyInt_AS_C(args[0]);
  6113. const char* _1 = vm->PyStr_AS_C(args[1]);
  6114. i64 ret = f(_0, _1);
  6115. return vm->PyInt(ret);
  6116. });
  6117. }
  6118. typedef i64 (*__f_int__int_bool)(i64, bool);
  6119. __EXPORT
  6120. void pkpy_vm_bind_int__int_bool(VM* vm, const char* mod, const char* name, __f_int__int_bool f) {
  6121. PyVar obj = vm->new_module_if_not_existed(mod);
  6122. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6123. i64 _0 = vm->PyInt_AS_C(args[0]);
  6124. bool _1 = vm->PyBool_AS_C(args[1]);
  6125. i64 ret = f(_0, _1);
  6126. return vm->PyInt(ret);
  6127. });
  6128. }
  6129. typedef i64 (*__f_int__float_int)(f64, i64);
  6130. __EXPORT
  6131. void pkpy_vm_bind_int__float_int(VM* vm, const char* mod, const char* name, __f_int__float_int f) {
  6132. PyVar obj = vm->new_module_if_not_existed(mod);
  6133. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6134. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6135. i64 _1 = vm->PyInt_AS_C(args[1]);
  6136. i64 ret = f(_0, _1);
  6137. return vm->PyInt(ret);
  6138. });
  6139. }
  6140. typedef i64 (*__f_int__float_float)(f64, f64);
  6141. __EXPORT
  6142. void pkpy_vm_bind_int__float_float(VM* vm, const char* mod, const char* name, __f_int__float_float f) {
  6143. PyVar obj = vm->new_module_if_not_existed(mod);
  6144. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6145. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6146. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6147. i64 ret = f(_0, _1);
  6148. return vm->PyInt(ret);
  6149. });
  6150. }
  6151. typedef i64 (*__f_int__float_str)(f64, const char*);
  6152. __EXPORT
  6153. void pkpy_vm_bind_int__float_str(VM* vm, const char* mod, const char* name, __f_int__float_str f) {
  6154. PyVar obj = vm->new_module_if_not_existed(mod);
  6155. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6156. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6157. const char* _1 = vm->PyStr_AS_C(args[1]);
  6158. i64 ret = f(_0, _1);
  6159. return vm->PyInt(ret);
  6160. });
  6161. }
  6162. typedef i64 (*__f_int__float_bool)(f64, bool);
  6163. __EXPORT
  6164. void pkpy_vm_bind_int__float_bool(VM* vm, const char* mod, const char* name, __f_int__float_bool f) {
  6165. PyVar obj = vm->new_module_if_not_existed(mod);
  6166. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6167. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6168. bool _1 = vm->PyBool_AS_C(args[1]);
  6169. i64 ret = f(_0, _1);
  6170. return vm->PyInt(ret);
  6171. });
  6172. }
  6173. typedef i64 (*__f_int__str_int)(const char*, i64);
  6174. __EXPORT
  6175. void pkpy_vm_bind_int__str_int(VM* vm, const char* mod, const char* name, __f_int__str_int f) {
  6176. PyVar obj = vm->new_module_if_not_existed(mod);
  6177. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6178. const char* _0 = vm->PyStr_AS_C(args[0]);
  6179. i64 _1 = vm->PyInt_AS_C(args[1]);
  6180. i64 ret = f(_0, _1);
  6181. return vm->PyInt(ret);
  6182. });
  6183. }
  6184. typedef i64 (*__f_int__str_float)(const char*, f64);
  6185. __EXPORT
  6186. void pkpy_vm_bind_int__str_float(VM* vm, const char* mod, const char* name, __f_int__str_float f) {
  6187. PyVar obj = vm->new_module_if_not_existed(mod);
  6188. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6189. const char* _0 = vm->PyStr_AS_C(args[0]);
  6190. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6191. i64 ret = f(_0, _1);
  6192. return vm->PyInt(ret);
  6193. });
  6194. }
  6195. typedef i64 (*__f_int__str_str)(const char*, const char*);
  6196. __EXPORT
  6197. void pkpy_vm_bind_int__str_str(VM* vm, const char* mod, const char* name, __f_int__str_str f) {
  6198. PyVar obj = vm->new_module_if_not_existed(mod);
  6199. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6200. const char* _0 = vm->PyStr_AS_C(args[0]);
  6201. const char* _1 = vm->PyStr_AS_C(args[1]);
  6202. i64 ret = f(_0, _1);
  6203. return vm->PyInt(ret);
  6204. });
  6205. }
  6206. typedef i64 (*__f_int__str_bool)(const char*, bool);
  6207. __EXPORT
  6208. void pkpy_vm_bind_int__str_bool(VM* vm, const char* mod, const char* name, __f_int__str_bool f) {
  6209. PyVar obj = vm->new_module_if_not_existed(mod);
  6210. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6211. const char* _0 = vm->PyStr_AS_C(args[0]);
  6212. bool _1 = vm->PyBool_AS_C(args[1]);
  6213. i64 ret = f(_0, _1);
  6214. return vm->PyInt(ret);
  6215. });
  6216. }
  6217. typedef i64 (*__f_int__bool_int)(bool, i64);
  6218. __EXPORT
  6219. void pkpy_vm_bind_int__bool_int(VM* vm, const char* mod, const char* name, __f_int__bool_int f) {
  6220. PyVar obj = vm->new_module_if_not_existed(mod);
  6221. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6222. bool _0 = vm->PyBool_AS_C(args[0]);
  6223. i64 _1 = vm->PyInt_AS_C(args[1]);
  6224. i64 ret = f(_0, _1);
  6225. return vm->PyInt(ret);
  6226. });
  6227. }
  6228. typedef i64 (*__f_int__bool_float)(bool, f64);
  6229. __EXPORT
  6230. void pkpy_vm_bind_int__bool_float(VM* vm, const char* mod, const char* name, __f_int__bool_float f) {
  6231. PyVar obj = vm->new_module_if_not_existed(mod);
  6232. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6233. bool _0 = vm->PyBool_AS_C(args[0]);
  6234. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6235. i64 ret = f(_0, _1);
  6236. return vm->PyInt(ret);
  6237. });
  6238. }
  6239. typedef i64 (*__f_int__bool_str)(bool, const char*);
  6240. __EXPORT
  6241. void pkpy_vm_bind_int__bool_str(VM* vm, const char* mod, const char* name, __f_int__bool_str f) {
  6242. PyVar obj = vm->new_module_if_not_existed(mod);
  6243. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6244. bool _0 = vm->PyBool_AS_C(args[0]);
  6245. const char* _1 = vm->PyStr_AS_C(args[1]);
  6246. i64 ret = f(_0, _1);
  6247. return vm->PyInt(ret);
  6248. });
  6249. }
  6250. typedef i64 (*__f_int__bool_bool)(bool, bool);
  6251. __EXPORT
  6252. void pkpy_vm_bind_int__bool_bool(VM* vm, const char* mod, const char* name, __f_int__bool_bool f) {
  6253. PyVar obj = vm->new_module_if_not_existed(mod);
  6254. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6255. bool _0 = vm->PyBool_AS_C(args[0]);
  6256. bool _1 = vm->PyBool_AS_C(args[1]);
  6257. i64 ret = f(_0, _1);
  6258. return vm->PyInt(ret);
  6259. });
  6260. }
  6261. typedef f64 (*__f_float__int_int)(i64, i64);
  6262. __EXPORT
  6263. void pkpy_vm_bind_float__int_int(VM* vm, const char* mod, const char* name, __f_float__int_int f) {
  6264. PyVar obj = vm->new_module_if_not_existed(mod);
  6265. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6266. i64 _0 = vm->PyInt_AS_C(args[0]);
  6267. i64 _1 = vm->PyInt_AS_C(args[1]);
  6268. f64 ret = f(_0, _1);
  6269. return vm->PyFloat(ret);
  6270. });
  6271. }
  6272. typedef f64 (*__f_float__int_float)(i64, f64);
  6273. __EXPORT
  6274. void pkpy_vm_bind_float__int_float(VM* vm, const char* mod, const char* name, __f_float__int_float f) {
  6275. PyVar obj = vm->new_module_if_not_existed(mod);
  6276. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6277. i64 _0 = vm->PyInt_AS_C(args[0]);
  6278. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6279. f64 ret = f(_0, _1);
  6280. return vm->PyFloat(ret);
  6281. });
  6282. }
  6283. typedef f64 (*__f_float__int_str)(i64, const char*);
  6284. __EXPORT
  6285. void pkpy_vm_bind_float__int_str(VM* vm, const char* mod, const char* name, __f_float__int_str f) {
  6286. PyVar obj = vm->new_module_if_not_existed(mod);
  6287. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6288. i64 _0 = vm->PyInt_AS_C(args[0]);
  6289. const char* _1 = vm->PyStr_AS_C(args[1]);
  6290. f64 ret = f(_0, _1);
  6291. return vm->PyFloat(ret);
  6292. });
  6293. }
  6294. typedef f64 (*__f_float__int_bool)(i64, bool);
  6295. __EXPORT
  6296. void pkpy_vm_bind_float__int_bool(VM* vm, const char* mod, const char* name, __f_float__int_bool f) {
  6297. PyVar obj = vm->new_module_if_not_existed(mod);
  6298. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6299. i64 _0 = vm->PyInt_AS_C(args[0]);
  6300. bool _1 = vm->PyBool_AS_C(args[1]);
  6301. f64 ret = f(_0, _1);
  6302. return vm->PyFloat(ret);
  6303. });
  6304. }
  6305. typedef f64 (*__f_float__float_int)(f64, i64);
  6306. __EXPORT
  6307. void pkpy_vm_bind_float__float_int(VM* vm, const char* mod, const char* name, __f_float__float_int f) {
  6308. PyVar obj = vm->new_module_if_not_existed(mod);
  6309. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6310. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6311. i64 _1 = vm->PyInt_AS_C(args[1]);
  6312. f64 ret = f(_0, _1);
  6313. return vm->PyFloat(ret);
  6314. });
  6315. }
  6316. typedef f64 (*__f_float__float_float)(f64, f64);
  6317. __EXPORT
  6318. void pkpy_vm_bind_float__float_float(VM* vm, const char* mod, const char* name, __f_float__float_float f) {
  6319. PyVar obj = vm->new_module_if_not_existed(mod);
  6320. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6321. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6322. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6323. f64 ret = f(_0, _1);
  6324. return vm->PyFloat(ret);
  6325. });
  6326. }
  6327. typedef f64 (*__f_float__float_str)(f64, const char*);
  6328. __EXPORT
  6329. void pkpy_vm_bind_float__float_str(VM* vm, const char* mod, const char* name, __f_float__float_str f) {
  6330. PyVar obj = vm->new_module_if_not_existed(mod);
  6331. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6332. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6333. const char* _1 = vm->PyStr_AS_C(args[1]);
  6334. f64 ret = f(_0, _1);
  6335. return vm->PyFloat(ret);
  6336. });
  6337. }
  6338. typedef f64 (*__f_float__float_bool)(f64, bool);
  6339. __EXPORT
  6340. void pkpy_vm_bind_float__float_bool(VM* vm, const char* mod, const char* name, __f_float__float_bool f) {
  6341. PyVar obj = vm->new_module_if_not_existed(mod);
  6342. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6343. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6344. bool _1 = vm->PyBool_AS_C(args[1]);
  6345. f64 ret = f(_0, _1);
  6346. return vm->PyFloat(ret);
  6347. });
  6348. }
  6349. typedef f64 (*__f_float__str_int)(const char*, i64);
  6350. __EXPORT
  6351. void pkpy_vm_bind_float__str_int(VM* vm, const char* mod, const char* name, __f_float__str_int f) {
  6352. PyVar obj = vm->new_module_if_not_existed(mod);
  6353. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6354. const char* _0 = vm->PyStr_AS_C(args[0]);
  6355. i64 _1 = vm->PyInt_AS_C(args[1]);
  6356. f64 ret = f(_0, _1);
  6357. return vm->PyFloat(ret);
  6358. });
  6359. }
  6360. typedef f64 (*__f_float__str_float)(const char*, f64);
  6361. __EXPORT
  6362. void pkpy_vm_bind_float__str_float(VM* vm, const char* mod, const char* name, __f_float__str_float f) {
  6363. PyVar obj = vm->new_module_if_not_existed(mod);
  6364. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6365. const char* _0 = vm->PyStr_AS_C(args[0]);
  6366. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6367. f64 ret = f(_0, _1);
  6368. return vm->PyFloat(ret);
  6369. });
  6370. }
  6371. typedef f64 (*__f_float__str_str)(const char*, const char*);
  6372. __EXPORT
  6373. void pkpy_vm_bind_float__str_str(VM* vm, const char* mod, const char* name, __f_float__str_str f) {
  6374. PyVar obj = vm->new_module_if_not_existed(mod);
  6375. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6376. const char* _0 = vm->PyStr_AS_C(args[0]);
  6377. const char* _1 = vm->PyStr_AS_C(args[1]);
  6378. f64 ret = f(_0, _1);
  6379. return vm->PyFloat(ret);
  6380. });
  6381. }
  6382. typedef f64 (*__f_float__str_bool)(const char*, bool);
  6383. __EXPORT
  6384. void pkpy_vm_bind_float__str_bool(VM* vm, const char* mod, const char* name, __f_float__str_bool f) {
  6385. PyVar obj = vm->new_module_if_not_existed(mod);
  6386. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6387. const char* _0 = vm->PyStr_AS_C(args[0]);
  6388. bool _1 = vm->PyBool_AS_C(args[1]);
  6389. f64 ret = f(_0, _1);
  6390. return vm->PyFloat(ret);
  6391. });
  6392. }
  6393. typedef f64 (*__f_float__bool_int)(bool, i64);
  6394. __EXPORT
  6395. void pkpy_vm_bind_float__bool_int(VM* vm, const char* mod, const char* name, __f_float__bool_int f) {
  6396. PyVar obj = vm->new_module_if_not_existed(mod);
  6397. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6398. bool _0 = vm->PyBool_AS_C(args[0]);
  6399. i64 _1 = vm->PyInt_AS_C(args[1]);
  6400. f64 ret = f(_0, _1);
  6401. return vm->PyFloat(ret);
  6402. });
  6403. }
  6404. typedef f64 (*__f_float__bool_float)(bool, f64);
  6405. __EXPORT
  6406. void pkpy_vm_bind_float__bool_float(VM* vm, const char* mod, const char* name, __f_float__bool_float f) {
  6407. PyVar obj = vm->new_module_if_not_existed(mod);
  6408. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6409. bool _0 = vm->PyBool_AS_C(args[0]);
  6410. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6411. f64 ret = f(_0, _1);
  6412. return vm->PyFloat(ret);
  6413. });
  6414. }
  6415. typedef f64 (*__f_float__bool_str)(bool, const char*);
  6416. __EXPORT
  6417. void pkpy_vm_bind_float__bool_str(VM* vm, const char* mod, const char* name, __f_float__bool_str f) {
  6418. PyVar obj = vm->new_module_if_not_existed(mod);
  6419. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6420. bool _0 = vm->PyBool_AS_C(args[0]);
  6421. const char* _1 = vm->PyStr_AS_C(args[1]);
  6422. f64 ret = f(_0, _1);
  6423. return vm->PyFloat(ret);
  6424. });
  6425. }
  6426. typedef f64 (*__f_float__bool_bool)(bool, bool);
  6427. __EXPORT
  6428. void pkpy_vm_bind_float__bool_bool(VM* vm, const char* mod, const char* name, __f_float__bool_bool f) {
  6429. PyVar obj = vm->new_module_if_not_existed(mod);
  6430. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6431. bool _0 = vm->PyBool_AS_C(args[0]);
  6432. bool _1 = vm->PyBool_AS_C(args[1]);
  6433. f64 ret = f(_0, _1);
  6434. return vm->PyFloat(ret);
  6435. });
  6436. }
  6437. typedef const char* (*__f_str__int_int)(i64, i64);
  6438. __EXPORT
  6439. void pkpy_vm_bind_str__int_int(VM* vm, const char* mod, const char* name, __f_str__int_int f) {
  6440. PyVar obj = vm->new_module_if_not_existed(mod);
  6441. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6442. i64 _0 = vm->PyInt_AS_C(args[0]);
  6443. i64 _1 = vm->PyInt_AS_C(args[1]);
  6444. const char* ret = f(_0, _1);
  6445. return vm->PyStr(ret);
  6446. });
  6447. }
  6448. typedef const char* (*__f_str__int_float)(i64, f64);
  6449. __EXPORT
  6450. void pkpy_vm_bind_str__int_float(VM* vm, const char* mod, const char* name, __f_str__int_float f) {
  6451. PyVar obj = vm->new_module_if_not_existed(mod);
  6452. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6453. i64 _0 = vm->PyInt_AS_C(args[0]);
  6454. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6455. const char* ret = f(_0, _1);
  6456. return vm->PyStr(ret);
  6457. });
  6458. }
  6459. typedef const char* (*__f_str__int_str)(i64, const char*);
  6460. __EXPORT
  6461. void pkpy_vm_bind_str__int_str(VM* vm, const char* mod, const char* name, __f_str__int_str f) {
  6462. PyVar obj = vm->new_module_if_not_existed(mod);
  6463. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6464. i64 _0 = vm->PyInt_AS_C(args[0]);
  6465. const char* _1 = vm->PyStr_AS_C(args[1]);
  6466. const char* ret = f(_0, _1);
  6467. return vm->PyStr(ret);
  6468. });
  6469. }
  6470. typedef const char* (*__f_str__int_bool)(i64, bool);
  6471. __EXPORT
  6472. void pkpy_vm_bind_str__int_bool(VM* vm, const char* mod, const char* name, __f_str__int_bool f) {
  6473. PyVar obj = vm->new_module_if_not_existed(mod);
  6474. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6475. i64 _0 = vm->PyInt_AS_C(args[0]);
  6476. bool _1 = vm->PyBool_AS_C(args[1]);
  6477. const char* ret = f(_0, _1);
  6478. return vm->PyStr(ret);
  6479. });
  6480. }
  6481. typedef const char* (*__f_str__float_int)(f64, i64);
  6482. __EXPORT
  6483. void pkpy_vm_bind_str__float_int(VM* vm, const char* mod, const char* name, __f_str__float_int f) {
  6484. PyVar obj = vm->new_module_if_not_existed(mod);
  6485. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6486. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6487. i64 _1 = vm->PyInt_AS_C(args[1]);
  6488. const char* ret = f(_0, _1);
  6489. return vm->PyStr(ret);
  6490. });
  6491. }
  6492. typedef const char* (*__f_str__float_float)(f64, f64);
  6493. __EXPORT
  6494. void pkpy_vm_bind_str__float_float(VM* vm, const char* mod, const char* name, __f_str__float_float f) {
  6495. PyVar obj = vm->new_module_if_not_existed(mod);
  6496. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6497. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6498. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6499. const char* ret = f(_0, _1);
  6500. return vm->PyStr(ret);
  6501. });
  6502. }
  6503. typedef const char* (*__f_str__float_str)(f64, const char*);
  6504. __EXPORT
  6505. void pkpy_vm_bind_str__float_str(VM* vm, const char* mod, const char* name, __f_str__float_str f) {
  6506. PyVar obj = vm->new_module_if_not_existed(mod);
  6507. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6508. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6509. const char* _1 = vm->PyStr_AS_C(args[1]);
  6510. const char* ret = f(_0, _1);
  6511. return vm->PyStr(ret);
  6512. });
  6513. }
  6514. typedef const char* (*__f_str__float_bool)(f64, bool);
  6515. __EXPORT
  6516. void pkpy_vm_bind_str__float_bool(VM* vm, const char* mod, const char* name, __f_str__float_bool f) {
  6517. PyVar obj = vm->new_module_if_not_existed(mod);
  6518. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6519. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6520. bool _1 = vm->PyBool_AS_C(args[1]);
  6521. const char* ret = f(_0, _1);
  6522. return vm->PyStr(ret);
  6523. });
  6524. }
  6525. typedef const char* (*__f_str__str_int)(const char*, i64);
  6526. __EXPORT
  6527. void pkpy_vm_bind_str__str_int(VM* vm, const char* mod, const char* name, __f_str__str_int f) {
  6528. PyVar obj = vm->new_module_if_not_existed(mod);
  6529. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6530. const char* _0 = vm->PyStr_AS_C(args[0]);
  6531. i64 _1 = vm->PyInt_AS_C(args[1]);
  6532. const char* ret = f(_0, _1);
  6533. return vm->PyStr(ret);
  6534. });
  6535. }
  6536. typedef const char* (*__f_str__str_float)(const char*, f64);
  6537. __EXPORT
  6538. void pkpy_vm_bind_str__str_float(VM* vm, const char* mod, const char* name, __f_str__str_float f) {
  6539. PyVar obj = vm->new_module_if_not_existed(mod);
  6540. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6541. const char* _0 = vm->PyStr_AS_C(args[0]);
  6542. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6543. const char* ret = f(_0, _1);
  6544. return vm->PyStr(ret);
  6545. });
  6546. }
  6547. typedef const char* (*__f_str__str_str)(const char*, const char*);
  6548. __EXPORT
  6549. void pkpy_vm_bind_str__str_str(VM* vm, const char* mod, const char* name, __f_str__str_str f) {
  6550. PyVar obj = vm->new_module_if_not_existed(mod);
  6551. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6552. const char* _0 = vm->PyStr_AS_C(args[0]);
  6553. const char* _1 = vm->PyStr_AS_C(args[1]);
  6554. const char* ret = f(_0, _1);
  6555. return vm->PyStr(ret);
  6556. });
  6557. }
  6558. typedef const char* (*__f_str__str_bool)(const char*, bool);
  6559. __EXPORT
  6560. void pkpy_vm_bind_str__str_bool(VM* vm, const char* mod, const char* name, __f_str__str_bool f) {
  6561. PyVar obj = vm->new_module_if_not_existed(mod);
  6562. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6563. const char* _0 = vm->PyStr_AS_C(args[0]);
  6564. bool _1 = vm->PyBool_AS_C(args[1]);
  6565. const char* ret = f(_0, _1);
  6566. return vm->PyStr(ret);
  6567. });
  6568. }
  6569. typedef const char* (*__f_str__bool_int)(bool, i64);
  6570. __EXPORT
  6571. void pkpy_vm_bind_str__bool_int(VM* vm, const char* mod, const char* name, __f_str__bool_int f) {
  6572. PyVar obj = vm->new_module_if_not_existed(mod);
  6573. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6574. bool _0 = vm->PyBool_AS_C(args[0]);
  6575. i64 _1 = vm->PyInt_AS_C(args[1]);
  6576. const char* ret = f(_0, _1);
  6577. return vm->PyStr(ret);
  6578. });
  6579. }
  6580. typedef const char* (*__f_str__bool_float)(bool, f64);
  6581. __EXPORT
  6582. void pkpy_vm_bind_str__bool_float(VM* vm, const char* mod, const char* name, __f_str__bool_float f) {
  6583. PyVar obj = vm->new_module_if_not_existed(mod);
  6584. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6585. bool _0 = vm->PyBool_AS_C(args[0]);
  6586. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6587. const char* ret = f(_0, _1);
  6588. return vm->PyStr(ret);
  6589. });
  6590. }
  6591. typedef const char* (*__f_str__bool_str)(bool, const char*);
  6592. __EXPORT
  6593. void pkpy_vm_bind_str__bool_str(VM* vm, const char* mod, const char* name, __f_str__bool_str f) {
  6594. PyVar obj = vm->new_module_if_not_existed(mod);
  6595. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6596. bool _0 = vm->PyBool_AS_C(args[0]);
  6597. const char* _1 = vm->PyStr_AS_C(args[1]);
  6598. const char* ret = f(_0, _1);
  6599. return vm->PyStr(ret);
  6600. });
  6601. }
  6602. typedef const char* (*__f_str__bool_bool)(bool, bool);
  6603. __EXPORT
  6604. void pkpy_vm_bind_str__bool_bool(VM* vm, const char* mod, const char* name, __f_str__bool_bool f) {
  6605. PyVar obj = vm->new_module_if_not_existed(mod);
  6606. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6607. bool _0 = vm->PyBool_AS_C(args[0]);
  6608. bool _1 = vm->PyBool_AS_C(args[1]);
  6609. const char* ret = f(_0, _1);
  6610. return vm->PyStr(ret);
  6611. });
  6612. }
  6613. typedef bool (*__f_bool__int_int)(i64, i64);
  6614. __EXPORT
  6615. void pkpy_vm_bind_bool__int_int(VM* vm, const char* mod, const char* name, __f_bool__int_int f) {
  6616. PyVar obj = vm->new_module_if_not_existed(mod);
  6617. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6618. i64 _0 = vm->PyInt_AS_C(args[0]);
  6619. i64 _1 = vm->PyInt_AS_C(args[1]);
  6620. bool ret = f(_0, _1);
  6621. return vm->PyBool(ret);
  6622. });
  6623. }
  6624. typedef bool (*__f_bool__int_float)(i64, f64);
  6625. __EXPORT
  6626. void pkpy_vm_bind_bool__int_float(VM* vm, const char* mod, const char* name, __f_bool__int_float f) {
  6627. PyVar obj = vm->new_module_if_not_existed(mod);
  6628. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6629. i64 _0 = vm->PyInt_AS_C(args[0]);
  6630. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6631. bool ret = f(_0, _1);
  6632. return vm->PyBool(ret);
  6633. });
  6634. }
  6635. typedef bool (*__f_bool__int_str)(i64, const char*);
  6636. __EXPORT
  6637. void pkpy_vm_bind_bool__int_str(VM* vm, const char* mod, const char* name, __f_bool__int_str f) {
  6638. PyVar obj = vm->new_module_if_not_existed(mod);
  6639. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6640. i64 _0 = vm->PyInt_AS_C(args[0]);
  6641. const char* _1 = vm->PyStr_AS_C(args[1]);
  6642. bool ret = f(_0, _1);
  6643. return vm->PyBool(ret);
  6644. });
  6645. }
  6646. typedef bool (*__f_bool__int_bool)(i64, bool);
  6647. __EXPORT
  6648. void pkpy_vm_bind_bool__int_bool(VM* vm, const char* mod, const char* name, __f_bool__int_bool f) {
  6649. PyVar obj = vm->new_module_if_not_existed(mod);
  6650. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6651. i64 _0 = vm->PyInt_AS_C(args[0]);
  6652. bool _1 = vm->PyBool_AS_C(args[1]);
  6653. bool ret = f(_0, _1);
  6654. return vm->PyBool(ret);
  6655. });
  6656. }
  6657. typedef bool (*__f_bool__float_int)(f64, i64);
  6658. __EXPORT
  6659. void pkpy_vm_bind_bool__float_int(VM* vm, const char* mod, const char* name, __f_bool__float_int f) {
  6660. PyVar obj = vm->new_module_if_not_existed(mod);
  6661. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6662. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6663. i64 _1 = vm->PyInt_AS_C(args[1]);
  6664. bool ret = f(_0, _1);
  6665. return vm->PyBool(ret);
  6666. });
  6667. }
  6668. typedef bool (*__f_bool__float_float)(f64, f64);
  6669. __EXPORT
  6670. void pkpy_vm_bind_bool__float_float(VM* vm, const char* mod, const char* name, __f_bool__float_float f) {
  6671. PyVar obj = vm->new_module_if_not_existed(mod);
  6672. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6673. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6674. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6675. bool ret = f(_0, _1);
  6676. return vm->PyBool(ret);
  6677. });
  6678. }
  6679. typedef bool (*__f_bool__float_str)(f64, const char*);
  6680. __EXPORT
  6681. void pkpy_vm_bind_bool__float_str(VM* vm, const char* mod, const char* name, __f_bool__float_str f) {
  6682. PyVar obj = vm->new_module_if_not_existed(mod);
  6683. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6684. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6685. const char* _1 = vm->PyStr_AS_C(args[1]);
  6686. bool ret = f(_0, _1);
  6687. return vm->PyBool(ret);
  6688. });
  6689. }
  6690. typedef bool (*__f_bool__float_bool)(f64, bool);
  6691. __EXPORT
  6692. void pkpy_vm_bind_bool__float_bool(VM* vm, const char* mod, const char* name, __f_bool__float_bool f) {
  6693. PyVar obj = vm->new_module_if_not_existed(mod);
  6694. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6695. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6696. bool _1 = vm->PyBool_AS_C(args[1]);
  6697. bool ret = f(_0, _1);
  6698. return vm->PyBool(ret);
  6699. });
  6700. }
  6701. typedef bool (*__f_bool__str_int)(const char*, i64);
  6702. __EXPORT
  6703. void pkpy_vm_bind_bool__str_int(VM* vm, const char* mod, const char* name, __f_bool__str_int f) {
  6704. PyVar obj = vm->new_module_if_not_existed(mod);
  6705. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6706. const char* _0 = vm->PyStr_AS_C(args[0]);
  6707. i64 _1 = vm->PyInt_AS_C(args[1]);
  6708. bool ret = f(_0, _1);
  6709. return vm->PyBool(ret);
  6710. });
  6711. }
  6712. typedef bool (*__f_bool__str_float)(const char*, f64);
  6713. __EXPORT
  6714. void pkpy_vm_bind_bool__str_float(VM* vm, const char* mod, const char* name, __f_bool__str_float f) {
  6715. PyVar obj = vm->new_module_if_not_existed(mod);
  6716. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6717. const char* _0 = vm->PyStr_AS_C(args[0]);
  6718. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6719. bool ret = f(_0, _1);
  6720. return vm->PyBool(ret);
  6721. });
  6722. }
  6723. typedef bool (*__f_bool__str_str)(const char*, const char*);
  6724. __EXPORT
  6725. void pkpy_vm_bind_bool__str_str(VM* vm, const char* mod, const char* name, __f_bool__str_str f) {
  6726. PyVar obj = vm->new_module_if_not_existed(mod);
  6727. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6728. const char* _0 = vm->PyStr_AS_C(args[0]);
  6729. const char* _1 = vm->PyStr_AS_C(args[1]);
  6730. bool ret = f(_0, _1);
  6731. return vm->PyBool(ret);
  6732. });
  6733. }
  6734. typedef bool (*__f_bool__str_bool)(const char*, bool);
  6735. __EXPORT
  6736. void pkpy_vm_bind_bool__str_bool(VM* vm, const char* mod, const char* name, __f_bool__str_bool f) {
  6737. PyVar obj = vm->new_module_if_not_existed(mod);
  6738. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6739. const char* _0 = vm->PyStr_AS_C(args[0]);
  6740. bool _1 = vm->PyBool_AS_C(args[1]);
  6741. bool ret = f(_0, _1);
  6742. return vm->PyBool(ret);
  6743. });
  6744. }
  6745. typedef bool (*__f_bool__bool_int)(bool, i64);
  6746. __EXPORT
  6747. void pkpy_vm_bind_bool__bool_int(VM* vm, const char* mod, const char* name, __f_bool__bool_int f) {
  6748. PyVar obj = vm->new_module_if_not_existed(mod);
  6749. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6750. bool _0 = vm->PyBool_AS_C(args[0]);
  6751. i64 _1 = vm->PyInt_AS_C(args[1]);
  6752. bool ret = f(_0, _1);
  6753. return vm->PyBool(ret);
  6754. });
  6755. }
  6756. typedef bool (*__f_bool__bool_float)(bool, f64);
  6757. __EXPORT
  6758. void pkpy_vm_bind_bool__bool_float(VM* vm, const char* mod, const char* name, __f_bool__bool_float f) {
  6759. PyVar obj = vm->new_module_if_not_existed(mod);
  6760. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6761. bool _0 = vm->PyBool_AS_C(args[0]);
  6762. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6763. bool ret = f(_0, _1);
  6764. return vm->PyBool(ret);
  6765. });
  6766. }
  6767. typedef bool (*__f_bool__bool_str)(bool, const char*);
  6768. __EXPORT
  6769. void pkpy_vm_bind_bool__bool_str(VM* vm, const char* mod, const char* name, __f_bool__bool_str f) {
  6770. PyVar obj = vm->new_module_if_not_existed(mod);
  6771. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6772. bool _0 = vm->PyBool_AS_C(args[0]);
  6773. const char* _1 = vm->PyStr_AS_C(args[1]);
  6774. bool ret = f(_0, _1);
  6775. return vm->PyBool(ret);
  6776. });
  6777. }
  6778. typedef bool (*__f_bool__bool_bool)(bool, bool);
  6779. __EXPORT
  6780. void pkpy_vm_bind_bool__bool_bool(VM* vm, const char* mod, const char* name, __f_bool__bool_bool f) {
  6781. PyVar obj = vm->new_module_if_not_existed(mod);
  6782. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6783. bool _0 = vm->PyBool_AS_C(args[0]);
  6784. bool _1 = vm->PyBool_AS_C(args[1]);
  6785. bool ret = f(_0, _1);
  6786. return vm->PyBool(ret);
  6787. });
  6788. }
  6789. typedef void (*__f_None__int_int)(i64, i64);
  6790. __EXPORT
  6791. void pkpy_vm_bind_None__int_int(VM* vm, const char* mod, const char* name, __f_None__int_int f) {
  6792. PyVar obj = vm->new_module_if_not_existed(mod);
  6793. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6794. i64 _0 = vm->PyInt_AS_C(args[0]);
  6795. i64 _1 = vm->PyInt_AS_C(args[1]);
  6796. f(_0, _1);
  6797. return vm->None;
  6798. });
  6799. }
  6800. typedef void (*__f_None__int_float)(i64, f64);
  6801. __EXPORT
  6802. void pkpy_vm_bind_None__int_float(VM* vm, const char* mod, const char* name, __f_None__int_float f) {
  6803. PyVar obj = vm->new_module_if_not_existed(mod);
  6804. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6805. i64 _0 = vm->PyInt_AS_C(args[0]);
  6806. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6807. f(_0, _1);
  6808. return vm->None;
  6809. });
  6810. }
  6811. typedef void (*__f_None__int_str)(i64, const char*);
  6812. __EXPORT
  6813. void pkpy_vm_bind_None__int_str(VM* vm, const char* mod, const char* name, __f_None__int_str f) {
  6814. PyVar obj = vm->new_module_if_not_existed(mod);
  6815. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6816. i64 _0 = vm->PyInt_AS_C(args[0]);
  6817. const char* _1 = vm->PyStr_AS_C(args[1]);
  6818. f(_0, _1);
  6819. return vm->None;
  6820. });
  6821. }
  6822. typedef void (*__f_None__int_bool)(i64, bool);
  6823. __EXPORT
  6824. void pkpy_vm_bind_None__int_bool(VM* vm, const char* mod, const char* name, __f_None__int_bool f) {
  6825. PyVar obj = vm->new_module_if_not_existed(mod);
  6826. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6827. i64 _0 = vm->PyInt_AS_C(args[0]);
  6828. bool _1 = vm->PyBool_AS_C(args[1]);
  6829. f(_0, _1);
  6830. return vm->None;
  6831. });
  6832. }
  6833. typedef void (*__f_None__float_int)(f64, i64);
  6834. __EXPORT
  6835. void pkpy_vm_bind_None__float_int(VM* vm, const char* mod, const char* name, __f_None__float_int f) {
  6836. PyVar obj = vm->new_module_if_not_existed(mod);
  6837. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6838. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6839. i64 _1 = vm->PyInt_AS_C(args[1]);
  6840. f(_0, _1);
  6841. return vm->None;
  6842. });
  6843. }
  6844. typedef void (*__f_None__float_float)(f64, f64);
  6845. __EXPORT
  6846. void pkpy_vm_bind_None__float_float(VM* vm, const char* mod, const char* name, __f_None__float_float f) {
  6847. PyVar obj = vm->new_module_if_not_existed(mod);
  6848. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6849. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6850. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6851. f(_0, _1);
  6852. return vm->None;
  6853. });
  6854. }
  6855. typedef void (*__f_None__float_str)(f64, const char*);
  6856. __EXPORT
  6857. void pkpy_vm_bind_None__float_str(VM* vm, const char* mod, const char* name, __f_None__float_str f) {
  6858. PyVar obj = vm->new_module_if_not_existed(mod);
  6859. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6860. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6861. const char* _1 = vm->PyStr_AS_C(args[1]);
  6862. f(_0, _1);
  6863. return vm->None;
  6864. });
  6865. }
  6866. typedef void (*__f_None__float_bool)(f64, bool);
  6867. __EXPORT
  6868. void pkpy_vm_bind_None__float_bool(VM* vm, const char* mod, const char* name, __f_None__float_bool f) {
  6869. PyVar obj = vm->new_module_if_not_existed(mod);
  6870. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6871. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6872. bool _1 = vm->PyBool_AS_C(args[1]);
  6873. f(_0, _1);
  6874. return vm->None;
  6875. });
  6876. }
  6877. typedef void (*__f_None__str_int)(const char*, i64);
  6878. __EXPORT
  6879. void pkpy_vm_bind_None__str_int(VM* vm, const char* mod, const char* name, __f_None__str_int f) {
  6880. PyVar obj = vm->new_module_if_not_existed(mod);
  6881. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6882. const char* _0 = vm->PyStr_AS_C(args[0]);
  6883. i64 _1 = vm->PyInt_AS_C(args[1]);
  6884. f(_0, _1);
  6885. return vm->None;
  6886. });
  6887. }
  6888. typedef void (*__f_None__str_float)(const char*, f64);
  6889. __EXPORT
  6890. void pkpy_vm_bind_None__str_float(VM* vm, const char* mod, const char* name, __f_None__str_float f) {
  6891. PyVar obj = vm->new_module_if_not_existed(mod);
  6892. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6893. const char* _0 = vm->PyStr_AS_C(args[0]);
  6894. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6895. f(_0, _1);
  6896. return vm->None;
  6897. });
  6898. }
  6899. typedef void (*__f_None__str_str)(const char*, const char*);
  6900. __EXPORT
  6901. void pkpy_vm_bind_None__str_str(VM* vm, const char* mod, const char* name, __f_None__str_str f) {
  6902. PyVar obj = vm->new_module_if_not_existed(mod);
  6903. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6904. const char* _0 = vm->PyStr_AS_C(args[0]);
  6905. const char* _1 = vm->PyStr_AS_C(args[1]);
  6906. f(_0, _1);
  6907. return vm->None;
  6908. });
  6909. }
  6910. typedef void (*__f_None__str_bool)(const char*, bool);
  6911. __EXPORT
  6912. void pkpy_vm_bind_None__str_bool(VM* vm, const char* mod, const char* name, __f_None__str_bool f) {
  6913. PyVar obj = vm->new_module_if_not_existed(mod);
  6914. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6915. const char* _0 = vm->PyStr_AS_C(args[0]);
  6916. bool _1 = vm->PyBool_AS_C(args[1]);
  6917. f(_0, _1);
  6918. return vm->None;
  6919. });
  6920. }
  6921. typedef void (*__f_None__bool_int)(bool, i64);
  6922. __EXPORT
  6923. void pkpy_vm_bind_None__bool_int(VM* vm, const char* mod, const char* name, __f_None__bool_int f) {
  6924. PyVar obj = vm->new_module_if_not_existed(mod);
  6925. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6926. bool _0 = vm->PyBool_AS_C(args[0]);
  6927. i64 _1 = vm->PyInt_AS_C(args[1]);
  6928. f(_0, _1);
  6929. return vm->None;
  6930. });
  6931. }
  6932. typedef void (*__f_None__bool_float)(bool, f64);
  6933. __EXPORT
  6934. void pkpy_vm_bind_None__bool_float(VM* vm, const char* mod, const char* name, __f_None__bool_float f) {
  6935. PyVar obj = vm->new_module_if_not_existed(mod);
  6936. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6937. bool _0 = vm->PyBool_AS_C(args[0]);
  6938. f64 _1 = vm->PyFloat_AS_C(args[1]);
  6939. f(_0, _1);
  6940. return vm->None;
  6941. });
  6942. }
  6943. typedef void (*__f_None__bool_str)(bool, const char*);
  6944. __EXPORT
  6945. void pkpy_vm_bind_None__bool_str(VM* vm, const char* mod, const char* name, __f_None__bool_str f) {
  6946. PyVar obj = vm->new_module_if_not_existed(mod);
  6947. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6948. bool _0 = vm->PyBool_AS_C(args[0]);
  6949. const char* _1 = vm->PyStr_AS_C(args[1]);
  6950. f(_0, _1);
  6951. return vm->None;
  6952. });
  6953. }
  6954. typedef void (*__f_None__bool_bool)(bool, bool);
  6955. __EXPORT
  6956. void pkpy_vm_bind_None__bool_bool(VM* vm, const char* mod, const char* name, __f_None__bool_bool f) {
  6957. PyVar obj = vm->new_module_if_not_existed(mod);
  6958. vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6959. bool _0 = vm->PyBool_AS_C(args[0]);
  6960. bool _1 = vm->PyBool_AS_C(args[1]);
  6961. f(_0, _1);
  6962. return vm->None;
  6963. });
  6964. }
  6965. typedef i64 (*__f_int__int)(i64);
  6966. __EXPORT
  6967. void pkpy_vm_bind_int__int(VM* vm, const char* mod, const char* name, __f_int__int f) {
  6968. PyVar obj = vm->new_module_if_not_existed(mod);
  6969. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6970. i64 _0 = vm->PyInt_AS_C(args[0]);
  6971. i64 ret = f(_0);
  6972. return vm->PyInt(ret);
  6973. });
  6974. }
  6975. typedef i64 (*__f_int__float)(f64);
  6976. __EXPORT
  6977. void pkpy_vm_bind_int__float(VM* vm, const char* mod, const char* name, __f_int__float f) {
  6978. PyVar obj = vm->new_module_if_not_existed(mod);
  6979. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6980. f64 _0 = vm->PyFloat_AS_C(args[0]);
  6981. i64 ret = f(_0);
  6982. return vm->PyInt(ret);
  6983. });
  6984. }
  6985. typedef i64 (*__f_int__str)(const char*);
  6986. __EXPORT
  6987. void pkpy_vm_bind_int__str(VM* vm, const char* mod, const char* name, __f_int__str f) {
  6988. PyVar obj = vm->new_module_if_not_existed(mod);
  6989. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  6990. const char* _0 = vm->PyStr_AS_C(args[0]);
  6991. i64 ret = f(_0);
  6992. return vm->PyInt(ret);
  6993. });
  6994. }
  6995. typedef i64 (*__f_int__bool)(bool);
  6996. __EXPORT
  6997. void pkpy_vm_bind_int__bool(VM* vm, const char* mod, const char* name, __f_int__bool f) {
  6998. PyVar obj = vm->new_module_if_not_existed(mod);
  6999. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7000. bool _0 = vm->PyBool_AS_C(args[0]);
  7001. i64 ret = f(_0);
  7002. return vm->PyInt(ret);
  7003. });
  7004. }
  7005. typedef f64 (*__f_float__int)(i64);
  7006. __EXPORT
  7007. void pkpy_vm_bind_float__int(VM* vm, const char* mod, const char* name, __f_float__int f) {
  7008. PyVar obj = vm->new_module_if_not_existed(mod);
  7009. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7010. i64 _0 = vm->PyInt_AS_C(args[0]);
  7011. f64 ret = f(_0);
  7012. return vm->PyFloat(ret);
  7013. });
  7014. }
  7015. typedef f64 (*__f_float__float)(f64);
  7016. __EXPORT
  7017. void pkpy_vm_bind_float__float(VM* vm, const char* mod, const char* name, __f_float__float f) {
  7018. PyVar obj = vm->new_module_if_not_existed(mod);
  7019. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7020. f64 _0 = vm->PyFloat_AS_C(args[0]);
  7021. f64 ret = f(_0);
  7022. return vm->PyFloat(ret);
  7023. });
  7024. }
  7025. typedef f64 (*__f_float__str)(const char*);
  7026. __EXPORT
  7027. void pkpy_vm_bind_float__str(VM* vm, const char* mod, const char* name, __f_float__str f) {
  7028. PyVar obj = vm->new_module_if_not_existed(mod);
  7029. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7030. const char* _0 = vm->PyStr_AS_C(args[0]);
  7031. f64 ret = f(_0);
  7032. return vm->PyFloat(ret);
  7033. });
  7034. }
  7035. typedef f64 (*__f_float__bool)(bool);
  7036. __EXPORT
  7037. void pkpy_vm_bind_float__bool(VM* vm, const char* mod, const char* name, __f_float__bool f) {
  7038. PyVar obj = vm->new_module_if_not_existed(mod);
  7039. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7040. bool _0 = vm->PyBool_AS_C(args[0]);
  7041. f64 ret = f(_0);
  7042. return vm->PyFloat(ret);
  7043. });
  7044. }
  7045. typedef const char* (*__f_str__int)(i64);
  7046. __EXPORT
  7047. void pkpy_vm_bind_str__int(VM* vm, const char* mod, const char* name, __f_str__int f) {
  7048. PyVar obj = vm->new_module_if_not_existed(mod);
  7049. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7050. i64 _0 = vm->PyInt_AS_C(args[0]);
  7051. const char* ret = f(_0);
  7052. return vm->PyStr(ret);
  7053. });
  7054. }
  7055. typedef const char* (*__f_str__float)(f64);
  7056. __EXPORT
  7057. void pkpy_vm_bind_str__float(VM* vm, const char* mod, const char* name, __f_str__float f) {
  7058. PyVar obj = vm->new_module_if_not_existed(mod);
  7059. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7060. f64 _0 = vm->PyFloat_AS_C(args[0]);
  7061. const char* ret = f(_0);
  7062. return vm->PyStr(ret);
  7063. });
  7064. }
  7065. typedef const char* (*__f_str__str)(const char*);
  7066. __EXPORT
  7067. void pkpy_vm_bind_str__str(VM* vm, const char* mod, const char* name, __f_str__str f) {
  7068. PyVar obj = vm->new_module_if_not_existed(mod);
  7069. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7070. const char* _0 = vm->PyStr_AS_C(args[0]);
  7071. const char* ret = f(_0);
  7072. return vm->PyStr(ret);
  7073. });
  7074. }
  7075. typedef const char* (*__f_str__bool)(bool);
  7076. __EXPORT
  7077. void pkpy_vm_bind_str__bool(VM* vm, const char* mod, const char* name, __f_str__bool f) {
  7078. PyVar obj = vm->new_module_if_not_existed(mod);
  7079. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7080. bool _0 = vm->PyBool_AS_C(args[0]);
  7081. const char* ret = f(_0);
  7082. return vm->PyStr(ret);
  7083. });
  7084. }
  7085. typedef bool (*__f_bool__int)(i64);
  7086. __EXPORT
  7087. void pkpy_vm_bind_bool__int(VM* vm, const char* mod, const char* name, __f_bool__int f) {
  7088. PyVar obj = vm->new_module_if_not_existed(mod);
  7089. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7090. i64 _0 = vm->PyInt_AS_C(args[0]);
  7091. bool ret = f(_0);
  7092. return vm->PyBool(ret);
  7093. });
  7094. }
  7095. typedef bool (*__f_bool__float)(f64);
  7096. __EXPORT
  7097. void pkpy_vm_bind_bool__float(VM* vm, const char* mod, const char* name, __f_bool__float f) {
  7098. PyVar obj = vm->new_module_if_not_existed(mod);
  7099. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7100. f64 _0 = vm->PyFloat_AS_C(args[0]);
  7101. bool ret = f(_0);
  7102. return vm->PyBool(ret);
  7103. });
  7104. }
  7105. typedef bool (*__f_bool__str)(const char*);
  7106. __EXPORT
  7107. void pkpy_vm_bind_bool__str(VM* vm, const char* mod, const char* name, __f_bool__str f) {
  7108. PyVar obj = vm->new_module_if_not_existed(mod);
  7109. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7110. const char* _0 = vm->PyStr_AS_C(args[0]);
  7111. bool ret = f(_0);
  7112. return vm->PyBool(ret);
  7113. });
  7114. }
  7115. typedef bool (*__f_bool__bool)(bool);
  7116. __EXPORT
  7117. void pkpy_vm_bind_bool__bool(VM* vm, const char* mod, const char* name, __f_bool__bool f) {
  7118. PyVar obj = vm->new_module_if_not_existed(mod);
  7119. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7120. bool _0 = vm->PyBool_AS_C(args[0]);
  7121. bool ret = f(_0);
  7122. return vm->PyBool(ret);
  7123. });
  7124. }
  7125. typedef void (*__f_None__int)(i64);
  7126. __EXPORT
  7127. void pkpy_vm_bind_None__int(VM* vm, const char* mod, const char* name, __f_None__int f) {
  7128. PyVar obj = vm->new_module_if_not_existed(mod);
  7129. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7130. i64 _0 = vm->PyInt_AS_C(args[0]);
  7131. f(_0);
  7132. return vm->None;
  7133. });
  7134. }
  7135. typedef void (*__f_None__float)(f64);
  7136. __EXPORT
  7137. void pkpy_vm_bind_None__float(VM* vm, const char* mod, const char* name, __f_None__float f) {
  7138. PyVar obj = vm->new_module_if_not_existed(mod);
  7139. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7140. f64 _0 = vm->PyFloat_AS_C(args[0]);
  7141. f(_0);
  7142. return vm->None;
  7143. });
  7144. }
  7145. typedef void (*__f_None__str)(const char*);
  7146. __EXPORT
  7147. void pkpy_vm_bind_None__str(VM* vm, const char* mod, const char* name, __f_None__str f) {
  7148. PyVar obj = vm->new_module_if_not_existed(mod);
  7149. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7150. const char* _0 = vm->PyStr_AS_C(args[0]);
  7151. f(_0);
  7152. return vm->None;
  7153. });
  7154. }
  7155. typedef void (*__f_None__bool)(bool);
  7156. __EXPORT
  7157. void pkpy_vm_bind_None__bool(VM* vm, const char* mod, const char* name, __f_None__bool f) {
  7158. PyVar obj = vm->new_module_if_not_existed(mod);
  7159. vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7160. bool _0 = vm->PyBool_AS_C(args[0]);
  7161. f(_0);
  7162. return vm->None;
  7163. });
  7164. }
  7165. typedef i64 (*__f_int__)();
  7166. __EXPORT
  7167. void pkpy_vm_bind_int__(VM* vm, const char* mod, const char* name, __f_int__ f) {
  7168. PyVar obj = vm->new_module_if_not_existed(mod);
  7169. vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7170. i64 ret = f();
  7171. return vm->PyInt(ret);
  7172. });
  7173. }
  7174. typedef f64 (*__f_float__)();
  7175. __EXPORT
  7176. void pkpy_vm_bind_float__(VM* vm, const char* mod, const char* name, __f_float__ f) {
  7177. PyVar obj = vm->new_module_if_not_existed(mod);
  7178. vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7179. f64 ret = f();
  7180. return vm->PyFloat(ret);
  7181. });
  7182. }
  7183. typedef const char* (*__f_str__)();
  7184. __EXPORT
  7185. void pkpy_vm_bind_str__(VM* vm, const char* mod, const char* name, __f_str__ f) {
  7186. PyVar obj = vm->new_module_if_not_existed(mod);
  7187. vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7188. const char* ret = f();
  7189. return vm->PyStr(ret);
  7190. });
  7191. }
  7192. typedef bool (*__f_bool__)();
  7193. __EXPORT
  7194. void pkpy_vm_bind_bool__(VM* vm, const char* mod, const char* name, __f_bool__ f) {
  7195. PyVar obj = vm->new_module_if_not_existed(mod);
  7196. vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7197. bool ret = f();
  7198. return vm->PyBool(ret);
  7199. });
  7200. }
  7201. typedef void (*__f_None__)();
  7202. __EXPORT
  7203. void pkpy_vm_bind_None__(VM* vm, const char* mod, const char* name, __f_None__ f) {
  7204. PyVar obj = vm->new_module_if_not_existed(mod);
  7205. vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::ArgList& args) {
  7206. f();
  7207. return vm->None;
  7208. });
  7209. }
  7210. }
  7211. #endif // POCKETPY_H