pocketpy.h 230 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081
  1. /*
  2. * Copyright (c) 2022 blueloveTH
  3. * Distributed Under The LGPLv3 License
  4. */
  5. #ifndef POCKETPY_H
  6. #define POCKETPY_H
  7. #ifdef _MSC_VER
  8. #pragma warning (disable:4267)
  9. #pragma warning (disable:4101)
  10. #define _CRT_NONSTDC_NO_DEPRECATE
  11. #endif
  12. #include <sstream>
  13. #include <regex>
  14. #include <stack>
  15. #include <cmath>
  16. #include <stdexcept>
  17. #include <vector>
  18. #include <string>
  19. #include <cstring>
  20. #include <chrono>
  21. #include <string_view>
  22. #include <queue>
  23. #include <iomanip>
  24. #include <map>
  25. #include <thread>
  26. #include <atomic>
  27. #include <iostream>
  28. #ifdef POCKETPY_H
  29. #define UNREACHABLE() throw std::runtime_error( "L" + std::to_string(__LINE__) + " UNREACHABLE()! This should be a bug, please report it");
  30. #else
  31. #define UNREACHABLE() throw std::runtime_error( __FILE__ + std::string(":") + std::to_string(__LINE__) + " UNREACHABLE()!");
  32. #endif
  33. #define PK_VERSION "0.4.8"
  34. //#define PKPY_NO_TYPE_CHECK
  35. //#define PKPY_NO_INDEX_CHECK
  36. namespace pkpy{
  37. template <typename T>
  38. class shared_ptr {
  39. int* counter = nullptr;
  40. #define _t() ((T*)(counter + 1))
  41. #define _inc_counter() if(counter) ++(*counter)
  42. #define _dec_counter() if(counter && --(*counter) == 0){ _t()->~T(); free(counter); }
  43. public:
  44. shared_ptr() {}
  45. shared_ptr(int* block) : counter(block) {}
  46. shared_ptr(const shared_ptr& other) : counter(other.counter) {
  47. _inc_counter();
  48. }
  49. shared_ptr(shared_ptr&& other) : counter(other.counter) {
  50. other.counter = nullptr;
  51. }
  52. ~shared_ptr() {
  53. _dec_counter();
  54. }
  55. bool operator==(const shared_ptr& other) const {
  56. return counter == other.counter;
  57. }
  58. bool operator!=(const shared_ptr& other) const {
  59. return counter != other.counter;
  60. }
  61. bool operator==(std::nullptr_t) const {
  62. return counter == nullptr;
  63. }
  64. bool operator!=(std::nullptr_t) const {
  65. return counter != nullptr;
  66. }
  67. shared_ptr& operator=(const shared_ptr& other) {
  68. if (this != &other) {
  69. _dec_counter();
  70. counter = other.counter;
  71. _inc_counter();
  72. }
  73. return *this;
  74. }
  75. shared_ptr& operator=(shared_ptr&& other) {
  76. if (this != &other) {
  77. _dec_counter();
  78. counter = other.counter;
  79. other.counter = nullptr;
  80. }
  81. return *this;
  82. }
  83. T& operator*() const {
  84. return *_t();
  85. }
  86. T* operator->() const {
  87. return _t();
  88. }
  89. T* get() const {
  90. return _t();
  91. }
  92. int use_count() const {
  93. return counter ? *counter : 0;
  94. }
  95. void reset(){
  96. _dec_counter();
  97. counter = nullptr;
  98. }
  99. };
  100. #undef _t
  101. #undef _inc_counter
  102. #undef _dec_counter
  103. template <typename T, typename U, typename... Args>
  104. shared_ptr<T> make_shared(Args&&... args) {
  105. static_assert(std::is_base_of<T, U>::value, "U must be derived from T");
  106. int* p = (int*)malloc(sizeof(int) + sizeof(U));
  107. *p = 1;
  108. new(p+1) U(std::forward<Args>(args)...);
  109. return shared_ptr<T>(p);
  110. }
  111. template <typename T, typename... Args>
  112. shared_ptr<T> make_shared(Args&&... args) {
  113. int* p = (int*)malloc(sizeof(int) + sizeof(T));
  114. *p = 1;
  115. new(p+1) T(std::forward<Args>(args)...);
  116. return shared_ptr<T>(p);
  117. }
  118. template <typename T>
  119. class unique_ptr {
  120. T* ptr;
  121. public:
  122. unique_ptr() : ptr(nullptr) {}
  123. unique_ptr(T* ptr) : ptr(ptr) {}
  124. unique_ptr(const unique_ptr& other) = delete;
  125. unique_ptr(unique_ptr&& other) : ptr(other.ptr) {
  126. other.ptr = nullptr;
  127. }
  128. ~unique_ptr() {
  129. delete ptr;
  130. }
  131. bool operator==(const unique_ptr& other) const {
  132. return ptr == other.ptr;
  133. }
  134. bool operator!=(const unique_ptr& other) const {
  135. return ptr != other.ptr;
  136. }
  137. bool operator==(std::nullptr_t) const {
  138. return ptr == nullptr;
  139. }
  140. bool operator!=(std::nullptr_t) const {
  141. return ptr != nullptr;
  142. }
  143. unique_ptr& operator=(const unique_ptr& other) = delete;
  144. unique_ptr& operator=(unique_ptr&& other) {
  145. if (this != &other) {
  146. delete ptr;
  147. ptr = other.ptr;
  148. other.ptr = nullptr;
  149. }
  150. return *this;
  151. }
  152. T& operator*() const {
  153. return *ptr;
  154. }
  155. T* operator->() const {
  156. return ptr;
  157. }
  158. T* get() const {
  159. return ptr;
  160. }
  161. void reset(){
  162. delete ptr;
  163. ptr = nullptr;
  164. }
  165. };
  166. template <typename T, typename... Args>
  167. unique_ptr<T> make_unique(Args&&... args) {
  168. return unique_ptr<T>(new T(std::forward<Args>(args)...));
  169. }
  170. };
  171. typedef std::stringstream _StrStream;
  172. class _StrMemory : public std::string {
  173. mutable std::vector<uint16_t>* _u8_index = nullptr;
  174. mutable bool hash_initialized = false;
  175. mutable size_t _hash;
  176. void utf8_lazy_init() const{
  177. if(_u8_index != nullptr) return;
  178. _u8_index = new std::vector<uint16_t>();
  179. _u8_index->reserve(size());
  180. if(size() > 65535) throw std::runtime_error("String has more than 65535 bytes.");
  181. for(uint16_t i = 0; i < size(); i++){
  182. // https://stackoverflow.com/questions/3911536/utf-8-unicode-whats-with-0xc0-and-0x80
  183. if((at(i) & 0xC0) != 0x80)
  184. _u8_index->push_back(i);
  185. }
  186. }
  187. public:
  188. size_t hash() const{
  189. if(!hash_initialized){
  190. _hash = std::hash<std::string>()(*this);
  191. hash_initialized = true;
  192. }
  193. return _hash;
  194. }
  195. int u8_length() const {
  196. utf8_lazy_init();
  197. return _u8_index->size();
  198. }
  199. std::string u8_getitem(int i) const{
  200. return u8_substr(i, i+1);
  201. }
  202. std::string u8_substr(int start, int end) const{
  203. utf8_lazy_init();
  204. if(start >= end) return std::string();
  205. int c_end = end >= _u8_index->size() ? size() : _u8_index->at(end);
  206. return substr(_u8_index->at(start), c_end - _u8_index->at(start));
  207. }
  208. _StrMemory(const std::string& s) : std::string(s) {}
  209. _StrMemory(std::string&& s) : std::string(std::move(s)) {}
  210. ~_StrMemory(){
  211. if(_u8_index != nullptr) delete _u8_index;
  212. }
  213. };
  214. std::map<std::string, pkpy::shared_ptr<_StrMemory>, std::less<>> _strIntern;
  215. class _StrLiteral : public std::string_view {
  216. public:
  217. constexpr _StrLiteral(const char* str, size_t len) : std::string_view(str, len) {}
  218. };
  219. inline constexpr _StrLiteral operator "" _c(const char* str, size_t len){
  220. return _StrLiteral(str, len);
  221. }
  222. class _Str {
  223. private:
  224. pkpy::shared_ptr<_StrMemory> _s;
  225. bool interned = false;
  226. public:
  227. _Str(_StrLiteral s){
  228. construct(s);
  229. intern();
  230. }
  231. _Str(const char* s){
  232. construct(s);
  233. }
  234. _Str(const char* s, size_t len){
  235. construct(std::string_view(s, len));
  236. }
  237. _Str(){
  238. construct("");
  239. }
  240. _Str(const std::string& s){
  241. construct(s);
  242. }
  243. _Str(const _Str& s) : _s(s._s), interned(s.interned) {}
  244. // for move constructor, we do not check if the string is interned!!
  245. _Str(std::string&& s){
  246. this->_s = pkpy::make_shared<_StrMemory>(std::move(s));
  247. }
  248. void construct(std::string_view sv){
  249. auto it = _strIntern.find(sv);
  250. if(it != _strIntern.end()){
  251. this->_s = it->second;
  252. interned = true;
  253. }else{
  254. this->_s = pkpy::make_shared<_StrMemory>(std::string(sv));
  255. }
  256. }
  257. // force the string to be interned
  258. void intern(){
  259. if(interned) return;
  260. auto it = _strIntern.find(*this->_s);
  261. if(it == _strIntern.end()) _strIntern[*this->_s] = this->_s;
  262. else this->_s = it->second;
  263. interned = true;
  264. }
  265. inline int u8_length() const {
  266. return this->_s->u8_length();
  267. }
  268. inline _Str u8_getitem(int i) const{
  269. return _Str(this->_s->u8_getitem(i));
  270. }
  271. inline _Str u8_substr(int start, int end) const{
  272. return _Str(this->_s->u8_substr(start, end));
  273. }
  274. inline size_t hash() const{
  275. return _s->hash();
  276. }
  277. inline int size() const {
  278. return _s->size();
  279. }
  280. inline bool empty() const {
  281. return _s->empty();
  282. }
  283. bool operator==(const _Str& other) const {
  284. if(interned && other.interned) return _s == other._s;
  285. return *_s == *other._s;
  286. }
  287. bool operator!=(const _Str& other) const {
  288. if(interned && other.interned) return _s != other._s;
  289. return *_s != *other._s;
  290. }
  291. bool operator<(const _Str& other) const {
  292. return *_s < *other._s;
  293. }
  294. bool operator>(const _Str& other) const {
  295. return *_s > *other._s;
  296. }
  297. char operator[](int i) const {
  298. return _s->at(i);
  299. }
  300. friend std::ostream& operator<<(std::ostream& os, const _Str& s) {
  301. os << *s._s;
  302. return os;
  303. }
  304. _Str operator+(const _Str& other) const {
  305. return _Str(*_s + *other._s);
  306. }
  307. _Str operator+(const char* other) const {
  308. return _Str(*_s + other);
  309. }
  310. _Str operator+(const std::string& other) const {
  311. return _Str(*_s + other);
  312. }
  313. friend _Str operator+(const char* other, const _Str& s){
  314. return _Str(other + *s._s);
  315. }
  316. friend _Str operator+(const std::string& other, const _Str& s){
  317. return _Str(other + *s._s);
  318. }
  319. const std::string& str() const {
  320. return *_s;
  321. }
  322. const char* c_str() const {
  323. return _s->c_str();
  324. }
  325. static const std::size_t npos = std::string::npos;
  326. _Str __lstrip() const {
  327. std::string copy(*_s);
  328. copy.erase(copy.begin(), std::find_if(copy.begin(), copy.end(), [](char c) {
  329. return !std::isspace(c);
  330. }));
  331. return _Str(copy);
  332. }
  333. _Str __escape(bool single_quote) const {
  334. _StrStream ss;
  335. ss << (single_quote ? '\'' : '"');
  336. for (auto c = _s->cbegin(); c != _s->cend(); c++) {
  337. switch (*c) {
  338. case '"':
  339. if(!single_quote) ss << '\\';
  340. ss << '"';
  341. break;
  342. case '\'':
  343. if(single_quote) ss << '\\';
  344. ss << '\'';
  345. break;
  346. case '\\': ss << '\\' << '\\'; break;
  347. case '\n': ss << "\\n"; break;
  348. case '\r': ss << "\\r"; break;
  349. case '\t': ss << "\\t"; break;
  350. default:
  351. if ('\x00' <= *c && *c <= '\x1f') {
  352. ss << "\\u"
  353. << std::hex << std::setw(4) << std::setfill('0') << static_cast<int>(*c);
  354. } else {
  355. ss << *c;
  356. }
  357. }
  358. }
  359. ss << (single_quote ? '\'' : '"');
  360. return ss.str();
  361. }
  362. };
  363. namespace std {
  364. template<>
  365. struct hash<_Str> {
  366. std::size_t operator()(const _Str& s) const {
  367. return s.hash();
  368. }
  369. };
  370. }
  371. // const _Str& __class__ = _Str("__class__"_c);
  372. const _Str& __base__ = _Str("__base__"_c);
  373. const _Str& __new__ = _Str("__new__"_c);
  374. const _Str& __iter__ = _Str("__iter__"_c);
  375. const _Str& __str__ = _Str("__str__"_c);
  376. const _Str& __repr__ = _Str("__repr__"_c);
  377. const _Str& __module__ = _Str("__module__"_c);
  378. const _Str& __getitem__ = _Str("__getitem__"_c);
  379. const _Str& __setitem__ = _Str("__setitem__"_c);
  380. const _Str& __delitem__ = _Str("__delitem__"_c);
  381. const _Str& __contains__ = _Str("__contains__"_c);
  382. const _Str& __init__ = _Str("__init__"_c);
  383. const _Str& __json__ = _Str("__json__"_c);
  384. const _Str& __name__ = _Str("__name__"_c);
  385. const _Str& __len__ = _Str("__len__"_c);
  386. const _Str CMP_SPECIAL_METHODS[] = {
  387. "__lt__"_c, "__le__"_c, "__eq__"_c, "__ne__"_c, "__gt__"_c, "__ge__"_c
  388. }; // __ne__ should not be used
  389. const _Str BINARY_SPECIAL_METHODS[] = {
  390. "__add__"_c, "__sub__"_c, "__mul__"_c, "__truediv__"_c, "__floordiv__"_c, "__mod__"_c, "__pow__"_c
  391. };
  392. const _Str BITWISE_SPECIAL_METHODS[] = {
  393. "__lshift__"_c, "__rshift__"_c, "__and__"_c, "__or__"_c, "__xor__"_c
  394. };
  395. 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};
  396. 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};
  397. bool __isLoChar(uint32_t c) {
  398. auto index = std::lower_bound(__LoRangeA, __LoRangeA + 476, c) - __LoRangeA;
  399. if(c == __LoRangeA[index]) return true;
  400. index -= 1;
  401. if(index < 0) return false;
  402. return c >= __LoRangeA[index] && c <= __LoRangeB[index];
  403. }
  404. // emhash8::HashMap for C++11/14/17
  405. // version 1.6.3
  406. //
  407. // Licensed under the MIT License <http://opensource.org/licenses/MIT>.
  408. // SPDX-License-Identifier: MIT
  409. // Copyright (c) 2019-2022 Huang Yuanbing & bailuzhou AT 163.com
  410. //
  411. // Permission is hereby granted, free of charge, to any person obtaining a copy
  412. // of this software and associated documentation files (the "Software"), to deal
  413. // in the Software without restriction, including without limitation the rights
  414. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  415. // copies of the Software, and to permit persons to whom the Software is
  416. // furnished to do so, subject to the following conditions:
  417. //
  418. // The above copyright notice and this permission notice shall be included in all
  419. // copies or substantial portions of the Software.
  420. //
  421. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  422. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  423. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  424. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  425. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  426. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  427. // SOFTWARE
  428. #include <cstring>
  429. #include <string>
  430. #include <cstdlib>
  431. #include <type_traits>
  432. #include <cassert>
  433. #include <utility>
  434. #include <cstdint>
  435. #include <functional>
  436. #include <iterator>
  437. #include <algorithm>
  438. #ifdef EMH_KEY
  439. #undef EMH_KEY
  440. #undef EMH_VAL
  441. #undef EMH_KV
  442. #undef EMH_BUCKET
  443. #undef EMH_NEW
  444. #undef EMH_EMPTY
  445. #undef EMH_PREVET
  446. #undef EMH_LIKELY
  447. #undef EMH_UNLIKELY
  448. #endif
  449. // likely/unlikely
  450. #if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__clang__)
  451. # define EMH_LIKELY(condition) __builtin_expect(condition, 1)
  452. # define EMH_UNLIKELY(condition) __builtin_expect(condition, 0)
  453. #else
  454. # define EMH_LIKELY(condition) (condition)
  455. # define EMH_UNLIKELY(condition) (condition)
  456. #endif
  457. #define EMH_KEY(p, n) p[n].first
  458. #define EMH_VAL(p, n) p[n].second
  459. #define EMH_KV(p, n) p[n]
  460. #define EMH_INDEX(i, n) i[n]
  461. #define EMH_BUCKET(i, n) i[n].bucket
  462. #define EMH_HSLOT(i, n) i[n].slot
  463. #define EMH_SLOT(i, n) (i[n].slot & _mask)
  464. #define EMH_PREVET(i, n) i[n].slot
  465. #define EMH_KEYMASK(key, mask) ((size_type)(key) & ~mask)
  466. #define EMH_EQHASH(n, key_hash) (EMH_KEYMASK(key_hash, _mask) == (_index[n].slot & ~_mask))
  467. #define EMH_NEW(key, val, bucket, key_hash) \
  468. new(_pairs + _num_filled) value_type(key, val); \
  469. _etail = bucket; \
  470. _index[bucket] = {bucket, _num_filled++ | EMH_KEYMASK(key_hash, _mask)}
  471. #define EMH_EMPTY(i, n) (0 > (int)i[n].bucket)
  472. namespace emhash8 {
  473. #ifndef EMH_DEFAULT_LOAD_FACTOR
  474. constexpr static float EMH_DEFAULT_LOAD_FACTOR = 0.80f;
  475. constexpr static float EMH_MIN_LOAD_FACTOR = 0.25f; //< 0.5
  476. #endif
  477. #if EMH_CACHE_LINE_SIZE < 32
  478. constexpr static uint32_t EMH_CACHE_LINE_SIZE = 64;
  479. #endif
  480. template <typename KeyT, typename ValueT, typename HashT = std::hash<KeyT>, typename EqT = std::equal_to<KeyT>>
  481. class HashMap
  482. {
  483. public:
  484. using htype = HashMap<KeyT, ValueT, HashT, EqT>;
  485. using value_type = std::pair<KeyT, ValueT>;
  486. using key_type = KeyT;
  487. using mapped_type = ValueT;
  488. #ifdef EMH_SMALL_TYPE
  489. using size_type = uint16_t;
  490. #elif EMH_SIZE_TYPE == 0
  491. using size_type = uint32_t;
  492. #else
  493. using size_type = size_t;
  494. #endif
  495. using hasher = HashT;
  496. using key_equal = EqT;
  497. constexpr static size_type INACTIVE = 0-1u;
  498. //constexpr uint32_t END = 0-0x1u;
  499. constexpr static size_type EAD = 2;
  500. struct Index
  501. {
  502. size_type bucket;
  503. size_type slot;
  504. };
  505. class const_iterator;
  506. class iterator
  507. {
  508. public:
  509. using iterator_category = std::bidirectional_iterator_tag;
  510. using difference_type = std::ptrdiff_t;
  511. using value_type = typename htype::value_type;
  512. using pointer = value_type*;
  513. using const_pointer = const value_type* ;
  514. using reference = value_type&;
  515. using const_reference = const value_type&;
  516. iterator() : kv_(nullptr) {}
  517. iterator(const_iterator& cit) {
  518. kv_ = cit.kv_;
  519. }
  520. iterator(const htype* hash_map, size_type bucket) {
  521. kv_ = hash_map->_pairs + (int)bucket;
  522. }
  523. iterator& operator++()
  524. {
  525. kv_ ++;
  526. return *this;
  527. }
  528. iterator operator++(int)
  529. {
  530. auto cur = *this; kv_ ++;
  531. return cur;
  532. }
  533. iterator& operator--()
  534. {
  535. kv_ --;
  536. return *this;
  537. }
  538. iterator operator--(int)
  539. {
  540. auto cur = *this; kv_ --;
  541. return cur;
  542. }
  543. reference operator*() const { return *kv_; }
  544. pointer operator->() const { return kv_; }
  545. bool operator == (const iterator& rhs) const { return kv_ == rhs.kv_; }
  546. bool operator != (const iterator& rhs) const { return kv_ != rhs.kv_; }
  547. bool operator == (const const_iterator& rhs) const { return kv_ == rhs.kv_; }
  548. bool operator != (const const_iterator& rhs) const { return kv_ != rhs.kv_; }
  549. public:
  550. value_type* kv_;
  551. };
  552. class const_iterator
  553. {
  554. public:
  555. using iterator_category = std::bidirectional_iterator_tag;
  556. using value_type = typename htype::value_type;
  557. using difference_type = std::ptrdiff_t;
  558. using pointer = value_type*;
  559. using const_pointer = const value_type*;
  560. using reference = value_type&;
  561. using const_reference = const value_type&;
  562. const_iterator(const iterator& it) {
  563. kv_ = it.kv_;
  564. }
  565. const_iterator (const htype* hash_map, size_type bucket) {
  566. kv_ = hash_map->_pairs + (int)bucket;
  567. }
  568. const_iterator& operator++()
  569. {
  570. kv_ ++;
  571. return *this;
  572. }
  573. const_iterator operator++(int)
  574. {
  575. auto cur = *this; kv_ ++;
  576. return cur;
  577. }
  578. const_iterator& operator--()
  579. {
  580. kv_ --;
  581. return *this;
  582. }
  583. const_iterator operator--(int)
  584. {
  585. auto cur = *this; kv_ --;
  586. return cur;
  587. }
  588. const_reference operator*() const { return *kv_; }
  589. const_pointer operator->() const { return kv_; }
  590. bool operator == (const iterator& rhs) const { return kv_ == rhs.kv_; }
  591. bool operator != (const iterator& rhs) const { return kv_ != rhs.kv_; }
  592. bool operator == (const const_iterator& rhs) const { return kv_ == rhs.kv_; }
  593. bool operator != (const const_iterator& rhs) const { return kv_ != rhs.kv_; }
  594. public:
  595. const value_type* kv_;
  596. };
  597. void init(size_type bucket, float mlf = EMH_DEFAULT_LOAD_FACTOR)
  598. {
  599. _pairs = nullptr;
  600. _index = nullptr;
  601. _mask = _num_buckets = 0;
  602. _num_filled = 0;
  603. max_load_factor(mlf);
  604. rehash(bucket);
  605. }
  606. HashMap(size_type bucket = 2, float mlf = EMH_DEFAULT_LOAD_FACTOR)
  607. {
  608. init(bucket, mlf);
  609. }
  610. HashMap(const HashMap& rhs)
  611. {
  612. if (rhs.load_factor() > EMH_MIN_LOAD_FACTOR) {
  613. _pairs = alloc_bucket((size_type)(rhs._num_buckets * rhs.max_load_factor()) + 4);
  614. _index = alloc_index(rhs._num_buckets);
  615. clone(rhs);
  616. } else {
  617. init(rhs._num_filled + 2, EMH_DEFAULT_LOAD_FACTOR);
  618. for (auto it = rhs.begin(); it != rhs.end(); ++it)
  619. insert_unique(it->first, it->second);
  620. }
  621. }
  622. HashMap(HashMap&& rhs) noexcept
  623. {
  624. init(0);
  625. *this = std::move(rhs);
  626. }
  627. HashMap(std::initializer_list<value_type> ilist)
  628. {
  629. init((size_type)ilist.size());
  630. for (auto it = ilist.begin(); it != ilist.end(); ++it)
  631. do_insert(*it);
  632. }
  633. template<class InputIt>
  634. HashMap(InputIt first, InputIt last, size_type bucket_count=4)
  635. {
  636. init(std::distance(first, last) + bucket_count);
  637. for (; first != last; ++first)
  638. emplace(*first);
  639. }
  640. HashMap& operator=(const HashMap& rhs)
  641. {
  642. if (this == &rhs)
  643. return *this;
  644. if (rhs.load_factor() < EMH_MIN_LOAD_FACTOR) {
  645. clear(); free(_pairs); _pairs = nullptr;
  646. rehash(rhs._num_filled + 2);
  647. for (auto it = rhs.begin(); it != rhs.end(); ++it)
  648. insert_unique(it->first, it->second);
  649. return *this;
  650. }
  651. clearkv();
  652. if (_num_buckets != rhs._num_buckets) {
  653. free(_pairs); free(_index);
  654. _index = alloc_index(rhs._num_buckets);
  655. _pairs = alloc_bucket((size_type)(rhs._num_buckets * rhs.max_load_factor()) + 4);
  656. }
  657. clone(rhs);
  658. return *this;
  659. }
  660. HashMap& operator=(HashMap&& rhs) noexcept
  661. {
  662. if (this != &rhs) {
  663. swap(rhs);
  664. rhs.clear();
  665. }
  666. return *this;
  667. }
  668. template<typename Con>
  669. bool operator == (const Con& rhs) const
  670. {
  671. if (size() != rhs.size())
  672. return false;
  673. for (auto it = begin(), last = end(); it != last; ++it) {
  674. auto oi = rhs.find(it->first);
  675. if (oi == rhs.end() || it->second != oi->second)
  676. return false;
  677. }
  678. return true;
  679. }
  680. template<typename Con>
  681. bool operator != (const Con& rhs) const { return !(*this == rhs); }
  682. ~HashMap() noexcept
  683. {
  684. clearkv();
  685. free(_pairs);
  686. free(_index);
  687. }
  688. void clone(const HashMap& rhs)
  689. {
  690. _hasher = rhs._hasher;
  691. // _eq = rhs._eq;
  692. _num_buckets = rhs._num_buckets;
  693. _num_filled = rhs._num_filled;
  694. _mlf = rhs._mlf;
  695. _last = rhs._last;
  696. _mask = rhs._mask;
  697. #if EMH_HIGH_LOAD
  698. _ehead = rhs._ehead;
  699. #endif
  700. _etail = rhs._etail;
  701. auto opairs = rhs._pairs;
  702. memcpy((char*)_index, (char*)rhs._index, (_num_buckets + EAD) * sizeof(Index));
  703. if (is_copy_trivially()) {
  704. if (opairs)
  705. memcpy((char*)_pairs, (char*)opairs, _num_filled * sizeof(value_type));
  706. } else {
  707. for (size_type slot = 0; slot < _num_filled; slot++)
  708. new(_pairs + slot) value_type(opairs[slot]);
  709. }
  710. }
  711. void swap(HashMap& rhs)
  712. {
  713. // std::swap(_eq, rhs._eq);
  714. std::swap(_hasher, rhs._hasher);
  715. std::swap(_pairs, rhs._pairs);
  716. std::swap(_index, rhs._index);
  717. std::swap(_num_buckets, rhs._num_buckets);
  718. std::swap(_num_filled, rhs._num_filled);
  719. std::swap(_mask, rhs._mask);
  720. std::swap(_mlf, rhs._mlf);
  721. std::swap(_last, rhs._last);
  722. #if EMH_HIGH_LOAD
  723. std::swap(_ehead, rhs._ehead);
  724. #endif
  725. std::swap(_etail, rhs._etail);
  726. }
  727. // -------------------------------------------------------------
  728. inline iterator first() const { return {this, 0}; }
  729. inline iterator last() const { return {this, _num_filled - 1}; }
  730. inline iterator begin() { return first(); }
  731. inline const_iterator cbegin() const { return first(); }
  732. inline const_iterator begin() const { return first(); }
  733. inline iterator end() { return {this, _num_filled}; }
  734. inline const_iterator cend() const { return {this, _num_filled}; }
  735. inline const_iterator end() const { return cend(); }
  736. inline const value_type* values() const { return _pairs; }
  737. inline const Index* index() const { return _index; }
  738. inline size_type size() const { return _num_filled; }
  739. inline bool empty() const { return _num_filled == 0; }
  740. inline size_type bucket_count() const { return _num_buckets; }
  741. /// Returns average number of elements per bucket.
  742. inline float load_factor() const { return static_cast<float>(_num_filled) / (_mask + 1); }
  743. inline HashT& hash_function() const { return _hasher; }
  744. inline EqT& key_eq() const { return _eq; }
  745. void max_load_factor(float mlf)
  746. {
  747. if (mlf < 0.991 && mlf > EMH_MIN_LOAD_FACTOR) {
  748. _mlf = (uint32_t)((1 << 27) / mlf);
  749. if (_num_buckets > 0) rehash(_num_buckets);
  750. }
  751. }
  752. inline constexpr float max_load_factor() const { return (1 << 27) / (float)_mlf; }
  753. inline constexpr size_type max_size() const { return (1ull << (sizeof(size_type) * 8 - 1)); }
  754. inline constexpr size_type max_bucket_count() const { return max_size(); }
  755. #if EMH_STATIS
  756. //Returns the bucket number where the element with key k is located.
  757. size_type bucket(const KeyT& key) const
  758. {
  759. const auto bucket = hash_bucket(key);
  760. const auto next_bucket = EMH_BUCKET(_index, bucket);
  761. if ((int)next_bucket < 0)
  762. return 0;
  763. else if (bucket == next_bucket)
  764. return bucket + 1;
  765. return hash_main(bucket) + 1;
  766. }
  767. //Returns the number of elements in bucket n.
  768. size_type bucket_size(const size_type bucket) const
  769. {
  770. auto next_bucket = EMH_BUCKET(_index, bucket);
  771. if ((int)next_bucket < 0)
  772. return 0;
  773. next_bucket = hash_main(bucket);
  774. size_type ibucket_size = 1;
  775. //iterator each item in current main bucket
  776. while (true) {
  777. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  778. if (nbucket == next_bucket) {
  779. break;
  780. }
  781. ibucket_size ++;
  782. next_bucket = nbucket;
  783. }
  784. return ibucket_size;
  785. }
  786. size_type get_main_bucket(const size_type bucket) const
  787. {
  788. auto next_bucket = EMH_BUCKET(_index, bucket);
  789. if ((int)next_bucket < 0)
  790. return INACTIVE;
  791. return hash_main(bucket);
  792. }
  793. size_type get_diss(size_type bucket, size_type next_bucket, const size_type slots) const
  794. {
  795. auto pbucket = reinterpret_cast<uint64_t>(&_pairs[bucket]);
  796. auto pnext = reinterpret_cast<uint64_t>(&_pairs[next_bucket]);
  797. if (pbucket / EMH_CACHE_LINE_SIZE == pnext / EMH_CACHE_LINE_SIZE)
  798. return 0;
  799. size_type diff = pbucket > pnext ? (pbucket - pnext) : (pnext - pbucket);
  800. if (diff / EMH_CACHE_LINE_SIZE < slots - 1)
  801. return diff / EMH_CACHE_LINE_SIZE + 1;
  802. return slots - 1;
  803. }
  804. int get_bucket_info(const size_type bucket, size_type steps[], const size_type slots) const
  805. {
  806. auto next_bucket = EMH_BUCKET(_index, bucket);
  807. if ((int)next_bucket < 0)
  808. return -1;
  809. const auto main_bucket = hash_main(bucket);
  810. if (next_bucket == main_bucket)
  811. return 1;
  812. else if (main_bucket != bucket)
  813. return 0;
  814. steps[get_diss(bucket, next_bucket, slots)] ++;
  815. size_type ibucket_size = 2;
  816. //find a empty and linked it to tail
  817. while (true) {
  818. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  819. if (nbucket == next_bucket)
  820. break;
  821. steps[get_diss(nbucket, next_bucket, slots)] ++;
  822. ibucket_size ++;
  823. next_bucket = nbucket;
  824. }
  825. return (int)ibucket_size;
  826. }
  827. void dump_statics() const
  828. {
  829. const size_type slots = 128;
  830. size_type buckets[slots + 1] = {0};
  831. size_type steps[slots + 1] = {0};
  832. for (size_type bucket = 0; bucket < _num_buckets; ++bucket) {
  833. auto bsize = get_bucket_info(bucket, steps, slots);
  834. if (bsize > 0)
  835. buckets[bsize] ++;
  836. }
  837. size_type sumb = 0, collision = 0, sumc = 0, finds = 0, sumn = 0;
  838. puts("============== buckets size ration =========");
  839. for (size_type i = 0; i < sizeof(buckets) / sizeof(buckets[0]); i++) {
  840. const auto bucketsi = buckets[i];
  841. if (bucketsi == 0)
  842. continue;
  843. sumb += bucketsi;
  844. sumn += bucketsi * i;
  845. collision += bucketsi * (i - 1);
  846. finds += bucketsi * i * (i + 1) / 2;
  847. printf(" %2u %8u %2.2lf| %.2lf\n", i, bucketsi, bucketsi * 100.0 * i / _num_filled, sumn * 100.0 / _num_filled);
  848. }
  849. puts("========== collision miss ration ===========");
  850. for (size_type i = 0; i < sizeof(steps) / sizeof(steps[0]); i++) {
  851. sumc += steps[i];
  852. if (steps[i] <= 2)
  853. continue;
  854. printf(" %2u %8u %.2lf %.2lf\n", i, steps[i], steps[i] * 100.0 / collision, sumc * 100.0 / collision);
  855. }
  856. if (sumb == 0) return;
  857. printf(" _num_filled/bucket_size/packed collision/cache_miss/hit_find = %u/%.2lf/%zd/ %.2lf%%/%.2lf%%/%.2lf\n",
  858. _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);
  859. assert(sumn == _num_filled);
  860. assert(sumc == collision);
  861. puts("============== buckets size end =============");
  862. }
  863. #endif
  864. // ------------------------------------------------------------
  865. template<typename K=KeyT>
  866. inline iterator find(const K& key) noexcept
  867. {
  868. return {this, find_filled_slot(key)};
  869. }
  870. template<typename K=KeyT>
  871. inline const_iterator find(const K& key) const noexcept
  872. {
  873. return {this, find_filled_slot(key)};
  874. }
  875. template<typename K=KeyT>
  876. ValueT& at(const K& key)
  877. {
  878. const auto slot = find_filled_slot(key);
  879. //throw
  880. return EMH_VAL(_pairs, slot);
  881. }
  882. template<typename K=KeyT>
  883. const ValueT& at(const K& key) const
  884. {
  885. const auto slot = find_filled_slot(key);
  886. //throw
  887. return EMH_VAL(_pairs, slot);
  888. }
  889. template<typename K=KeyT>
  890. inline bool contains(const K& key) const noexcept
  891. {
  892. return find_filled_slot(key) != _num_filled;
  893. }
  894. template<typename K=KeyT>
  895. inline size_type count(const K& key) const noexcept
  896. {
  897. return find_filled_slot(key) == _num_filled ? 0 : 1;
  898. //return find_sorted_bucket(key) == END ? 0 : 1;
  899. //return find_hash_bucket(key) == END ? 0 : 1;
  900. }
  901. template<typename K=KeyT>
  902. std::pair<iterator, iterator> equal_range(const K& key)
  903. {
  904. const auto found = find(key);
  905. if (found.second == _num_filled)
  906. return { found, found };
  907. else
  908. return { found, std::next(found) };
  909. }
  910. void merge(HashMap& rhs)
  911. {
  912. if (empty()) {
  913. *this = std::move(rhs);
  914. return;
  915. }
  916. for (auto rit = rhs.begin(); rit != rhs.end(); ) {
  917. auto fit = find(rit->first);
  918. if (fit == end()) {
  919. insert_unique(rit->first, std::move(rit->second));
  920. rit = rhs.erase(rit);
  921. } else {
  922. ++rit;
  923. }
  924. }
  925. }
  926. /// Returns the matching ValueT or nullptr if k isn't found.
  927. bool try_get(const KeyT& key, ValueT& val) const noexcept
  928. {
  929. const auto slot = find_filled_slot(key);
  930. const auto found = slot != _num_filled;
  931. if (found) {
  932. val = EMH_VAL(_pairs, slot);
  933. }
  934. return found;
  935. }
  936. /// Returns the matching ValueT or nullptr if k isn't found.
  937. ValueT* try_get(const KeyT& key) noexcept
  938. {
  939. const auto slot = find_filled_slot(key);
  940. return slot != _num_filled ? &EMH_VAL(_pairs, slot) : nullptr;
  941. }
  942. /// Const version of the above
  943. ValueT* try_get(const KeyT& key) const noexcept
  944. {
  945. const auto slot = find_filled_slot(key);
  946. return slot != _num_filled ? &EMH_VAL(_pairs, slot) : nullptr;
  947. }
  948. /// set value if key exist
  949. bool try_set(const KeyT& key, const ValueT& val) noexcept
  950. {
  951. const auto slot = find_filled_slot(key);
  952. if (slot == _num_filled)
  953. return false;
  954. EMH_VAL(_pairs, slot) = val;
  955. return true;
  956. }
  957. /// set value if key exist
  958. bool try_set(const KeyT& key, ValueT&& val) noexcept
  959. {
  960. const auto slot = find_filled_slot(key);
  961. if (slot == _num_filled)
  962. return false;
  963. EMH_VAL(_pairs, slot) = std::move(val);
  964. return true;
  965. }
  966. /// Convenience function.
  967. ValueT get_or_return_default(const KeyT& key) const noexcept
  968. {
  969. const auto slot = find_filled_slot(key);
  970. return slot == _num_filled ? ValueT() : EMH_VAL(_pairs, slot);
  971. }
  972. // -----------------------------------------------------
  973. std::pair<iterator, bool> do_insert(const value_type& value) noexcept
  974. {
  975. const auto key_hash = hash_key(value.first);
  976. const auto bucket = find_or_allocate(value.first, key_hash);
  977. const auto bempty = EMH_EMPTY(_index, bucket);
  978. if (bempty) {
  979. EMH_NEW(value.first, value.second, bucket, key_hash);
  980. }
  981. const auto slot = EMH_SLOT(_index, bucket);
  982. return { {this, slot}, bempty };
  983. }
  984. std::pair<iterator, bool> do_insert(value_type&& value) noexcept
  985. {
  986. const auto key_hash = hash_key(value.first);
  987. const auto bucket = find_or_allocate(value.first, key_hash);
  988. const auto bempty = EMH_EMPTY(_index, bucket);
  989. if (bempty) {
  990. EMH_NEW(std::move(value.first), std::move(value.second), bucket, key_hash);
  991. }
  992. const auto slot = EMH_SLOT(_index, bucket);
  993. return { {this, slot}, bempty };
  994. }
  995. template<typename K, typename V>
  996. std::pair<iterator, bool> do_insert(K&& key, V&& val) noexcept
  997. {
  998. const auto key_hash = hash_key(key);
  999. const auto bucket = find_or_allocate(key, key_hash);
  1000. const auto bempty = EMH_EMPTY(_index, bucket);
  1001. if (bempty) {
  1002. EMH_NEW(std::forward<K>(key), std::forward<V>(val), bucket, key_hash);
  1003. }
  1004. const auto slot = EMH_SLOT(_index, bucket);
  1005. return { {this, slot}, bempty };
  1006. }
  1007. template<typename K, typename V>
  1008. std::pair<iterator, bool> do_assign(K&& key, V&& val) noexcept
  1009. {
  1010. check_expand_need();
  1011. const auto key_hash = hash_key(key);
  1012. const auto bucket = find_or_allocate(key, key_hash);
  1013. const auto bempty = EMH_EMPTY(_index, bucket);
  1014. if (bempty) {
  1015. EMH_NEW(std::forward<K>(key), std::forward<V>(val), bucket, key_hash);
  1016. } else {
  1017. EMH_VAL(_pairs, EMH_SLOT(_index, bucket)) = std::move(val);
  1018. }
  1019. const auto slot = EMH_SLOT(_index, bucket);
  1020. return { {this, slot}, bempty };
  1021. }
  1022. std::pair<iterator, bool> insert(const value_type& p)
  1023. {
  1024. check_expand_need();
  1025. return do_insert(p);
  1026. }
  1027. std::pair<iterator, bool> insert(value_type && p)
  1028. {
  1029. check_expand_need();
  1030. return do_insert(std::move(p));
  1031. }
  1032. void insert(std::initializer_list<value_type> ilist)
  1033. {
  1034. reserve(ilist.size() + _num_filled, false);
  1035. for (auto it = ilist.begin(); it != ilist.end(); ++it)
  1036. do_insert(*it);
  1037. }
  1038. template <typename Iter>
  1039. void insert(Iter first, Iter last)
  1040. {
  1041. reserve(std::distance(first, last) + _num_filled, false);
  1042. for (; first != last; ++first)
  1043. do_insert(first->first, first->second);
  1044. }
  1045. #if 0
  1046. template <typename Iter>
  1047. void insert_unique(Iter begin, Iter end)
  1048. {
  1049. reserve(std::distance(begin, end) + _num_filled, false);
  1050. for (; begin != end; ++begin) {
  1051. insert_unique(*begin);
  1052. }
  1053. }
  1054. #endif
  1055. template<typename K, typename V>
  1056. size_type insert_unique(K&& key, V&& val)
  1057. {
  1058. check_expand_need();
  1059. const auto key_hash = hash_key(key);
  1060. auto bucket = find_unique_bucket(key_hash);
  1061. EMH_NEW(std::forward<K>(key), std::forward<V>(val), bucket, key_hash);
  1062. return bucket;
  1063. }
  1064. size_type insert_unique(value_type&& value)
  1065. {
  1066. return insert_unique(std::move(value.first), std::move(value.second));
  1067. }
  1068. inline size_type insert_unique(const value_type& value)
  1069. {
  1070. return insert_unique(value.first, value.second);
  1071. }
  1072. template <class... Args>
  1073. inline std::pair<iterator, bool> emplace(Args&&... args) noexcept
  1074. {
  1075. check_expand_need();
  1076. return do_insert(std::forward<Args>(args)...);
  1077. }
  1078. //no any optimize for position
  1079. template <class... Args>
  1080. iterator emplace_hint(const_iterator hint, Args&&... args)
  1081. {
  1082. (void)hint;
  1083. check_expand_need();
  1084. return do_insert(std::forward<Args>(args)...).first;
  1085. }
  1086. template<class... Args>
  1087. std::pair<iterator, bool> try_emplace(const KeyT& k, Args&&... args)
  1088. {
  1089. check_expand_need();
  1090. return do_insert(k, std::forward<Args>(args)...);
  1091. }
  1092. template<class... Args>
  1093. std::pair<iterator, bool> try_emplace(KeyT&& k, Args&&... args)
  1094. {
  1095. check_expand_need();
  1096. return do_insert(std::move(k), std::forward<Args>(args)...);
  1097. }
  1098. template <class... Args>
  1099. inline size_type emplace_unique(Args&&... args)
  1100. {
  1101. return insert_unique(std::forward<Args>(args)...);
  1102. }
  1103. std::pair<iterator, bool> insert_or_assign(const KeyT& key, ValueT&& val) { return do_assign(key, std::forward<ValueT>(val)); }
  1104. std::pair<iterator, bool> insert_or_assign(KeyT&& key, ValueT&& val) { return do_assign(std::move(key), std::forward<ValueT>(val)); }
  1105. /// Return the old value or ValueT() if it didn't exist.
  1106. ValueT set_get(const KeyT& key, const ValueT& val)
  1107. {
  1108. check_expand_need();
  1109. const auto key_hash = hash_key(key);
  1110. const auto bucket = find_or_allocate(key, key_hash);
  1111. if (EMH_EMPTY(_index, bucket)) {
  1112. EMH_NEW(key, val, bucket, key_hash);
  1113. return ValueT();
  1114. } else {
  1115. const auto slot = EMH_SLOT(_index, bucket);
  1116. ValueT old_value(val);
  1117. std::swap(EMH_VAL(_pairs, slot), old_value);
  1118. return old_value;
  1119. }
  1120. }
  1121. /// Like std::map<KeyT, ValueT>::operator[].
  1122. ValueT& operator[](const KeyT& key) noexcept
  1123. {
  1124. check_expand_need();
  1125. const auto key_hash = hash_key(key);
  1126. const auto bucket = find_or_allocate(key, key_hash);
  1127. if (EMH_EMPTY(_index, bucket)) {
  1128. /* Check if inserting a value rather than overwriting an old entry */
  1129. EMH_NEW(key, std::move(ValueT()), bucket, key_hash);
  1130. }
  1131. const auto slot = EMH_SLOT(_index, bucket);
  1132. return EMH_VAL(_pairs, slot);
  1133. }
  1134. ValueT& operator[](KeyT&& key) noexcept
  1135. {
  1136. check_expand_need();
  1137. const auto key_hash = hash_key(key);
  1138. const auto bucket = find_or_allocate(key, key_hash);
  1139. if (EMH_EMPTY(_index, bucket)) {
  1140. EMH_NEW(std::move(key), std::move(ValueT()), bucket, key_hash);
  1141. }
  1142. const auto slot = EMH_SLOT(_index, bucket);
  1143. return EMH_VAL(_pairs, slot);
  1144. }
  1145. /// Erase an element from the hash table.
  1146. /// return 0 if element was not found
  1147. size_type erase(const KeyT& key) noexcept
  1148. {
  1149. const auto key_hash = hash_key(key);
  1150. const auto sbucket = find_filled_bucket(key, key_hash);
  1151. if (sbucket == INACTIVE)
  1152. return 0;
  1153. const auto main_bucket = key_hash & _mask;
  1154. erase_slot(sbucket, (size_type)main_bucket);
  1155. return 1;
  1156. }
  1157. //iterator erase(const_iterator begin_it, const_iterator end_it)
  1158. iterator erase(const const_iterator& cit) noexcept
  1159. {
  1160. const auto slot = (size_type)(cit.kv_ - _pairs);
  1161. size_type main_bucket;
  1162. const auto sbucket = find_slot_bucket(slot, main_bucket); //TODO
  1163. erase_slot(sbucket, main_bucket);
  1164. return {this, slot};
  1165. }
  1166. //only last >= first
  1167. iterator erase(const_iterator first, const_iterator last) noexcept
  1168. {
  1169. auto esize = long(last.kv_ - first.kv_);
  1170. auto tsize = long((_pairs + _num_filled) - last.kv_); //last to tail size
  1171. auto next = first;
  1172. while (tsize -- > 0) {
  1173. if (esize-- <= 0)
  1174. break;
  1175. next = ++erase(next);
  1176. }
  1177. //fast erase from last
  1178. next = this->last();
  1179. while (esize -- > 0)
  1180. next = --erase(next);
  1181. return {this, size_type(next.kv_ - _pairs)};
  1182. }
  1183. template<typename Pred>
  1184. size_type erase_if(Pred pred)
  1185. {
  1186. auto old_size = size();
  1187. for (auto it = begin(); it != end();) {
  1188. if (pred(*it))
  1189. it = erase(it);
  1190. else
  1191. ++it;
  1192. }
  1193. return old_size - size();
  1194. }
  1195. static constexpr bool is_triviall_destructable()
  1196. {
  1197. #if __cplusplus >= 201402L || _MSC_VER > 1600
  1198. return !(std::is_trivially_destructible<KeyT>::value && std::is_trivially_destructible<ValueT>::value);
  1199. #else
  1200. return !(std::is_pod<KeyT>::value && std::is_pod<ValueT>::value);
  1201. #endif
  1202. }
  1203. static constexpr bool is_copy_trivially()
  1204. {
  1205. #if __cplusplus >= 201103L || _MSC_VER > 1600
  1206. return (std::is_trivially_copyable<KeyT>::value && std::is_trivially_copyable<ValueT>::value);
  1207. #else
  1208. return (std::is_pod<KeyT>::value && std::is_pod<ValueT>::value);
  1209. #endif
  1210. }
  1211. void clearkv()
  1212. {
  1213. if (is_triviall_destructable()) {
  1214. while (_num_filled --)
  1215. _pairs[_num_filled].~value_type();
  1216. }
  1217. }
  1218. /// Remove all elements, keeping full capacity.
  1219. void clear() noexcept
  1220. {
  1221. clearkv();
  1222. if (_num_filled > 0)
  1223. memset((char*)_index, INACTIVE, sizeof(_index[0]) * _num_buckets);
  1224. _last = _num_filled = 0;
  1225. _etail = INACTIVE;
  1226. #if EMH_HIGH_LOAD
  1227. _ehead = 0;
  1228. #endif
  1229. }
  1230. void shrink_to_fit(const float min_factor = EMH_DEFAULT_LOAD_FACTOR / 4)
  1231. {
  1232. if (load_factor() < min_factor && bucket_count() > 10) //safe guard
  1233. rehash(_num_filled + 1);
  1234. }
  1235. #if EMH_HIGH_LOAD
  1236. void set_empty()
  1237. {
  1238. auto prev = 0;
  1239. for (int32_t bucket = 1; bucket < _num_buckets; ++bucket) {
  1240. if (EMH_EMPTY(_index, bucket)) {
  1241. if (prev != 0) {
  1242. EMH_PREVET(_index, bucket) = prev;
  1243. EMH_BUCKET(_index, prev) = -bucket;
  1244. }
  1245. else
  1246. _ehead = bucket;
  1247. prev = bucket;
  1248. }
  1249. }
  1250. EMH_PREVET(_index, _ehead) = prev;
  1251. EMH_BUCKET(_index, prev) = 0-_ehead;
  1252. _ehead = 0-EMH_BUCKET(_index, _ehead);
  1253. }
  1254. void clear_empty()
  1255. {
  1256. auto prev = EMH_PREVET(_index, _ehead);
  1257. while (prev != _ehead) {
  1258. EMH_BUCKET(_index, prev) = INACTIVE;
  1259. prev = EMH_PREVET(_index, prev);
  1260. }
  1261. EMH_BUCKET(_index, _ehead) = INACTIVE;
  1262. _ehead = 0;
  1263. }
  1264. //prev-ehead->next
  1265. size_type pop_empty(const size_type bucket)
  1266. {
  1267. const auto prev_bucket = EMH_PREVET(_index, bucket);
  1268. const int next_bucket = 0-EMH_BUCKET(_index, bucket);
  1269. EMH_PREVET(_index, next_bucket) = prev_bucket;
  1270. EMH_BUCKET(_index, prev_bucket) = -next_bucket;
  1271. _ehead = next_bucket;
  1272. return bucket;
  1273. }
  1274. //ehead->bucket->next
  1275. void push_empty(const int32_t bucket)
  1276. {
  1277. const int next_bucket = 0-EMH_BUCKET(_index, _ehead);
  1278. assert(next_bucket > 0);
  1279. EMH_PREVET(_index, bucket) = _ehead;
  1280. EMH_BUCKET(_index, bucket) = -next_bucket;
  1281. EMH_PREVET(_index, next_bucket) = bucket;
  1282. EMH_BUCKET(_index, _ehead) = -bucket;
  1283. // _ehead = bucket;
  1284. }
  1285. #endif
  1286. /// Make room for this many elements
  1287. bool reserve(uint64_t num_elems, bool force)
  1288. {
  1289. (void)force;
  1290. #if EMH_HIGH_LOAD == 0
  1291. const auto required_buckets = num_elems * _mlf >> 27;
  1292. if (EMH_LIKELY(required_buckets < _mask)) // && !force
  1293. return false;
  1294. #elif EMH_HIGH_LOAD
  1295. const auto required_buckets = num_elems + num_elems * 1 / 9;
  1296. if (EMH_LIKELY(required_buckets < _mask))
  1297. return false;
  1298. else if (_num_buckets < 16 && _num_filled < _num_buckets)
  1299. return false;
  1300. else if (_num_buckets > EMH_HIGH_LOAD) {
  1301. if (_ehead == 0) {
  1302. set_empty();
  1303. return false;
  1304. } else if (/*_num_filled + 100 < _num_buckets && */EMH_BUCKET(_index, _ehead) != 0-_ehead) {
  1305. return false;
  1306. }
  1307. }
  1308. #endif
  1309. #if EMH_STATIS
  1310. if (_num_filled > EMH_STATIS) dump_statics();
  1311. #endif
  1312. //assert(required_buckets < max_size());
  1313. rehash(required_buckets + 2);
  1314. return true;
  1315. }
  1316. static value_type* alloc_bucket(size_type num_buckets)
  1317. {
  1318. auto new_pairs = (char*)malloc((uint64_t)num_buckets * sizeof(value_type));
  1319. return (value_type *)(new_pairs);
  1320. }
  1321. static Index* alloc_index(size_type num_buckets)
  1322. {
  1323. auto new_index = (char*)malloc((uint64_t)(EAD + num_buckets) * sizeof(Index));
  1324. return (Index *)(new_index);
  1325. }
  1326. bool reserve(size_type required_buckets) noexcept
  1327. {
  1328. if (_num_filled != required_buckets)
  1329. return reserve(required_buckets, true);
  1330. _last = 0;
  1331. #if EMH_HIGH_LOAD
  1332. _ehead = 0;
  1333. #endif
  1334. #if EMH_SORT
  1335. std::sort(_pairs, _pairs + _num_filled, [this](const value_type & l, const value_type & r) {
  1336. const auto hashl = (size_type)hash_key(l.first) & _mask, hashr = (size_type)hash_key(r.first) & _mask;
  1337. return hashl < hashr;
  1338. //return l.first < r.first;
  1339. });
  1340. #endif
  1341. memset((char*)_index, INACTIVE, sizeof(_index[0]) * _num_buckets);
  1342. for (size_type slot = 0; slot < _num_filled; slot++) {
  1343. const auto& key = EMH_KEY(_pairs, slot);
  1344. const auto key_hash = hash_key(key);
  1345. const auto bucket = size_type(key_hash & _mask);
  1346. auto& next_bucket = EMH_BUCKET(_index, bucket);
  1347. if ((int)next_bucket < 0)
  1348. EMH_INDEX(_index, bucket) = {1, slot | EMH_KEYMASK(key_hash, _mask)};
  1349. else {
  1350. EMH_HSLOT(_index, bucket) |= EMH_KEYMASK(key_hash, _mask);
  1351. next_bucket ++;
  1352. }
  1353. }
  1354. return true;
  1355. }
  1356. void rebuild(size_type num_buckets) noexcept
  1357. {
  1358. free(_index);
  1359. auto new_pairs = (value_type*)alloc_bucket((size_type)(num_buckets * max_load_factor()) + 4);
  1360. if (is_copy_trivially()) {
  1361. memcpy((char*)new_pairs, (char*)_pairs, _num_filled * sizeof(value_type));
  1362. } else {
  1363. for (size_type slot = 0; slot < _num_filled; slot++) {
  1364. new(new_pairs + slot) value_type(std::move(_pairs[slot]));
  1365. if (is_triviall_destructable())
  1366. _pairs[slot].~value_type();
  1367. }
  1368. }
  1369. free(_pairs);
  1370. _pairs = new_pairs;
  1371. _index = (Index*)alloc_index (num_buckets);
  1372. memset((char*)_index, INACTIVE, sizeof(_index[0]) * num_buckets);
  1373. memset((char*)(_index + num_buckets), 0, sizeof(_index[0]) * EAD);
  1374. }
  1375. void rehash(uint64_t required_buckets)
  1376. {
  1377. if (required_buckets < _num_filled)
  1378. return;
  1379. assert(required_buckets < max_size());
  1380. auto num_buckets = _num_filled > (1u << 16) ? (1u << 16) : 4u;
  1381. while (num_buckets < required_buckets) { num_buckets *= 2; }
  1382. #if EMH_REHASH_LOG
  1383. auto last = _last;
  1384. size_type collision = 0;
  1385. #endif
  1386. #if EMH_HIGH_LOAD
  1387. _ehead = 0;
  1388. #endif
  1389. _last = _mask / 4;
  1390. _mask = num_buckets - 1;
  1391. #if EMH_PACK_TAIL > 1
  1392. _last = _mask;
  1393. num_buckets += num_buckets * EMH_PACK_TAIL / 100; //add more 5-10%
  1394. #endif
  1395. _num_buckets = num_buckets;
  1396. rebuild(num_buckets);
  1397. #ifdef EMH_SORT
  1398. std::sort(_pairs, _pairs + _num_filled, [this](const value_type & l, const value_type & r) {
  1399. const auto hashl = hash_key(l.first), hashr = hash_key(r.first);
  1400. auto diff = int64_t((hashl & _mask) - (hashr & _mask));
  1401. if (diff != 0)
  1402. return diff < 0;
  1403. return hashl < hashr;
  1404. // return l.first < r.first;
  1405. });
  1406. #endif
  1407. _etail = INACTIVE;
  1408. for (size_type slot = 0; slot < _num_filled; ++slot) {
  1409. const auto& key = EMH_KEY(_pairs, slot);
  1410. const auto key_hash = hash_key(key);
  1411. const auto bucket = find_unique_bucket(key_hash);
  1412. EMH_INDEX(_index, bucket) = {bucket, slot | EMH_KEYMASK(key_hash, _mask)};
  1413. #if EMH_REHASH_LOG
  1414. if (bucket != hash_main(bucket))
  1415. collision ++;
  1416. #endif
  1417. }
  1418. #if EMH_REHASH_LOG
  1419. if (_num_filled > EMH_REHASH_LOG) {
  1420. auto mbucket = _num_filled - collision;
  1421. char buff[255] = {0};
  1422. sprintf(buff, " _num_filled/aver_size/K.V/pack/collision|last = %u/%.2lf/%s.%s/%zd|%.2lf%%,%.2lf%%",
  1423. _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);
  1424. #ifdef EMH_LOG
  1425. static uint32_t ihashs = 0; EMH_LOG() << "hash_nums = " << ihashs ++ << "|" <<__FUNCTION__ << "|" << buff << endl;
  1426. #else
  1427. puts(buff);
  1428. #endif
  1429. }
  1430. #endif
  1431. }
  1432. private:
  1433. // Can we fit another element?
  1434. inline bool check_expand_need()
  1435. {
  1436. return reserve(_num_filled, false);
  1437. }
  1438. size_type slot_to_bucket(const size_type slot) const noexcept
  1439. {
  1440. size_type main_bucket;
  1441. return find_slot_bucket(slot, main_bucket); //TODO
  1442. }
  1443. //very slow
  1444. void erase_slot(const size_type sbucket, const size_type main_bucket) noexcept
  1445. {
  1446. const auto slot = EMH_SLOT(_index, sbucket);
  1447. const auto ebucket = erase_bucket(sbucket, main_bucket);
  1448. const auto last_slot = --_num_filled;
  1449. if (EMH_LIKELY(slot != last_slot)) {
  1450. const auto last_bucket = (_etail == INACTIVE || ebucket == _etail)
  1451. ? slot_to_bucket(last_slot) : _etail;
  1452. EMH_KV(_pairs, slot) = std::move(EMH_KV(_pairs, last_slot));
  1453. EMH_HSLOT(_index, last_bucket) = slot | (EMH_HSLOT(_index, last_bucket) & ~_mask);
  1454. }
  1455. if (is_triviall_destructable())
  1456. _pairs[last_slot].~value_type();
  1457. _etail = INACTIVE;
  1458. EMH_INDEX(_index, ebucket) = {INACTIVE, 0};
  1459. #if EMH_HIGH_LOAD
  1460. if (_ehead) {
  1461. if (10 * _num_filled < 8 * _num_buckets)
  1462. clear_empty();
  1463. else if (ebucket)
  1464. push_empty(ebucket);
  1465. }
  1466. #endif
  1467. }
  1468. size_type erase_bucket(const size_type bucket, const size_type main_bucket) noexcept
  1469. {
  1470. const auto next_bucket = EMH_BUCKET(_index, bucket);
  1471. if (bucket == main_bucket) {
  1472. if (main_bucket != next_bucket) {
  1473. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1474. EMH_INDEX(_index, main_bucket) = {
  1475. (nbucket == next_bucket) ? main_bucket : nbucket,
  1476. EMH_HSLOT(_index, next_bucket)
  1477. };
  1478. }
  1479. return next_bucket;
  1480. }
  1481. const auto prev_bucket = find_prev_bucket(main_bucket, bucket);
  1482. EMH_BUCKET(_index, prev_bucket) = (bucket == next_bucket) ? prev_bucket : next_bucket;
  1483. return bucket;
  1484. }
  1485. // Find the slot with this key, or return bucket size
  1486. size_type find_slot_bucket(const size_type slot, size_type& main_bucket) const
  1487. {
  1488. const auto key_hash = hash_key(EMH_KEY(_pairs, slot));
  1489. const auto bucket = main_bucket = size_type(key_hash & _mask);
  1490. if (slot == EMH_SLOT(_index, bucket))
  1491. return bucket;
  1492. auto next_bucket = EMH_BUCKET(_index, bucket);
  1493. while (true) {
  1494. if (EMH_LIKELY(slot == EMH_SLOT(_index, next_bucket)))
  1495. return next_bucket;
  1496. next_bucket = EMH_BUCKET(_index, next_bucket);
  1497. }
  1498. return INACTIVE;
  1499. }
  1500. // Find the slot with this key, or return bucket size
  1501. size_type find_filled_bucket(const KeyT& key, uint64_t key_hash) const noexcept
  1502. {
  1503. const auto bucket = size_type(key_hash & _mask);
  1504. auto next_bucket = EMH_BUCKET(_index, bucket);
  1505. if (EMH_UNLIKELY((int)next_bucket < 0))
  1506. return INACTIVE;
  1507. if (EMH_EQHASH(bucket, key_hash)) {
  1508. const auto slot = EMH_SLOT(_index, bucket);
  1509. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, slot))))
  1510. return bucket;
  1511. }
  1512. if (next_bucket == bucket)
  1513. return INACTIVE;
  1514. while (true) {
  1515. if (EMH_EQHASH(next_bucket, key_hash)) {
  1516. const auto slot = EMH_SLOT(_index, next_bucket);
  1517. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, slot))))
  1518. return next_bucket;
  1519. }
  1520. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1521. if (nbucket == next_bucket)
  1522. return INACTIVE;
  1523. next_bucket = nbucket;
  1524. }
  1525. return INACTIVE;
  1526. }
  1527. // Find the slot with this key, or return bucket size
  1528. template<typename K=KeyT>
  1529. size_type find_filled_slot(const K& key) const noexcept
  1530. {
  1531. const auto key_hash = hash_key(key);
  1532. const auto bucket = size_type(key_hash & _mask);
  1533. auto next_bucket = EMH_BUCKET(_index, bucket);
  1534. if ((int)next_bucket < 0)
  1535. return _num_filled;
  1536. if (EMH_EQHASH(bucket, key_hash)) {
  1537. const auto slot = EMH_SLOT(_index, bucket);
  1538. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, slot))))
  1539. return slot;
  1540. }
  1541. if (next_bucket == bucket)
  1542. return _num_filled;
  1543. while (true) {
  1544. if (EMH_EQHASH(next_bucket, key_hash)) {
  1545. const auto slot = EMH_SLOT(_index, next_bucket);
  1546. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, slot))))
  1547. return slot;
  1548. }
  1549. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1550. if (nbucket == next_bucket)
  1551. return _num_filled;
  1552. next_bucket = nbucket;
  1553. }
  1554. return _num_filled;
  1555. }
  1556. #if EMH_SORT
  1557. size_type find_hash_bucket(const KeyT& key) const noexcept
  1558. {
  1559. const auto key_hash = hash_key(key);
  1560. const auto bucket = size_type(key_hash & _mask);
  1561. const auto next_bucket = EMH_BUCKET(_index, bucket);
  1562. if ((int)next_bucket < 0)
  1563. return END;
  1564. auto slot = EMH_SLOT(_index, bucket);
  1565. if (_eq(key, EMH_KEY(_pairs, slot++)))
  1566. return slot;
  1567. else if (next_bucket == bucket)
  1568. return END;
  1569. while (true) {
  1570. const auto& okey = EMH_KEY(_pairs, slot++);
  1571. if (_eq(key, okey))
  1572. return slot;
  1573. const auto hasho = hash_key(okey);
  1574. if ((hasho & _mask) != bucket)
  1575. break;
  1576. else if (hasho > key_hash)
  1577. break;
  1578. else if (EMH_UNLIKELY(slot >= _num_filled))
  1579. break;
  1580. }
  1581. return END;
  1582. }
  1583. //only for find/can not insert
  1584. size_type find_sorted_bucket(const KeyT& key) const noexcept
  1585. {
  1586. const auto key_hash = hash_key(key);
  1587. const auto bucket = size_type(key_hash & _mask);
  1588. const auto slots = (int)(EMH_BUCKET(_index, bucket)); //TODO
  1589. if (slots < 0 /**|| key < EMH_KEY(_pairs, slot)*/)
  1590. return END;
  1591. const auto slot = EMH_SLOT(_index, bucket);
  1592. auto ormask = _index[bucket].slot & ~_mask;
  1593. auto hmask = EMH_KEYMASK(key_hash, _mask);
  1594. if ((hmask | ormask) != ormask)
  1595. return END;
  1596. if (_eq(key, EMH_KEY(_pairs, slot)))
  1597. return slot;
  1598. else if (slots == 1 || key < EMH_KEY(_pairs, slot))
  1599. return END;
  1600. #if EMH_SORT
  1601. if (key < EMH_KEY(_pairs, slot) || key > EMH_KEY(_pairs, slots + slot - 1))
  1602. return END;
  1603. #endif
  1604. for (size_type i = 1; i < slots; ++i) {
  1605. const auto& okey = EMH_KEY(_pairs, slot + i);
  1606. if (_eq(key, okey))
  1607. return slot + i;
  1608. // else if (okey > key)
  1609. // return END;
  1610. }
  1611. return END;
  1612. }
  1613. #endif
  1614. //kick out bucket and find empty to occpuy
  1615. //it will break the orgin link and relnik again.
  1616. //before: main_bucket-->prev_bucket --> bucket --> next_bucket
  1617. //atfer : main_bucket-->prev_bucket --> (removed)--> new_bucket--> next_bucket
  1618. size_type kickout_bucket(const size_type kmain, const size_type bucket) noexcept
  1619. {
  1620. const auto next_bucket = EMH_BUCKET(_index, bucket);
  1621. const auto new_bucket = find_empty_bucket(next_bucket, 2);
  1622. const auto prev_bucket = find_prev_bucket(kmain, bucket);
  1623. const auto last = next_bucket == bucket ? new_bucket : next_bucket;
  1624. EMH_INDEX(_index, new_bucket) = {last, EMH_HSLOT(_index, bucket)};
  1625. EMH_BUCKET(_index, prev_bucket) = new_bucket;
  1626. EMH_BUCKET(_index, bucket) = INACTIVE;
  1627. return bucket;
  1628. }
  1629. /*
  1630. ** inserts a new key into a hash table; first, check whether key's main
  1631. ** bucket/position is free. If not, check whether colliding node/bucket is in its main
  1632. ** position or not: if it is not, move colliding bucket to an empty place and
  1633. ** put new key in its main position; otherwise (colliding bucket is in its main
  1634. ** position), new key goes to an empty position.
  1635. */
  1636. template<typename K=KeyT>
  1637. size_type find_or_allocate(const K& key, uint64_t key_hash) noexcept
  1638. {
  1639. const auto bucket = size_type(key_hash & _mask);
  1640. auto next_bucket = EMH_BUCKET(_index, bucket);
  1641. if ((int)next_bucket < 0) {
  1642. #if EMH_HIGH_LOAD
  1643. if (next_bucket != INACTIVE)
  1644. pop_empty(bucket);
  1645. #endif
  1646. return bucket;
  1647. }
  1648. const auto slot = EMH_SLOT(_index, bucket);
  1649. if (EMH_EQHASH(bucket, key_hash))
  1650. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, slot))))
  1651. return bucket;
  1652. //check current bucket_key is in main bucket or not
  1653. const auto kmain = hash_bucket(EMH_KEY(_pairs, slot));
  1654. if (kmain != bucket)
  1655. return kickout_bucket(kmain, bucket);
  1656. else if (next_bucket == bucket)
  1657. return EMH_BUCKET(_index, next_bucket) = find_empty_bucket(next_bucket, 1);
  1658. uint32_t csize = 1;
  1659. //find next linked bucket and check key
  1660. while (true) {
  1661. const auto eslot = EMH_SLOT(_index, next_bucket);
  1662. if (EMH_EQHASH(next_bucket, key_hash)) {
  1663. if (EMH_LIKELY(_eq(key, EMH_KEY(_pairs, eslot))))
  1664. return next_bucket;
  1665. }
  1666. csize += 1;
  1667. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1668. if (nbucket == next_bucket)
  1669. break;
  1670. next_bucket = nbucket;
  1671. }
  1672. //find a empty and link it to tail
  1673. const auto new_bucket = find_empty_bucket(next_bucket, csize);
  1674. return EMH_BUCKET(_index, next_bucket) = new_bucket;
  1675. }
  1676. size_type find_unique_bucket(uint64_t key_hash) noexcept
  1677. {
  1678. const auto bucket = size_type(key_hash & _mask);
  1679. auto next_bucket = EMH_BUCKET(_index, bucket);
  1680. if ((int)next_bucket < 0) {
  1681. #if EMH_HIGH_LOAD
  1682. if (next_bucket != INACTIVE)
  1683. pop_empty(bucket);
  1684. #endif
  1685. return bucket;
  1686. }
  1687. //check current bucket_key is in main bucket or not
  1688. const auto kmain = hash_main(bucket);
  1689. if (EMH_UNLIKELY(kmain != bucket))
  1690. return kickout_bucket(kmain, bucket);
  1691. else if (EMH_UNLIKELY(next_bucket != bucket))
  1692. next_bucket = find_last_bucket(next_bucket);
  1693. return EMH_BUCKET(_index, next_bucket) = find_empty_bucket(next_bucket, 2);
  1694. }
  1695. /***
  1696. Different probing techniques usually provide a trade-off between memory locality and avoidance of clustering.
  1697. Since Robin Hood hashing is relatively resilient to clustering (both primary and secondary), linear probing is the most cache friendly alternativeis typically used.
  1698. It's the core algorithm of this hash map with highly optimization/benchmark.
  1699. normaly linear probing is inefficient with high load factor, it use a new 3-way linear
  1700. probing strategy to search empty slot. from benchmark even the load factor > 0.9, it's more 2-3 timer fast than
  1701. one-way search strategy.
  1702. 1. linear or quadratic probing a few cache line for less cache miss from input slot "bucket_from".
  1703. 2. the first search slot from member variant "_last", init with 0
  1704. 3. the second search slot from calculated pos "(_num_filled + _last) & _mask", it's like a rand value
  1705. */
  1706. // key is not in this mavalue. Find a place to put it.
  1707. size_type find_empty_bucket(const size_type bucket_from, uint32_t csize) noexcept
  1708. {
  1709. #if EMH_HIGH_LOAD
  1710. if (_ehead)
  1711. return pop_empty(_ehead);
  1712. #endif
  1713. auto bucket = bucket_from;
  1714. if (EMH_EMPTY(_index, ++bucket) || EMH_EMPTY(_index, ++bucket))
  1715. return bucket;
  1716. #ifdef EMH_QUADRATIC
  1717. constexpr size_type linear_probe_length = 2 * EMH_CACHE_LINE_SIZE / sizeof(Index);//16
  1718. for (size_type offset = csize + 2, step = 4; offset <= linear_probe_length; ) {
  1719. bucket = (bucket_from + offset) & _mask;
  1720. if (EMH_EMPTY(_index, bucket) || EMH_EMPTY(_index, ++bucket))
  1721. return bucket;
  1722. offset += step; //7/8. 12. 16
  1723. }
  1724. #else
  1725. constexpr size_type quadratic_probe_length = 6u;
  1726. for (size_type offset = 4u, step = 3u; step < quadratic_probe_length; ) {
  1727. bucket = (bucket_from + offset) & _mask;
  1728. if (EMH_EMPTY(_index, bucket) || EMH_EMPTY(_index, ++bucket))
  1729. return bucket;
  1730. offset += step++;//3.4.5
  1731. }
  1732. #endif
  1733. #if EMH_PREFETCH
  1734. __builtin_prefetch(static_cast<const void*>(_index + _last + 1), 0, EMH_PREFETCH);
  1735. #endif
  1736. for (;;) {
  1737. #if EMH_PACK_TAIL
  1738. //find empty bucket and skip next
  1739. if (EMH_EMPTY(_index, _last++))// || EMH_EMPTY(_index, _last++))
  1740. return _last++ - 1;
  1741. if (EMH_UNLIKELY(_last >= _num_buckets))
  1742. _last = 0;
  1743. auto medium = (_mask / 4 + _last++) & _mask;
  1744. if (EMH_EMPTY(_index, medium))
  1745. return medium;
  1746. #else
  1747. if (EMH_EMPTY(_index, ++_last))// || EMH_EMPTY(_index, ++_last))
  1748. return _last++;
  1749. _last &= _mask;
  1750. auto medium = (_num_buckets / 2 + _last) & _mask;
  1751. if (EMH_EMPTY(_index, medium))// || EMH_EMPTY(_index, ++medium))
  1752. return _last = medium;
  1753. #endif
  1754. }
  1755. return 0;
  1756. }
  1757. size_type find_last_bucket(size_type main_bucket) const
  1758. {
  1759. auto next_bucket = EMH_BUCKET(_index, main_bucket);
  1760. if (next_bucket == main_bucket)
  1761. return main_bucket;
  1762. while (true) {
  1763. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1764. if (nbucket == next_bucket)
  1765. return next_bucket;
  1766. next_bucket = nbucket;
  1767. }
  1768. }
  1769. size_type find_prev_bucket(const size_type main_bucket, const size_type bucket) const
  1770. {
  1771. auto next_bucket = EMH_BUCKET(_index, main_bucket);
  1772. if (next_bucket == bucket)
  1773. return main_bucket;
  1774. while (true) {
  1775. const auto nbucket = EMH_BUCKET(_index, next_bucket);
  1776. if (nbucket == bucket)
  1777. return next_bucket;
  1778. next_bucket = nbucket;
  1779. }
  1780. }
  1781. inline size_type hash_bucket(const KeyT& key) const noexcept
  1782. {
  1783. return (size_type)hash_key(key) & _mask;
  1784. }
  1785. inline size_type hash_main(const size_type bucket) const noexcept
  1786. {
  1787. const auto slot = EMH_SLOT(_index, bucket);
  1788. return (size_type)hash_key(EMH_KEY(_pairs, slot)) & _mask;
  1789. }
  1790. #if EMH_INT_HASH
  1791. static constexpr uint64_t KC = UINT64_C(11400714819323198485);
  1792. static uint64_t hash64(uint64_t key)
  1793. {
  1794. #if __SIZEOF_INT128__ && EMH_INT_HASH == 1
  1795. __uint128_t r = key; r *= KC;
  1796. return (uint64_t)(r >> 64) + (uint64_t)r;
  1797. #elif EMH_INT_HASH == 2
  1798. //MurmurHash3Mixer
  1799. uint64_t h = key;
  1800. h ^= h >> 33;
  1801. h *= 0xff51afd7ed558ccd;
  1802. h ^= h >> 33;
  1803. h *= 0xc4ceb9fe1a85ec53;
  1804. h ^= h >> 33;
  1805. return h;
  1806. #elif _WIN64 && EMH_INT_HASH == 1
  1807. uint64_t high;
  1808. return _umul128(key, KC, &high) + high;
  1809. #elif EMH_INT_HASH == 3
  1810. auto ror = (key >> 32) | (key << 32);
  1811. auto low = key * 0xA24BAED4963EE407ull;
  1812. auto high = ror * 0x9FB21C651E98DF25ull;
  1813. auto mix = low + high;
  1814. return mix;
  1815. #elif EMH_INT_HASH == 1
  1816. uint64_t r = key * UINT64_C(0xca4bcaa75ec3f625);
  1817. return (r >> 32) + r;
  1818. #elif EMH_WYHASH64
  1819. return wyhash64(key, KC);
  1820. #else
  1821. uint64_t x = key;
  1822. x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9);
  1823. x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb);
  1824. x = x ^ (x >> 31);
  1825. return x;
  1826. #endif
  1827. }
  1828. #endif
  1829. #if EMH_WYHASH_HASH
  1830. //#define WYHASH_CONDOM 1
  1831. inline uint64_t wymix(uint64_t A, uint64_t B)
  1832. {
  1833. #if defined(__SIZEOF_INT128__)
  1834. __uint128_t r = A; r *= B;
  1835. #if WYHASH_CONDOM2
  1836. A ^= (uint64_t)r; B ^= (uint64_t)(r >> 64);
  1837. #else
  1838. A = (uint64_t)r; B = (uint64_t)(r >> 64);
  1839. #endif
  1840. #elif defined(_MSC_VER) && defined(_M_X64)
  1841. #if WYHASH_CONDOM2
  1842. uint64_t a, b;
  1843. a = _umul128(A, B, &b);
  1844. A ^= a; B ^= b;
  1845. #else
  1846. A = _umul128(A, B, &B);
  1847. #endif
  1848. #else
  1849. uint64_t ha = A >> 32, hb = B >> 32, la = (uint32_t)A, lb = (uint32_t)B, hi, lo;
  1850. uint64_t rh = ha * hb, rm0 = ha * lb, rm1 = hb * la, rl = la * lb, t = rl + (rm0 << 32), c = t < rl;
  1851. lo = t + (rm1 << 32); c += lo < t; hi = rh + (rm0 >> 32) + (rm1 >> 32) + c;
  1852. #if WYHASH_CONDOM2
  1853. A ^= lo; B ^= hi;
  1854. #else
  1855. A = lo; B = hi;
  1856. #endif
  1857. #endif
  1858. return A ^ B;
  1859. }
  1860. //multiply and xor mix function, aka MUM
  1861. static inline uint64_t wyr8(const uint8_t *p) { uint64_t v; memcpy(&v, p, 8); return v; }
  1862. static inline uint64_t wyr4(const uint8_t *p) { uint32_t v; memcpy(&v, p, 4); return v; }
  1863. static inline uint64_t wyr3(const uint8_t *p, size_t k) {
  1864. return (((uint64_t)p[0]) << 16) | (((uint64_t)p[k >> 1]) << 8) | p[k - 1];
  1865. }
  1866. static constexpr uint64_t secret[4] = {
  1867. 0xa0761d6478bd642full, 0xe7037ed1a0b428dbull,
  1868. 0x8ebc6af09c88c6e3ull, 0x589965cc75374cc3ull};
  1869. public:
  1870. //wyhash main function https://github.com/wangyi-fudan/wyhash
  1871. static uint64_t wyhashstr(const char *key, const size_t len)
  1872. {
  1873. uint64_t a = 0, b = 0, seed = secret[0];
  1874. const uint8_t *p = (const uint8_t*)key;
  1875. if (EMH_LIKELY(len <= 16)) {
  1876. if (EMH_LIKELY(len >= 4)) {
  1877. const auto half = (len >> 3) << 2;
  1878. a = (wyr4(p) << 32U) | wyr4(p + half); p += len - 4;
  1879. b = (wyr4(p) << 32U) | wyr4(p - half);
  1880. } else if (len) {
  1881. a = wyr3(p, len);
  1882. }
  1883. } else {
  1884. size_t i = len;
  1885. if (EMH_UNLIKELY(i > 48)) {
  1886. uint64_t see1 = seed, see2 = seed;
  1887. do {
  1888. seed = wymix(wyr8(p + 0) ^ secret[1], wyr8(p + 8) ^ seed);
  1889. see1 = wymix(wyr8(p + 16) ^ secret[2], wyr8(p + 24) ^ see1);
  1890. see2 = wymix(wyr8(p + 32) ^ secret[3], wyr8(p + 40) ^ see2);
  1891. p += 48; i -= 48;
  1892. } while (EMH_LIKELY(i > 48));
  1893. seed ^= see1 ^ see2;
  1894. }
  1895. while (i > 16) {
  1896. seed = wymix(wyr8(p) ^ secret[1], wyr8(p + 8) ^ seed);
  1897. i -= 16; p += 16;
  1898. }
  1899. a = wyr8(p + i - 16);
  1900. b = wyr8(p + i - 8);
  1901. }
  1902. return wymix(secret[1] ^ len, wymix(a ^ secret[1], b ^ seed));
  1903. }
  1904. #endif
  1905. private:
  1906. template<typename UType, typename std::enable_if<std::is_integral<UType>::value, uint32_t>::type = 0>
  1907. inline uint64_t hash_key(const UType key) const
  1908. {
  1909. #if EMH_INT_HASH
  1910. return hash64(key);
  1911. #elif EMH_IDENTITY_HASH
  1912. return key + (key >> 24);
  1913. #else
  1914. return _hasher(key);
  1915. #endif
  1916. }
  1917. template<typename UType, typename std::enable_if<std::is_same<UType, std::string>::value, uint32_t>::type = 0>
  1918. inline uint64_t hash_key(const UType& key) const
  1919. {
  1920. #if EMH_WYHASH_HASH
  1921. return wyhashstr(key.data(), key.size());
  1922. #else
  1923. return _hasher(key);
  1924. #endif
  1925. }
  1926. template<typename UType, typename std::enable_if<!std::is_integral<UType>::value && !std::is_same<UType, std::string>::value, uint32_t>::type = 0>
  1927. inline uint64_t hash_key(const UType& key) const
  1928. {
  1929. return _hasher(key);
  1930. }
  1931. private:
  1932. Index* _index;
  1933. value_type*_pairs;
  1934. HashT _hasher;
  1935. EqT _eq;
  1936. uint32_t _mlf;
  1937. size_type _mask;
  1938. size_type _num_buckets;
  1939. size_type _num_filled;
  1940. size_type _last;
  1941. #if EMH_HIGH_LOAD
  1942. size_type _ehead;
  1943. #endif
  1944. size_type _etail;
  1945. };
  1946. } // namespace emhash
  1947. struct PyObject;
  1948. typedef pkpy::shared_ptr<PyObject> PyVar;
  1949. typedef PyVar PyVarOrNull;
  1950. typedef PyVar VarRef;
  1951. class PyVarList: public std::vector<PyVar> {
  1952. PyVar& at(size_t) = delete;
  1953. inline void __checkIndex(size_t i) const {
  1954. #ifndef PKPY_NO_INDEX_CHECK
  1955. if (i >= size()){
  1956. auto msg = "std::vector index out of range, " + std::to_string(i) + " not in [0, " + std::to_string(size()) + ")";
  1957. throw std::out_of_range(msg);
  1958. }
  1959. #endif
  1960. }
  1961. public:
  1962. PyVar& operator[](size_t i) {
  1963. __checkIndex(i);
  1964. return std::vector<PyVar>::operator[](i);
  1965. }
  1966. const PyVar& operator[](size_t i) const {
  1967. __checkIndex(i);
  1968. return std::vector<PyVar>::operator[](i);
  1969. }
  1970. // define constructors the same as std::vector
  1971. using std::vector<PyVar>::vector;
  1972. };
  1973. class PyVarDict: public emhash8::HashMap<_Str, PyVar> {
  1974. PyVar& at(const _Str&) = delete;
  1975. public:
  1976. #ifndef PKPY_NO_INDEX_CHECK
  1977. PyVar& operator[](const _Str& key) {
  1978. return emhash8::HashMap<_Str, PyVar>::operator[](key);
  1979. }
  1980. const PyVar& operator[](const _Str& key) const {
  1981. auto it = find(key);
  1982. if (it == end()){
  1983. auto msg = "map key not found, '" + key.str() + "'";
  1984. throw std::out_of_range(msg);
  1985. }
  1986. return it->second;
  1987. }
  1988. #endif
  1989. using emhash8::HashMap<_Str, PyVar>::HashMap;
  1990. };
  1991. namespace pkpy {
  1992. const uint8_t MAX_POOLING_N = 10;
  1993. static std::vector<PyVar*>* _poolArgList = new std::vector<PyVar*>[MAX_POOLING_N];
  1994. class ArgList {
  1995. PyVar* _args = nullptr;
  1996. uint8_t _size = 0;
  1997. inline void __checkIndex(uint8_t i) const {
  1998. #ifndef PKPY_NO_INDEX_CHECK
  1999. if (i >= _size){
  2000. auto msg = "pkpy:ArgList index out of range, " + std::to_string(i) + " not in [0, " + std::to_string(size()) + ")";
  2001. throw std::out_of_range(msg);
  2002. }
  2003. #endif
  2004. }
  2005. void __tryAlloc(uint8_t n){
  2006. if(n > 255) UNREACHABLE();
  2007. if(n >= MAX_POOLING_N || _poolArgList[n].empty()){
  2008. this->_size = n;
  2009. this->_args = new PyVar[n];
  2010. }else{
  2011. this->_args = _poolArgList[n].back();
  2012. this->_size = n;
  2013. _poolArgList[n].pop_back();
  2014. }
  2015. }
  2016. void __tryRelease(){
  2017. if(_size == 0 || _args == nullptr) return;
  2018. if(_size >= MAX_POOLING_N || _poolArgList[_size].size() > 32){
  2019. delete[] _args;
  2020. }else{
  2021. for(uint8_t i = 0; i < _size; i++) _args[i].reset();
  2022. _poolArgList[_size].push_back(_args);
  2023. }
  2024. }
  2025. public:
  2026. ArgList(uint8_t n){
  2027. if(n != 0) __tryAlloc(n);
  2028. }
  2029. ArgList(const ArgList& other){
  2030. __tryAlloc(other._size);
  2031. for(uint8_t i=0; i<_size; i++){
  2032. _args[i] = other._args[i];
  2033. }
  2034. }
  2035. ArgList(ArgList&& other){
  2036. this->_args = other._args;
  2037. this->_size = other._size;
  2038. other._args = nullptr;
  2039. other._size = 0;
  2040. }
  2041. ArgList(PyVarList&& other){
  2042. __tryAlloc(other.size());
  2043. for(uint8_t i=0; i<_size; i++){
  2044. _args[i] = std::move(other[i]);
  2045. }
  2046. other.clear();
  2047. }
  2048. PyVar& operator[](uint8_t i){
  2049. __checkIndex(i);
  2050. return _args[i];
  2051. }
  2052. const PyVar& operator[](uint8_t i) const {
  2053. __checkIndex(i);
  2054. return _args[i];
  2055. }
  2056. inline PyVar& _index(uint8_t i){
  2057. return _args[i];
  2058. }
  2059. // overload = for &&
  2060. ArgList& operator=(ArgList&& other){
  2061. if(this != &other){
  2062. __tryRelease();
  2063. this->_args = other._args;
  2064. this->_size = other._size;
  2065. other._args = nullptr;
  2066. other._size = 0;
  2067. }
  2068. return *this;
  2069. }
  2070. inline uint8_t size() const {
  2071. return _size;
  2072. }
  2073. ArgList subList(uint8_t start) const {
  2074. if(start >= _size) return ArgList(0);
  2075. ArgList ret(_size - start);
  2076. for(uint8_t i=start; i<_size; i++){
  2077. ret[i-start] = _args[i];
  2078. }
  2079. return ret;
  2080. }
  2081. PyVarList toList() const {
  2082. PyVarList ret(_size);
  2083. for(uint8_t i=0; i<_size; i++){
  2084. ret[i] = _args[i];
  2085. }
  2086. return ret;
  2087. }
  2088. ~ArgList(){
  2089. __tryRelease();
  2090. }
  2091. };
  2092. const ArgList& noArg(){
  2093. static ArgList ret(0);
  2094. return ret;
  2095. }
  2096. ArgList oneArg(PyVar&& a) {
  2097. ArgList ret(1);
  2098. ret[0] = std::move(a);
  2099. return ret;
  2100. }
  2101. ArgList oneArg(const PyVar& a) {
  2102. ArgList ret(1);
  2103. ret[0] = a;
  2104. return ret;
  2105. }
  2106. ArgList twoArgs(PyVar&& a, PyVar&& b) {
  2107. ArgList ret(2);
  2108. ret[0] = std::move(a);
  2109. ret[1] = std::move(b);
  2110. return ret;
  2111. }
  2112. ArgList twoArgs(const PyVar& a, const PyVar& b) {
  2113. ArgList ret(2);
  2114. ret[0] = a;
  2115. ret[1] = b;
  2116. return ret;
  2117. }
  2118. }
  2119. const char* __BUILTINS_CODE = R"(
  2120. def len(x):
  2121. return x.__len__()
  2122. def print(*args, sep=' ', end='\n'):
  2123. s = sep.join([str(i) for i in args])
  2124. __sys_stdout_write(s + end)
  2125. str.__mul__ = lambda self, n: ''.join([self for _ in range(n)])
  2126. def __str4split(self, sep):
  2127. if sep == "":
  2128. return list(self)
  2129. res = []
  2130. i = 0
  2131. while i < len(self):
  2132. if self[i:i+len(sep)] == sep:
  2133. res.append(self[:i])
  2134. self = self[i+len(sep):]
  2135. i = 0
  2136. else:
  2137. i += 1
  2138. res.append(self)
  2139. return res
  2140. str.split = __str4split
  2141. del __str4split
  2142. def __str4index(self, sub):
  2143. for i in range(len(self) - len(sub) + 1):
  2144. if self[i:i+len(sub)] == sub:
  2145. return i
  2146. return -1
  2147. str.index = __str4index
  2148. del __str4index
  2149. list.__repr__ = lambda self: '[' + ', '.join([repr(i) for i in self]) + ']'
  2150. tuple.__repr__ = lambda self: '(' + ', '.join([repr(i) for i in self]) + ')'
  2151. list.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
  2152. tuple.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
  2153. def __list4extend(self, other):
  2154. for i in other:
  2155. self.append(i)
  2156. list.extend = __list4extend
  2157. del __list4extend
  2158. def __list4remove(self, value):
  2159. for i in range(len(self)):
  2160. if self[i] == value:
  2161. del self[i]
  2162. return True
  2163. return False
  2164. list.remove = __list4remove
  2165. del __list4remove
  2166. def __list4index(self, value):
  2167. for i in range(len(self)):
  2168. if self[i] == value:
  2169. return i
  2170. return -1
  2171. list.index = __list4index
  2172. del __list4index
  2173. def __list4__mul__(self, n):
  2174. a = []
  2175. for i in range(n):
  2176. a.extend(self)
  2177. return a
  2178. list.__mul__ = __list4__mul__
  2179. del __list4__mul__
  2180. def __iterable4__eq__(self, other):
  2181. if len(self) != len(other):
  2182. return False
  2183. for i in range(len(self)):
  2184. if self[i] != other[i]:
  2185. return False
  2186. return True
  2187. list.__eq__ = __iterable4__eq__
  2188. tuple.__eq__ = __iterable4__eq__
  2189. del __iterable4__eq__
  2190. def __iterable4count(self, x):
  2191. res = 0
  2192. for i in self:
  2193. if i == x:
  2194. res += 1
  2195. return res
  2196. list.count = __iterable4count
  2197. tuple.count = __iterable4count
  2198. del __iterable4count
  2199. def __iterable4__contains__(self, item):
  2200. for i in self:
  2201. if i == item:
  2202. return True
  2203. return False
  2204. list.__contains__ = __iterable4__contains__
  2205. tuple.__contains__ = __iterable4__contains__
  2206. del __iterable4__contains__
  2207. list.__new__ = lambda obj: [i for i in obj]
  2208. # https://github.com/python/cpython/blob/main/Objects/dictobject.c
  2209. class dict:
  2210. def __init__(self):
  2211. self._capacity = 8
  2212. self._a = [None] * self._capacity
  2213. self._len = 0
  2214. def __len__(self):
  2215. return self._len
  2216. def __probe(self, key):
  2217. i = hash(key) % self._capacity
  2218. while self._a[i] is not None:
  2219. if self._a[i][0] == key:
  2220. return True, i
  2221. i = ((5*i) + 1) % self._capacity
  2222. return False, i
  2223. def __getitem__(self, key):
  2224. ok, i = self.__probe(key)
  2225. if not ok:
  2226. raise KeyError(key)
  2227. return self._a[i][1]
  2228. def __contains__(self, key):
  2229. ok, i = self.__probe(key)
  2230. return ok
  2231. def __setitem__(self, key, value):
  2232. ok, i = self.__probe(key)
  2233. if ok:
  2234. self._a[i][1] = value
  2235. else:
  2236. self._a[i] = [key, value]
  2237. self._len += 1
  2238. if self._len > self._capacity * 0.6:
  2239. self.__resize_2x()
  2240. def __delitem__(self, key):
  2241. ok, i = self.__probe(key)
  2242. if not ok:
  2243. raise KeyError(key)
  2244. self._a[i] = None
  2245. self._len -= 1
  2246. def __resize_2x(self):
  2247. old_a = self._a
  2248. self._capacity *= 2
  2249. self._a = [None] * self._capacity
  2250. self._len = 0
  2251. for kv in old_a:
  2252. if kv is not None:
  2253. self[kv[0]] = kv[1]
  2254. def keys(self):
  2255. return [kv[0] for kv in self._a if kv is not None]
  2256. def values(self):
  2257. return [kv[1] for kv in self._a if kv is not None]
  2258. def items(self):
  2259. return [kv for kv in self._a if kv is not None]
  2260. def clear(self):
  2261. self._a = [None] * self._capacity
  2262. self._len = 0
  2263. def update(self, other):
  2264. for k, v in other.items():
  2265. self[k] = v
  2266. def copy(self):
  2267. d = dict()
  2268. for kv in self._a:
  2269. if kv is not None:
  2270. d[kv[0]] = kv[1]
  2271. return d
  2272. def __repr__(self):
  2273. a = [repr(k)+': '+repr(v) for k,v in self.items()]
  2274. return '{'+ ', '.join(a) + '}'
  2275. def __json__(self):
  2276. a = []
  2277. for k,v in self.items():
  2278. if type(k) is not str:
  2279. raise TypeError('json keys must be strings, got ' + repr(k) )
  2280. a.append(k.__json__()+': '+v.__json__())
  2281. return '{'+ ', '.join(a) + '}'
  2282. def round(x):
  2283. if x >= 0:
  2284. return int(x + 0.5)
  2285. else:
  2286. return int(x - 0.5)
  2287. def max(a, b):
  2288. if a > b:
  2289. return a
  2290. return b
  2291. def min(a, b):
  2292. if a < b:
  2293. return a
  2294. return b
  2295. def sum(iterable):
  2296. res = 0
  2297. for i in iterable:
  2298. res += i
  2299. return res
  2300. def map(f, iterable):
  2301. return [f(i) for i in iterable]
  2302. def zip(a, b):
  2303. return [(a[i], b[i]) for i in range(min(len(a), len(b)))]
  2304. def sorted(iterable, key=None, reverse=False):
  2305. if key is None:
  2306. key = lambda x: x
  2307. a = [key(i) for i in iterable]
  2308. b = list(iterable)
  2309. for i in range(len(a)):
  2310. for j in range(i+1, len(a)):
  2311. if (a[i] > a[j]) ^ reverse:
  2312. a[i], a[j] = a[j], a[i]
  2313. b[i], b[j] = b[j], b[i]
  2314. return b
  2315. import json as _json
  2316. def jsonrpc(method, params, raw=False):
  2317. assert type(method) is str
  2318. assert type(params) is list or type(params) is tuple
  2319. data = {
  2320. 'jsonrpc': '2.0',
  2321. 'method': method,
  2322. 'params': params,
  2323. }
  2324. ret = __string_channel_call(_json.dumps(data))
  2325. ret = _json.loads(ret)
  2326. if raw:
  2327. return ret
  2328. assert type(ret) is dict
  2329. if 'result' in ret:
  2330. return ret['result']
  2331. raise JsonRpcError(ret['error']['message'])
  2332. def input(prompt=None):
  2333. return jsonrpc('input', [prompt])
  2334. class FileIO:
  2335. def __init__(self, path, mode):
  2336. assert type(path) is str
  2337. assert type(mode) is str
  2338. assert mode in ['r', 'w']
  2339. self.path = path
  2340. self.mode = mode
  2341. self.fp = jsonrpc('fopen', [path, mode])
  2342. def read(self):
  2343. assert self.mode == 'r'
  2344. return jsonrpc('fread', [self.fp])
  2345. def write(self, s):
  2346. assert self.mode == 'w'
  2347. assert type(s) is str
  2348. jsonrpc('fwrite', [self.fp, s])
  2349. def close(self):
  2350. jsonrpc('fclose', [self.fp])
  2351. def __enter__(self):
  2352. pass
  2353. def __exit__(self):
  2354. self.close()
  2355. def open(path, mode='r'):
  2356. return FileIO(path, mode)
  2357. )";
  2358. const char* __OS_CODE = R"(
  2359. def listdir(path):
  2360. assert type(path) is str
  2361. return jsonrpc("os.listdir", [path])
  2362. def mkdir(path):
  2363. assert type(path) is str
  2364. return jsonrpc("os.mkdir", [path])
  2365. def rmdir(path):
  2366. assert type(path) is str
  2367. return jsonrpc("os.rmdir", [path])
  2368. def remove(path):
  2369. assert type(path) is str
  2370. return jsonrpc("os.remove", [path])
  2371. path = object()
  2372. def __path4exists(path):
  2373. assert type(path) is str
  2374. return jsonrpc("os.path.exists", [path])
  2375. path.exists = __path4exists
  2376. del __path4exists
  2377. )";
  2378. const char* __RANDOM_CODE = R"(
  2379. import time as _time
  2380. __all__ = ['Random', 'seed', 'random', 'randint', 'uniform']
  2381. def _int32(x):
  2382. return int(0xffffffff & x)
  2383. class Random:
  2384. def __init__(self, seed=None):
  2385. if seed is None:
  2386. seed = int(_time.time() * 1000000)
  2387. seed = _int32(seed)
  2388. self.mt = [0] * 624
  2389. self.mt[0] = seed
  2390. self.mti = 0
  2391. for i in range(1, 624):
  2392. self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i)
  2393. def extract_number(self):
  2394. if self.mti == 0:
  2395. self.twist()
  2396. y = self.mt[self.mti]
  2397. y = y ^ y >> 11
  2398. y = y ^ y << 7 & 2636928640
  2399. y = y ^ y << 15 & 4022730752
  2400. y = y ^ y >> 18
  2401. self.mti = (self.mti + 1) % 624
  2402. return _int32(y)
  2403. def twist(self):
  2404. for i in range(0, 624):
  2405. y = _int32((self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff))
  2406. self.mt[i] = (y >> 1) ^ self.mt[(i + 397) % 624]
  2407. if y % 2 != 0:
  2408. self.mt[i] = self.mt[i] ^ 0x9908b0df
  2409. def seed(self, x):
  2410. assert type(x) is int
  2411. self.mt = [0] * 624
  2412. self.mt[0] = _int32(x)
  2413. self.mti = 0
  2414. for i in range(1, 624):
  2415. self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i)
  2416. def random(self):
  2417. return self.extract_number() / 2 ** 32
  2418. def randint(self, a, b):
  2419. assert type(a) is int and type(b) is int
  2420. assert a <= b
  2421. return int(self.random() * (b - a + 1)) + a
  2422. def uniform(self, a, b):
  2423. assert type(a) is int or type(a) is float
  2424. assert type(b) is int or type(b) is float
  2425. if a > b:
  2426. a, b = b, a
  2427. return self.random() * (b - a) + a
  2428. def shuffle(self, L):
  2429. for i in range(len(L)):
  2430. j = self.randint(i, len(L) - 1)
  2431. L[i], L[j] = L[j], L[i]
  2432. def choice(self, L):
  2433. return L[self.randint(0, len(L) - 1)]
  2434. _inst = Random()
  2435. seed = _inst.seed
  2436. random = _inst.random
  2437. randint = _inst.randint
  2438. uniform = _inst.uniform
  2439. shuffle = _inst.shuffle
  2440. choice = _inst.choice
  2441. )";
  2442. class NeedMoreLines {
  2443. public:
  2444. NeedMoreLines(bool isClassDef) : isClassDef(isClassDef) {}
  2445. bool isClassDef;
  2446. };
  2447. enum CompileMode {
  2448. EXEC_MODE,
  2449. EVAL_MODE,
  2450. SINGLE_MODE, // for REPL
  2451. JSON_MODE,
  2452. };
  2453. struct SourceMetadata {
  2454. const char* source;
  2455. _Str filename;
  2456. std::vector<const char*> lineStarts;
  2457. CompileMode mode;
  2458. _Str getLine(int lineno) const {
  2459. if(lineno == -1) return "<?>";
  2460. lineno -= 1;
  2461. if(lineno < 0) lineno = 0;
  2462. const char* _start = lineStarts.at(lineno);
  2463. const char* i = _start;
  2464. while(*i != '\n' && *i != '\0') i++;
  2465. return _Str(_start, i-_start);
  2466. }
  2467. SourceMetadata(const char* source, _Str filename, CompileMode mode) {
  2468. source = strdup(source);
  2469. // Skip utf8 BOM if there is any.
  2470. if (strncmp(source, "\xEF\xBB\xBF", 3) == 0) source += 3;
  2471. this->filename = filename;
  2472. this->source = source;
  2473. lineStarts.push_back(source);
  2474. this->mode = mode;
  2475. }
  2476. _Str snapshot(int lineno){
  2477. _StrStream ss;
  2478. ss << " " << "File \"" << filename << "\", line " << lineno << '\n';
  2479. _Str line = getLine(lineno).__lstrip();
  2480. if(line.empty()) line = "<?>";
  2481. ss << " " << line << '\n';
  2482. return ss.str();
  2483. }
  2484. ~SourceMetadata(){
  2485. free((void*)source);
  2486. }
  2487. };
  2488. typedef pkpy::shared_ptr<SourceMetadata> _Source;
  2489. class _Error : public std::exception {
  2490. private:
  2491. _Str _what;
  2492. public:
  2493. _Error(_Str type, _Str msg, _Str desc){
  2494. _what = desc + type + ": " + msg;
  2495. }
  2496. const char* what() const noexcept override {
  2497. return _what.c_str();
  2498. }
  2499. };
  2500. class CompileError : public _Error {
  2501. public:
  2502. CompileError(_Str type, _Str msg, _Str snapshot)
  2503. : _Error(type, msg, snapshot) {}
  2504. };
  2505. class RuntimeError : public _Error {
  2506. private:
  2507. static _Str __concat(std::stack<_Str> snapshots){
  2508. _StrStream ss;
  2509. ss << "Traceback (most recent call last):" << '\n';
  2510. while(!snapshots.empty()){
  2511. ss << snapshots.top();
  2512. snapshots.pop();
  2513. }
  2514. return ss.str();
  2515. }
  2516. public:
  2517. RuntimeError(_Str type, _Str msg, const std::stack<_Str>& snapshots)
  2518. : _Error(type, msg, __concat(snapshots)) {}
  2519. };
  2520. typedef int64_t _Int;
  2521. typedef double _Float;
  2522. struct CodeObject;
  2523. struct BasePointer;
  2524. class VM;
  2525. class Frame;
  2526. typedef PyVar (*_CppFunc)(VM*, const pkpy::ArgList&);
  2527. typedef pkpy::shared_ptr<CodeObject> _Code;
  2528. struct Function {
  2529. _Str name;
  2530. _Code code;
  2531. std::vector<_Str> args;
  2532. _Str starredArg; // empty if no *arg
  2533. PyVarDict kwArgs; // empty if no k=v
  2534. std::vector<_Str> kwArgsOrder;
  2535. bool hasName(const _Str& val) const {
  2536. bool _0 = std::find(args.begin(), args.end(), val) != args.end();
  2537. bool _1 = starredArg == val;
  2538. bool _2 = kwArgs.find(val) != kwArgs.end();
  2539. return _0 || _1 || _2;
  2540. }
  2541. };
  2542. struct _BoundedMethod {
  2543. PyVar obj;
  2544. PyVar method;
  2545. };
  2546. struct _Range {
  2547. _Int start = 0;
  2548. _Int stop = -1;
  2549. _Int step = 1;
  2550. };
  2551. struct _Slice {
  2552. int start = 0;
  2553. int stop = 0x7fffffff;
  2554. void normalize(int len){
  2555. if(start < 0) start += len;
  2556. if(stop < 0) stop += len;
  2557. if(start < 0) start = 0;
  2558. if(stop > len) stop = len;
  2559. }
  2560. };
  2561. class BaseIterator {
  2562. protected:
  2563. VM* vm;
  2564. PyVar _ref; // keep a reference to the object so it will not be deleted while iterating
  2565. public:
  2566. virtual PyVar next() = 0;
  2567. virtual bool hasNext() = 0;
  2568. VarRef var;
  2569. BaseIterator(VM* vm, PyVar _ref) : vm(vm), _ref(_ref) {}
  2570. virtual ~BaseIterator() = default;
  2571. };
  2572. typedef pkpy::shared_ptr<Function> _Func;
  2573. typedef pkpy::shared_ptr<BaseIterator> _Iterator;
  2574. struct PyObject {
  2575. PyVar _type;
  2576. PyVarDict attribs;
  2577. inline bool isType(const PyVar& type){ return this->_type == type; }
  2578. inline virtual void* value() = 0;
  2579. // currently __name__ is only used for 'type'
  2580. PyVar _typeName(){ return _type->attribs[__name__]; }
  2581. PyObject(PyVar type) : _type(type) {}
  2582. virtual ~PyObject() = default;
  2583. };
  2584. template <typename T>
  2585. struct Py_ : PyObject {
  2586. T _valueT;
  2587. Py_(T val, const PyVar& type) : PyObject(type), _valueT(val) {}
  2588. virtual void* value() override { return &_valueT; }
  2589. };
  2590. #define UNION_GET(T, obj) (((Py_<T>*)((obj).get()))->_valueT)
  2591. #define UNION_TP_NAME(obj) UNION_GET(_Str, (obj)->_typeName())
  2592. class RangeIterator : public BaseIterator {
  2593. private:
  2594. _Int current;
  2595. _Range r;
  2596. public:
  2597. RangeIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
  2598. this->r = UNION_GET(_Range, _ref);
  2599. this->current = r.start;
  2600. }
  2601. bool hasNext() override {
  2602. if(r.step > 0){
  2603. return current < r.stop;
  2604. }else{
  2605. return current > r.stop;
  2606. }
  2607. }
  2608. PyVar next() override;
  2609. };
  2610. class VectorIterator : public BaseIterator {
  2611. private:
  2612. size_t index = 0;
  2613. const PyVarList* vec;
  2614. public:
  2615. VectorIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
  2616. vec = &UNION_GET(PyVarList, _ref);
  2617. }
  2618. bool hasNext(){
  2619. return index < vec->size();
  2620. }
  2621. PyVar next(){
  2622. return vec->operator[](index++);
  2623. }
  2624. };
  2625. class StringIterator : public BaseIterator {
  2626. private:
  2627. int index = 0;
  2628. _Str str;
  2629. public:
  2630. StringIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
  2631. str = UNION_GET(_Str, _ref);
  2632. }
  2633. bool hasNext(){
  2634. return index < str.u8_length();
  2635. }
  2636. PyVar next();
  2637. };
  2638. typedef uint8_t _TokenType;
  2639. constexpr const char* __TOKENS[] = {
  2640. "@error", "@eof", "@eol", "@sof",
  2641. ".", ",", ":", ";", "#", "(", ")", "[", "]", "{", "}", "%",
  2642. "+", "-", "*", "/", "//", "**", "=", ">", "<", "...", "->",
  2643. "<<", ">>", "&", "|", "^", "?",
  2644. "==", "!=", ">=", "<=",
  2645. "+=", "-=", "*=", "/=", "//=",
  2646. /** KW_BEGIN **/
  2647. "class", "import", "as", "def", "lambda", "pass", "del", "from", "with",
  2648. "None", "in", "is", "and", "or", "not", "True", "False", "global",
  2649. "goto", "label", // extended keywords, not available in cpython
  2650. "while", "for", "if", "elif", "else", "break", "continue", "return", "assert", "raise",
  2651. /** KW_END **/
  2652. "is not", "not in",
  2653. "@id", "@num", "@str", "@fstr",
  2654. "@indent", "@dedent"
  2655. };
  2656. const _TokenType __TOKENS_LEN = sizeof(__TOKENS) / sizeof(__TOKENS[0]);
  2657. constexpr _TokenType TK(const char* const token) {
  2658. for(int k=0; k<__TOKENS_LEN; k++){
  2659. const char* i = __TOKENS[k];
  2660. const char* j = token;
  2661. while(*i && *j && *i == *j){
  2662. i++; j++;
  2663. }
  2664. if(*i == *j) return k;
  2665. }
  2666. return 0;
  2667. }
  2668. #define TK_STR(t) __TOKENS[t]
  2669. const _TokenType __KW_BEGIN = TK("class");
  2670. const _TokenType __KW_END = TK("raise");
  2671. const emhash8::HashMap<std::string_view, _TokenType> __KW_MAP = [](){
  2672. emhash8::HashMap<std::string_view, _TokenType> map;
  2673. for(int k=__KW_BEGIN; k<=__KW_END; k++) map[__TOKENS[k]] = k;
  2674. return map;
  2675. }();
  2676. struct Token{
  2677. _TokenType type;
  2678. const char* start; //< Begining of the token in the source.
  2679. int length; //< Number of chars of the token.
  2680. int line; //< Line number of the token (1 based).
  2681. PyVar value; //< Literal value of the token.
  2682. const _Str str() const {
  2683. return _Str(start, length);
  2684. }
  2685. const _Str info() const {
  2686. _StrStream ss;
  2687. _Str raw = str();
  2688. if (raw == _Str("\n")) raw = "\\n";
  2689. ss << line << ": " << TK_STR(type) << " '" << raw << "'";
  2690. return ss.str();
  2691. }
  2692. };
  2693. enum Precedence {
  2694. PREC_NONE,
  2695. PREC_ASSIGNMENT, // =
  2696. PREC_COMMA, // ,
  2697. PREC_TERNARY, // ?:
  2698. PREC_LOGICAL_OR, // or
  2699. PREC_LOGICAL_AND, // and
  2700. PREC_EQUALITY, // == !=
  2701. PREC_TEST, // in is
  2702. PREC_COMPARISION, // < > <= >=
  2703. PREC_BITWISE_OR, // |
  2704. PREC_BITWISE_XOR, // ^
  2705. PREC_BITWISE_AND, // &
  2706. PREC_BITWISE_SHIFT, // << >>
  2707. PREC_TERM, // + -
  2708. PREC_FACTOR, // * / % //
  2709. PREC_UNARY, // - not
  2710. PREC_EXPONENT, // **
  2711. PREC_CALL, // ()
  2712. PREC_SUBSCRIPT, // []
  2713. PREC_ATTRIB, // .index
  2714. PREC_PRIMARY,
  2715. };
  2716. // The context of the parsing phase for the compiler.
  2717. struct Parser {
  2718. _Source src;
  2719. const char* token_start;
  2720. const char* current_char;
  2721. int current_line = 1;
  2722. Token previous, current;
  2723. std::queue<Token> nexts;
  2724. std::stack<int> indents;
  2725. int brackets_level_0 = 0;
  2726. int brackets_level_1 = 0;
  2727. int brackets_level_2 = 0;
  2728. Token nextToken(){
  2729. if(nexts.empty()) return makeErrToken();
  2730. Token t = nexts.front();
  2731. if(t.type == TK("@eof") && indents.size()>1){
  2732. nexts.pop();
  2733. indents.pop();
  2734. return Token{TK("@dedent"), token_start, 0, current_line};
  2735. }
  2736. nexts.pop();
  2737. return t;
  2738. }
  2739. char peekChar() {
  2740. return *current_char;
  2741. }
  2742. char peekNextChar() {
  2743. if (peekChar() == '\0') return '\0';
  2744. return *(current_char + 1);
  2745. }
  2746. int eatSpaces(){
  2747. int count = 0;
  2748. while (true) {
  2749. switch (peekChar()) {
  2750. case ' ': count++; break;
  2751. case '\t': count+=4; break;
  2752. default: return count;
  2753. }
  2754. eatChar();
  2755. }
  2756. }
  2757. bool eatIndentation(){
  2758. if(brackets_level_0 > 0 || brackets_level_1 > 0 || brackets_level_2 > 0) return true;
  2759. int spaces = eatSpaces();
  2760. // https://docs.python.org/3/reference/lexical_analysis.html#indentation
  2761. if(spaces > indents.top()){
  2762. indents.push(spaces);
  2763. nexts.push(Token{TK("@indent"), token_start, 0, current_line});
  2764. } else if(spaces < indents.top()){
  2765. while(spaces < indents.top()){
  2766. indents.pop();
  2767. nexts.push(Token{TK("@dedent"), token_start, 0, current_line});
  2768. }
  2769. if(spaces != indents.top()){
  2770. return false;
  2771. }
  2772. }
  2773. return true;
  2774. }
  2775. char eatChar() {
  2776. char c = peekChar();
  2777. if(c == '\n') throw std::runtime_error("eatChar() cannot consume a newline");
  2778. current_char++;
  2779. return c;
  2780. }
  2781. char eatCharIncludeNewLine() {
  2782. char c = peekChar();
  2783. current_char++;
  2784. if (c == '\n'){
  2785. current_line++;
  2786. src->lineStarts.push_back(current_char);
  2787. }
  2788. return c;
  2789. }
  2790. inline bool isNameStart(char c){
  2791. if(isalpha(c) || c=='_') return true;
  2792. if(!isascii(c)) return true;
  2793. return false;
  2794. }
  2795. int eatName() {
  2796. current_char--;
  2797. while(true){
  2798. uint8_t c = peekChar();
  2799. int u8bytes = 0;
  2800. if((c & 0b10000000) == 0b00000000) u8bytes = 1;
  2801. else if((c & 0b11100000) == 0b11000000) u8bytes = 2;
  2802. else if((c & 0b11110000) == 0b11100000) u8bytes = 3;
  2803. else if((c & 0b11111000) == 0b11110000) u8bytes = 4;
  2804. else return 1;
  2805. if(u8bytes == 1){
  2806. if(isalpha(c) || c=='_' || isdigit(c)) {
  2807. current_char++;
  2808. continue;
  2809. }else{
  2810. break;
  2811. }
  2812. }
  2813. // handle multibyte char
  2814. std::string u8str(current_char, u8bytes);
  2815. if(u8str.size() != u8bytes) return 2;
  2816. uint32_t value = 0;
  2817. for(int k=0; k < u8bytes; k++){
  2818. uint8_t b = u8str[k];
  2819. if(k==0){
  2820. if(u8bytes == 2) value = (b & 0b00011111) << 6;
  2821. else if(u8bytes == 3) value = (b & 0b00001111) << 12;
  2822. else if(u8bytes == 4) value = (b & 0b00000111) << 18;
  2823. }else{
  2824. value |= (b & 0b00111111) << (6*(u8bytes-k-1));
  2825. }
  2826. }
  2827. if(__isLoChar(value)) current_char += u8bytes;
  2828. else break;
  2829. }
  2830. int length = (int)(current_char - token_start);
  2831. if(length == 0) return 3;
  2832. std::string_view name(token_start, length);
  2833. if(src->mode == JSON_MODE){
  2834. if(name == "true"){
  2835. setNextToken(TK("True"));
  2836. } else if(name == "false"){
  2837. setNextToken(TK("False"));
  2838. } else if(name == "null"){
  2839. setNextToken(TK("None"));
  2840. } else {
  2841. return 4;
  2842. }
  2843. return 0;
  2844. }
  2845. if(__KW_MAP.count(name)){
  2846. if(name == "not"){
  2847. if(strncmp(current_char, " in", 3) == 0){
  2848. current_char += 3;
  2849. setNextToken(TK("not in"));
  2850. return 0;
  2851. }
  2852. }else if(name == "is"){
  2853. if(strncmp(current_char, " not", 4) == 0){
  2854. current_char += 4;
  2855. setNextToken(TK("is not"));
  2856. return 0;
  2857. }
  2858. }
  2859. setNextToken(__KW_MAP.at(name));
  2860. } else {
  2861. setNextToken(TK("@id"));
  2862. }
  2863. return 0;
  2864. }
  2865. void skipLineComment() {
  2866. char c;
  2867. while ((c = peekChar()) != '\0') {
  2868. if (c == '\n') return;
  2869. eatChar();
  2870. }
  2871. }
  2872. // If the current char is [c] consume it and advance char by 1 and returns
  2873. // true otherwise returns false.
  2874. bool matchChar(char c) {
  2875. if (peekChar() != c) return false;
  2876. eatCharIncludeNewLine();
  2877. return true;
  2878. }
  2879. // Returns an error token from the current position for reporting error.
  2880. Token makeErrToken() {
  2881. return Token{TK("@error"), token_start, (int)(current_char - token_start), current_line};
  2882. }
  2883. // Initialize the next token as the type.
  2884. void setNextToken(_TokenType type, PyVar value=nullptr) {
  2885. switch(type){
  2886. case TK("("): brackets_level_0++; break;
  2887. case TK(")"): brackets_level_0--; break;
  2888. case TK("["): brackets_level_1++; break;
  2889. case TK("]"): brackets_level_1--; break;
  2890. case TK("{"): brackets_level_2++; break;
  2891. case TK("}"): brackets_level_2--; break;
  2892. }
  2893. nexts.push( Token{
  2894. type,
  2895. token_start,
  2896. (int)(current_char - token_start),
  2897. current_line - ((type == TK("@eol")) ? 1 : 0),
  2898. value
  2899. });
  2900. }
  2901. void setNextTwoCharToken(char c, _TokenType one, _TokenType two) {
  2902. if (matchChar(c)) setNextToken(two);
  2903. else setNextToken(one);
  2904. }
  2905. Parser(_Source src) {
  2906. this->src = src;
  2907. this->token_start = src->source;
  2908. this->current_char = src->source;
  2909. this->nexts.push(Token{TK("@sof"), token_start, 0, current_line});
  2910. this->indents.push(0);
  2911. }
  2912. };
  2913. class Frame;
  2914. struct BasePointer {
  2915. virtual PyVar get(VM*, Frame*) const = 0;
  2916. virtual void set(VM*, Frame*, PyVar) const = 0;
  2917. virtual void del(VM*, Frame*) const = 0;
  2918. virtual ~BasePointer() = default;
  2919. };
  2920. enum NameScope {
  2921. NAME_LOCAL = 0,
  2922. NAME_GLOBAL = 1,
  2923. NAME_ATTR = 2,
  2924. };
  2925. struct NamePointer : BasePointer {
  2926. const std::pair<_Str, NameScope>* pair;
  2927. NamePointer(const std::pair<_Str, NameScope>* pair) : pair(pair) {}
  2928. PyVar get(VM* vm, Frame* frame) const;
  2929. void set(VM* vm, Frame* frame, PyVar val) const;
  2930. void del(VM* vm, Frame* frame) const;
  2931. };
  2932. struct AttrPointer : BasePointer {
  2933. mutable PyVar obj;
  2934. const NamePointer attr;
  2935. AttrPointer(PyVar obj, const NamePointer attr) : obj(obj), attr(attr) {}
  2936. PyVar get(VM* vm, Frame* frame) const;
  2937. void set(VM* vm, Frame* frame, PyVar val) const;
  2938. void del(VM* vm, Frame* frame) const;
  2939. };
  2940. struct IndexPointer : BasePointer {
  2941. mutable PyVar obj;
  2942. PyVar index;
  2943. IndexPointer(PyVar obj, PyVar index) : obj(obj), index(index) {}
  2944. PyVar get(VM* vm, Frame* frame) const;
  2945. void set(VM* vm, Frame* frame, PyVar val) const;
  2946. void del(VM* vm, Frame* frame) const;
  2947. };
  2948. struct CompoundPointer : BasePointer {
  2949. PyVarList varRefs;
  2950. CompoundPointer(const PyVarList& varRefs) : varRefs(varRefs) {}
  2951. CompoundPointer(PyVarList&& varRefs) : varRefs(std::move(varRefs)) {}
  2952. PyVar get(VM* vm, Frame* frame) const;
  2953. void set(VM* vm, Frame* frame, PyVar val) const;
  2954. void del(VM* vm, Frame* frame) const;
  2955. };
  2956. struct UserPointer : BasePointer {
  2957. VarRef p;
  2958. uint64_t f_id;
  2959. UserPointer(VarRef p, uint64_t f_id) : p(p), f_id(f_id) {}
  2960. PyVar get(VM* vm, Frame* frame) const;
  2961. void set(VM* vm, Frame* frame, PyVar val) const;
  2962. void del(VM* vm, Frame* frame) const;
  2963. };
  2964. enum Opcode {
  2965. #define OPCODE(name) OP_##name,
  2966. #ifdef OPCODE
  2967. OPCODE(NO_OP)
  2968. OPCODE(DELETED_OP)
  2969. OPCODE(LOAD_CONST)
  2970. OPCODE(IMPORT_NAME)
  2971. OPCODE(PRINT_EXPR)
  2972. OPCODE(POP_TOP)
  2973. OPCODE(CALL)
  2974. OPCODE(RETURN_VALUE)
  2975. OPCODE(BINARY_OP)
  2976. OPCODE(COMPARE_OP)
  2977. OPCODE(BITWISE_OP)
  2978. OPCODE(IS_OP)
  2979. OPCODE(CONTAINS_OP)
  2980. OPCODE(UNARY_NEGATIVE)
  2981. OPCODE(UNARY_NOT)
  2982. OPCODE(DUP_TOP)
  2983. OPCODE(BUILD_LIST)
  2984. OPCODE(BUILD_MAP)
  2985. OPCODE(BUILD_SLICE)
  2986. OPCODE(LIST_APPEND)
  2987. OPCODE(GET_ITER)
  2988. OPCODE(FOR_ITER)
  2989. OPCODE(POP_JUMP_IF_FALSE)
  2990. OPCODE(JUMP_ABSOLUTE)
  2991. OPCODE(SAFE_JUMP_ABSOLUTE)
  2992. OPCODE(JUMP_IF_TRUE_OR_POP)
  2993. OPCODE(JUMP_IF_FALSE_OR_POP)
  2994. // non-standard python opcodes
  2995. OPCODE(LOAD_NONE)
  2996. OPCODE(LOAD_TRUE)
  2997. OPCODE(LOAD_FALSE)
  2998. OPCODE(LOAD_EVAL_FN) // load eval() callable into stack
  2999. OPCODE(LOAD_LAMBDA) // LOAD_CONST + set __module__ attr
  3000. OPCODE(LOAD_ELLIPSIS)
  3001. OPCODE(ASSERT)
  3002. OPCODE(RAISE_ERROR)
  3003. OPCODE(STORE_FUNCTION)
  3004. OPCODE(BUILD_CLASS)
  3005. OPCODE(LOAD_NAME_PTR) // no arg
  3006. OPCODE(BUILD_ATTR_PTR) // arg for the name_ptr, [ptr, name_ptr] -> (*ptr).name_ptr
  3007. OPCODE(BUILD_INDEX_PTR) // no arg, [ptr, expr] -> (*ptr)[expr]
  3008. OPCODE(STORE_NAME_PTR) // arg for the name_ptr, [expr], directly store to the name_ptr without pushing it to the stack
  3009. OPCODE(STORE_PTR) // no arg, [ptr, expr] -> *ptr = expr
  3010. OPCODE(DELETE_PTR) // no arg, [ptr] -> [] -> delete ptr
  3011. OPCODE(BUILD_ATTR_PTR_PTR) // arg for the name_ptr, [ptr, name_ptr] -> (*ptr)->name_ptr
  3012. OPCODE(BUILD_SMART_TUPLE) // if all elements are pointers, build a compound pointer, otherwise build a tuple
  3013. OPCODE(BUILD_STRING) // arg is the expr count, build a string from the top of the stack
  3014. OPCODE(GOTO)
  3015. OPCODE(UNARY_REF) // for &
  3016. OPCODE(UNARY_DEREF) // for *
  3017. OPCODE(WITH_ENTER)
  3018. OPCODE(WITH_EXIT)
  3019. #endif
  3020. #undef OPCODE
  3021. };
  3022. static const char* OP_NAMES[] = {
  3023. #define OPCODE(name) #name,
  3024. #ifdef OPCODE
  3025. OPCODE(NO_OP)
  3026. OPCODE(DELETED_OP)
  3027. OPCODE(LOAD_CONST)
  3028. OPCODE(IMPORT_NAME)
  3029. OPCODE(PRINT_EXPR)
  3030. OPCODE(POP_TOP)
  3031. OPCODE(CALL)
  3032. OPCODE(RETURN_VALUE)
  3033. OPCODE(BINARY_OP)
  3034. OPCODE(COMPARE_OP)
  3035. OPCODE(BITWISE_OP)
  3036. OPCODE(IS_OP)
  3037. OPCODE(CONTAINS_OP)
  3038. OPCODE(UNARY_NEGATIVE)
  3039. OPCODE(UNARY_NOT)
  3040. OPCODE(DUP_TOP)
  3041. OPCODE(BUILD_LIST)
  3042. OPCODE(BUILD_MAP)
  3043. OPCODE(BUILD_SLICE)
  3044. OPCODE(LIST_APPEND)
  3045. OPCODE(GET_ITER)
  3046. OPCODE(FOR_ITER)
  3047. OPCODE(POP_JUMP_IF_FALSE)
  3048. OPCODE(JUMP_ABSOLUTE)
  3049. OPCODE(SAFE_JUMP_ABSOLUTE)
  3050. OPCODE(JUMP_IF_TRUE_OR_POP)
  3051. OPCODE(JUMP_IF_FALSE_OR_POP)
  3052. // non-standard python opcodes
  3053. OPCODE(LOAD_NONE)
  3054. OPCODE(LOAD_TRUE)
  3055. OPCODE(LOAD_FALSE)
  3056. OPCODE(LOAD_EVAL_FN) // load eval() callable into stack
  3057. OPCODE(LOAD_LAMBDA) // LOAD_CONST + set __module__ attr
  3058. OPCODE(LOAD_ELLIPSIS)
  3059. OPCODE(ASSERT)
  3060. OPCODE(RAISE_ERROR)
  3061. OPCODE(STORE_FUNCTION)
  3062. OPCODE(BUILD_CLASS)
  3063. OPCODE(LOAD_NAME_PTR) // no arg
  3064. OPCODE(BUILD_ATTR_PTR) // arg for the name_ptr, [ptr, name_ptr] -> (*ptr).name_ptr
  3065. OPCODE(BUILD_INDEX_PTR) // no arg, [ptr, expr] -> (*ptr)[expr]
  3066. OPCODE(STORE_NAME_PTR) // arg for the name_ptr, [expr], directly store to the name_ptr without pushing it to the stack
  3067. OPCODE(STORE_PTR) // no arg, [ptr, expr] -> *ptr = expr
  3068. OPCODE(DELETE_PTR) // no arg, [ptr] -> [] -> delete ptr
  3069. OPCODE(BUILD_ATTR_PTR_PTR) // arg for the name_ptr, [ptr, name_ptr] -> (*ptr)->name_ptr
  3070. OPCODE(BUILD_SMART_TUPLE) // if all elements are pointers, build a compound pointer, otherwise build a tuple
  3071. OPCODE(BUILD_STRING) // arg is the expr count, build a string from the top of the stack
  3072. OPCODE(GOTO)
  3073. OPCODE(UNARY_REF) // for &
  3074. OPCODE(UNARY_DEREF) // for *
  3075. OPCODE(WITH_ENTER)
  3076. OPCODE(WITH_EXIT)
  3077. #endif
  3078. #undef OPCODE
  3079. };
  3080. struct ByteCode{
  3081. uint8_t op;
  3082. int arg;
  3083. uint16_t line;
  3084. };
  3085. _Str pad(const _Str& s, const int n){
  3086. return s + std::string(n - s.size(), ' ');
  3087. }
  3088. struct CodeObject {
  3089. _Source src;
  3090. _Str name;
  3091. CodeObject(_Source src, _Str name) {
  3092. this->src = src;
  3093. this->name = name;
  3094. }
  3095. CompileMode mode() const {
  3096. return src->mode;
  3097. }
  3098. std::vector<ByteCode> co_code;
  3099. PyVarList co_consts;
  3100. std::vector<std::pair<_Str, NameScope>> co_names;
  3101. std::vector<_Str> co_global_names;
  3102. // for goto use
  3103. // note: some opcodes moves the bytecode, such as listcomp
  3104. // goto/label should be put at toplevel statements
  3105. emhash8::HashMap<_Str, int> co_labels;
  3106. void addLabel(const _Str& label){
  3107. if(co_labels.find(label) != co_labels.end()){
  3108. _Str msg = "label '" + label + "' already exists";
  3109. throw std::runtime_error(msg.c_str());
  3110. }
  3111. co_labels[label] = co_code.size();
  3112. }
  3113. int addName(_Str name, NameScope scope){
  3114. name.intern();
  3115. if(scope == NAME_LOCAL && std::find(co_global_names.begin(), co_global_names.end(), name) != co_global_names.end()){
  3116. scope = NAME_GLOBAL;
  3117. }
  3118. auto p = std::make_pair(name, scope);
  3119. for(int i=0; i<co_names.size(); i++){
  3120. if(co_names[i] == p) return i;
  3121. }
  3122. co_names.push_back(p);
  3123. return co_names.size() - 1;
  3124. }
  3125. int addConst(PyVar v){
  3126. co_consts.push_back(v);
  3127. return co_consts.size() - 1;
  3128. }
  3129. void __moveToEnd(int start, int end){
  3130. auto _start = co_code.begin() + start;
  3131. auto _end = co_code.begin() + end;
  3132. co_code.insert(co_code.end(), _start, _end);
  3133. for(int i=start; i<end; i++) co_code[i].op = OP_DELETED_OP;
  3134. }
  3135. _Str toString(){
  3136. _StrStream ss;
  3137. int prev_line = -1;
  3138. for(int i=0; i<co_code.size(); i++){
  3139. const ByteCode& byte = co_code[i];
  3140. if(byte.op == OP_NO_OP) continue;
  3141. _Str line = std::to_string(byte.line);
  3142. if(byte.line == prev_line) line = "";
  3143. else{
  3144. if(prev_line != -1) ss << "\n";
  3145. prev_line = byte.line;
  3146. }
  3147. ss << pad(line, 12) << " " << pad(std::to_string(i), 3);
  3148. ss << " " << pad(OP_NAMES[byte.op], 20) << " ";
  3149. ss << (byte.arg == -1 ? "" : std::to_string(byte.arg));
  3150. if(i != co_code.size() - 1) ss << '\n';
  3151. }
  3152. _StrStream consts;
  3153. consts << "co_consts: ";
  3154. for(int i=0; i<co_consts.size(); i++){
  3155. consts << UNION_TP_NAME(co_consts[i]);
  3156. if(i != co_consts.size() - 1) consts << ", ";
  3157. }
  3158. _StrStream names;
  3159. names << "co_names: ";
  3160. for(int i=0; i<co_names.size(); i++){
  3161. names << co_names[i].first;
  3162. if(i != co_names.size() - 1) names << ", ";
  3163. }
  3164. ss << '\n' << consts.str() << '\n' << names.str() << '\n';
  3165. // for(int i=0; i<co_consts.size(); i++){
  3166. // auto fn = std::get_if<_Func>(&co_consts[i]->_native);
  3167. // if(fn) ss << '\n' << (*fn)->code->name << ":\n" << (*fn)->code->toString();
  3168. // }
  3169. return _Str(ss.str());
  3170. }
  3171. };
  3172. class Frame {
  3173. private:
  3174. std::vector<PyVar> s_data;
  3175. int ip = 0;
  3176. std::stack<int> forLoops; // record the FOR_ITER bytecode index
  3177. public:
  3178. const CodeObject* code;
  3179. PyVar _module;
  3180. PyVarDict f_locals;
  3181. uint64_t id;
  3182. inline PyVarDict copy_f_locals(){
  3183. return f_locals;
  3184. }
  3185. inline PyVarDict& f_globals(){
  3186. return _module->attribs;
  3187. }
  3188. Frame(const CodeObject* code, PyVar _module, PyVarDict&& locals)
  3189. : code(code), _module(_module), f_locals(locals) {
  3190. static uint64_t frame_id = 1;
  3191. id = frame_id++;
  3192. }
  3193. inline const ByteCode& readCode() {
  3194. return code->co_code[ip++];
  3195. }
  3196. _Str errorSnapshot(){
  3197. int line = code->co_code[ip-1].line;
  3198. return code->src->snapshot(line);
  3199. }
  3200. inline int stackSize() const {
  3201. return s_data.size();
  3202. }
  3203. inline bool isCodeEnd() const {
  3204. return ip >= code->co_code.size();
  3205. }
  3206. inline PyVar __pop(){
  3207. if(s_data.empty()) throw std::runtime_error("s_data.empty() is true");
  3208. PyVar v = std::move(s_data.back());
  3209. s_data.pop_back();
  3210. return v;
  3211. }
  3212. inline PyVar __deref_pointer(VM*, PyVar);
  3213. inline PyVar popValue(VM* vm){
  3214. return __deref_pointer(vm, __pop());
  3215. }
  3216. inline PyVar topValue(VM* vm){
  3217. if(s_data.empty()) throw std::runtime_error("s_data.empty() is true");
  3218. return __deref_pointer(vm, s_data.back());
  3219. }
  3220. inline PyVar& __top(){
  3221. if(s_data.empty()) throw std::runtime_error("s_data.empty() is true");
  3222. return s_data.back();
  3223. }
  3224. inline PyVar __topValueN(VM* vm, int n=-1){
  3225. return __deref_pointer(vm, s_data[s_data.size() + n]);
  3226. }
  3227. inline void push(const PyVar& v){
  3228. s_data.push_back(v);
  3229. }
  3230. inline void push(PyVar&& v){
  3231. s_data.emplace_back(std::move(v));
  3232. }
  3233. void __reportForIter(){
  3234. int lastIp = ip - 1;
  3235. if(forLoops.empty()) forLoops.push(lastIp);
  3236. else{
  3237. if(forLoops.top() == lastIp) return;
  3238. if(forLoops.top() < lastIp) forLoops.push(lastIp);
  3239. else UNREACHABLE();
  3240. }
  3241. }
  3242. inline void jump(int i){
  3243. this->ip = i;
  3244. }
  3245. void safeJump(int i){
  3246. this->ip = i;
  3247. while(!forLoops.empty()){
  3248. int start = forLoops.top();
  3249. int end = code->co_code[start].arg;
  3250. if(i < start || i >= end){
  3251. //printf("%d <- [%d, %d)\n", i, start, end);
  3252. __pop(); // pop the iterator
  3253. forLoops.pop();
  3254. }else{
  3255. break;
  3256. }
  3257. }
  3258. }
  3259. pkpy::ArgList popNValuesReversed(VM* vm, int n){
  3260. pkpy::ArgList v(n);
  3261. for(int i=n-1; i>=0; i--) v._index(i) = popValue(vm);
  3262. return v;
  3263. }
  3264. pkpy::ArgList __popNReversed(int n){
  3265. pkpy::ArgList v(n);
  3266. for(int i=n-1; i>=0; i--) v._index(i) = __pop();
  3267. return v;
  3268. }
  3269. };
  3270. #define __DEF_PY_AS_C(type, ctype, ptype) \
  3271. inline ctype& Py##type##_AS_C(const PyVar& obj) { \
  3272. __checkType(obj, ptype); \
  3273. return UNION_GET(ctype, obj); \
  3274. }
  3275. #define __DEF_PY(type, ctype, ptype) \
  3276. inline PyVar Py##type(ctype value) { \
  3277. return newObject(ptype, value); \
  3278. }
  3279. #define DEF_NATIVE(type, ctype, ptype) \
  3280. __DEF_PY(type, ctype, ptype) \
  3281. __DEF_PY_AS_C(type, ctype, ptype)
  3282. class VM {
  3283. std::atomic<bool> _stopFlag = false;
  3284. std::vector<PyVar> _smallIntegers; // [-5, 256]
  3285. protected:
  3286. std::deque< pkpy::unique_ptr<Frame> > callstack;
  3287. PyVarDict _modules; // loaded modules
  3288. std::map<_Str, _Code> _lazyModules; // lazy loaded modules
  3289. PyVar __py2py_call_signal;
  3290. void _checkStopFlag(){
  3291. if(_stopFlag){
  3292. _stopFlag = false;
  3293. _error("KeyboardInterrupt", "");
  3294. }
  3295. }
  3296. PyVar runFrame(Frame* frame){
  3297. while(!frame->isCodeEnd()){
  3298. const ByteCode& byte = frame->readCode();
  3299. //printf("[%d] %s (%d)\n", frame->stackSize(), OP_NAMES[byte.op], byte.arg);
  3300. //printf("%s\n", frame->code->src->getLine(byte.line).c_str());
  3301. _checkStopFlag();
  3302. switch (byte.op)
  3303. {
  3304. case OP_NO_OP: break; // do nothing
  3305. case OP_LOAD_CONST: frame->push(frame->code->co_consts[byte.arg]); break;
  3306. case OP_LOAD_LAMBDA: {
  3307. PyVar obj = frame->code->co_consts[byte.arg];
  3308. setAttr(obj, __module__, frame->_module);
  3309. frame->push(obj);
  3310. } break;
  3311. case OP_LOAD_NAME_PTR: {
  3312. frame->push(PyPointer(NamePointer(
  3313. &(frame->code->co_names[byte.arg])
  3314. )));
  3315. } break;
  3316. case OP_STORE_NAME_PTR: {
  3317. const auto& p = frame->code->co_names[byte.arg];
  3318. NamePointer(&p).set(this, frame, frame->popValue(this));
  3319. } break;
  3320. case OP_BUILD_ATTR_PTR: {
  3321. const auto& attr = frame->code->co_names[byte.arg];
  3322. PyVar obj = frame->popValue(this);
  3323. frame->push(PyPointer(AttrPointer(obj, NamePointer(&attr))));
  3324. } break;
  3325. case OP_BUILD_ATTR_PTR_PTR: {
  3326. const auto& attr = frame->code->co_names[byte.arg];
  3327. PyVar obj = frame->popValue(this);
  3328. __checkType(obj, _tp_user_pointer);
  3329. const VarRef& var = UNION_GET(VarRef, obj);
  3330. auto p = PyPointer_AS_C(var);
  3331. frame->push(PyPointer(AttrPointer(p->get(this, frame), &attr)));
  3332. } break;
  3333. case OP_BUILD_INDEX_PTR: {
  3334. PyVar index = frame->popValue(this);
  3335. VarRef obj = frame->popValue(this);
  3336. frame->push(PyPointer(IndexPointer(obj, index)));
  3337. } break;
  3338. case OP_STORE_PTR: {
  3339. PyVar obj = frame->popValue(this);
  3340. VarRef r = frame->__pop();
  3341. PyPointer_AS_C(r)->set(this, frame, std::move(obj));
  3342. } break;
  3343. case OP_DELETE_PTR: {
  3344. VarRef r = frame->__pop();
  3345. PyPointer_AS_C(r)->del(this, frame);
  3346. } break;
  3347. case OP_BUILD_SMART_TUPLE:
  3348. {
  3349. pkpy::ArgList items = frame->__popNReversed(byte.arg);
  3350. bool done = false;
  3351. for(int i=0; i<items.size(); i++){
  3352. if(!items[i]->isType(_tp_pointer)) {
  3353. done = true;
  3354. PyVarList values(items.size());
  3355. for(int i=0; i<items.size(); i++){
  3356. values[i] = frame->__deref_pointer(this, items[i]);
  3357. }
  3358. frame->push(PyTuple(values));
  3359. break;
  3360. }
  3361. }
  3362. if(done) break;
  3363. frame->push(PyPointer(CompoundPointer(items.toList())));
  3364. } break;
  3365. case OP_BUILD_STRING:
  3366. {
  3367. pkpy::ArgList items = frame->popNValuesReversed(this, byte.arg);
  3368. _StrStream ss;
  3369. for(int i=0; i<items.size(); i++) ss << PyStr_AS_C(asStr(items[i]));
  3370. frame->push(PyStr(ss.str()));
  3371. } break;
  3372. case OP_LOAD_EVAL_FN: {
  3373. frame->push(builtins->attribs["eval"_c]);
  3374. } break;
  3375. case OP_LIST_APPEND: {
  3376. pkpy::ArgList args(2);
  3377. args[1] = frame->popValue(this); // obj
  3378. args[0] = frame->__topValueN(this, -2); // list
  3379. fastCall("append"_c, std::move(args));
  3380. } break;
  3381. case OP_STORE_FUNCTION:
  3382. {
  3383. PyVar obj = frame->popValue(this);
  3384. const _Func& fn = PyFunction_AS_C(obj);
  3385. setAttr(obj, __module__, frame->_module);
  3386. frame->f_globals()[fn->name] = obj;
  3387. } break;
  3388. case OP_BUILD_CLASS:
  3389. {
  3390. const _Str& clsName = frame->code->co_names[byte.arg].first;
  3391. PyVar clsBase = frame->popValue(this);
  3392. if(clsBase == None) clsBase = _tp_object;
  3393. __checkType(clsBase, _tp_type);
  3394. PyVar cls = newUserClassType(clsName, clsBase);
  3395. while(true){
  3396. PyVar fn = frame->popValue(this);
  3397. if(fn == None) break;
  3398. const _Func& f = PyFunction_AS_C(fn);
  3399. setAttr(fn, __module__, frame->_module);
  3400. setAttr(cls, f->name, fn);
  3401. }
  3402. frame->f_globals()[clsName] = cls;
  3403. } break;
  3404. case OP_RETURN_VALUE: return frame->popValue(this);
  3405. case OP_PRINT_EXPR:
  3406. {
  3407. const PyVar expr = frame->topValue(this);
  3408. if(expr == None) break;
  3409. *_stdout << PyStr_AS_C(asRepr(expr)) << '\n';
  3410. } break;
  3411. case OP_POP_TOP: frame->popValue(this); break;
  3412. case OP_BINARY_OP:
  3413. {
  3414. pkpy::ArgList args = frame->popNValuesReversed(this, 2);
  3415. frame->push(fastCall(BINARY_SPECIAL_METHODS[byte.arg], std::move(args)));
  3416. } break;
  3417. case OP_BITWISE_OP:
  3418. {
  3419. pkpy::ArgList args = frame->popNValuesReversed(this, 2);
  3420. frame->push(fastCall(BITWISE_SPECIAL_METHODS[byte.arg], std::move(args)));
  3421. } break;
  3422. case OP_COMPARE_OP:
  3423. {
  3424. pkpy::ArgList args = frame->popNValuesReversed(this, 2);
  3425. // for __ne__ we use the negation of __eq__
  3426. int op = byte.arg == 3 ? 2 : byte.arg;
  3427. PyVar res = fastCall(CMP_SPECIAL_METHODS[op], std::move(args));
  3428. if(op != byte.arg) res = PyBool(!PyBool_AS_C(res));
  3429. frame->push(std::move(res));
  3430. } break;
  3431. case OP_IS_OP:
  3432. {
  3433. bool ret_c = frame->popValue(this) == frame->popValue(this);
  3434. if(byte.arg == 1) ret_c = !ret_c;
  3435. frame->push(PyBool(ret_c));
  3436. } break;
  3437. case OP_CONTAINS_OP:
  3438. {
  3439. PyVar rhs = frame->popValue(this);
  3440. bool ret_c = PyBool_AS_C(call(rhs, __contains__, pkpy::oneArg(frame->popValue(this))));
  3441. if(byte.arg == 1) ret_c = !ret_c;
  3442. frame->push(PyBool(ret_c));
  3443. } break;
  3444. case OP_UNARY_NEGATIVE:
  3445. {
  3446. PyVar obj = frame->popValue(this);
  3447. frame->push(numNegated(obj));
  3448. } break;
  3449. case OP_UNARY_NOT:
  3450. {
  3451. PyVar obj = frame->popValue(this);
  3452. const PyVar& obj_bool = asBool(obj);
  3453. frame->push(PyBool(!PyBool_AS_C(obj_bool)));
  3454. } break;
  3455. case OP_UNARY_REF:
  3456. {
  3457. // _pointer to pointer
  3458. VarRef obj = frame->__pop();
  3459. __checkType(obj, _tp_pointer);
  3460. frame->push(newObject(
  3461. _tp_user_pointer,
  3462. PyPointer(UserPointer(obj, frame->id))
  3463. ));
  3464. } break;
  3465. case OP_UNARY_DEREF:
  3466. {
  3467. // pointer to _pointer
  3468. PyVar obj = frame->popValue(this);
  3469. __checkType(obj, _tp_user_pointer);
  3470. frame->push(UNION_GET(VarRef, obj));
  3471. } break;
  3472. case OP_POP_JUMP_IF_FALSE:
  3473. if(!PyBool_AS_C(asBool(frame->popValue(this)))) frame->jump(byte.arg);
  3474. break;
  3475. case OP_LOAD_NONE: frame->push(None); break;
  3476. case OP_LOAD_TRUE: frame->push(True); break;
  3477. case OP_LOAD_FALSE: frame->push(False); break;
  3478. case OP_LOAD_ELLIPSIS: frame->push(Ellipsis); break;
  3479. case OP_ASSERT:
  3480. {
  3481. PyVar expr = frame->popValue(this);
  3482. _assert(PyBool_AS_C(expr), "assertion failed");
  3483. } break;
  3484. case OP_RAISE_ERROR:
  3485. {
  3486. _Str msg = PyStr_AS_C(asRepr(frame->popValue(this)));
  3487. _Str type = PyStr_AS_C(frame->popValue(this));
  3488. _error(type, msg);
  3489. } break;
  3490. case OP_BUILD_LIST:
  3491. {
  3492. pkpy::ArgList items = frame->popNValuesReversed(this, byte.arg);
  3493. frame->push(PyList(items.toList()));
  3494. } break;
  3495. case OP_BUILD_MAP:
  3496. {
  3497. pkpy::ArgList items = frame->popNValuesReversed(this, byte.arg*2);
  3498. PyVar obj = call(builtins->attribs["dict"]);
  3499. for(int i=0; i<items.size(); i+=2){
  3500. call(obj, __setitem__, pkpy::twoArgs(items[i], items[i+1]));
  3501. }
  3502. frame->push(obj);
  3503. } break;
  3504. case OP_DUP_TOP: frame->push(frame->topValue(this)); break;
  3505. case OP_CALL:
  3506. {
  3507. int ARGC = byte.arg & 0xFFFF;
  3508. int KWARGC = (byte.arg >> 16) & 0xFFFF;
  3509. pkpy::ArgList kwargs(0);
  3510. if(KWARGC > 0) kwargs = frame->popNValuesReversed(this, KWARGC*2);
  3511. pkpy::ArgList args = frame->popNValuesReversed(this, ARGC);
  3512. PyVar callable = frame->popValue(this);
  3513. PyVar ret = call(callable, std::move(args), kwargs, true);
  3514. if(ret == __py2py_call_signal) return ret;
  3515. frame->push(std::move(ret));
  3516. } break;
  3517. case OP_JUMP_ABSOLUTE: frame->jump(byte.arg); break;
  3518. case OP_SAFE_JUMP_ABSOLUTE: frame->safeJump(byte.arg); break;
  3519. case OP_GOTO: {
  3520. PyVar obj = frame->popValue(this);
  3521. const _Str& label = PyStr_AS_C(obj);
  3522. auto it = frame->code->co_labels.find(label);
  3523. if(it == frame->code->co_labels.end()){
  3524. _error("KeyError", "label '" + label + "' not found");
  3525. }
  3526. frame->safeJump(it->second);
  3527. } break;
  3528. case OP_GET_ITER:
  3529. {
  3530. PyVar obj = frame->popValue(this);
  3531. PyVarOrNull iter_fn = getAttr(obj, __iter__, false);
  3532. if(iter_fn != nullptr){
  3533. PyVar tmp = call(iter_fn, pkpy::oneArg(obj));
  3534. VarRef var = frame->__pop();
  3535. __checkType(var, _tp_pointer);
  3536. PyIter_AS_C(tmp)->var = var;
  3537. frame->push(std::move(tmp));
  3538. }else{
  3539. typeError("'" + UNION_TP_NAME(obj) + "' object is not iterable");
  3540. }
  3541. } break;
  3542. case OP_FOR_ITER:
  3543. {
  3544. frame->__reportForIter();
  3545. // __top() must be PyIter, so no need to __deref()
  3546. auto& it = PyIter_AS_C(frame->__top());
  3547. if(it->hasNext()){
  3548. PyPointer_AS_C(it->var)->set(this, frame, it->next());
  3549. }
  3550. else{
  3551. frame->safeJump(byte.arg);
  3552. }
  3553. } break;
  3554. case OP_JUMP_IF_FALSE_OR_POP:
  3555. {
  3556. const PyVar expr = frame->topValue(this);
  3557. if(asBool(expr)==False) frame->jump(byte.arg);
  3558. else frame->popValue(this);
  3559. } break;
  3560. case OP_JUMP_IF_TRUE_OR_POP:
  3561. {
  3562. const PyVar expr = frame->topValue(this);
  3563. if(asBool(expr)==True) frame->jump(byte.arg);
  3564. else frame->popValue(this);
  3565. } break;
  3566. case OP_BUILD_SLICE:
  3567. {
  3568. PyVar stop = frame->popValue(this);
  3569. PyVar start = frame->popValue(this);
  3570. _Slice s;
  3571. if(start != None) {__checkType(start, _tp_int); s.start = (int)PyInt_AS_C(start);}
  3572. if(stop != None) {__checkType(stop, _tp_int); s.stop = (int)PyInt_AS_C(stop);}
  3573. frame->push(PySlice(s));
  3574. } break;
  3575. case OP_IMPORT_NAME:
  3576. {
  3577. const _Str& name = frame->code->co_names[byte.arg].first;
  3578. auto it = _modules.find(name);
  3579. if(it == _modules.end()){
  3580. auto it2 = _lazyModules.find(name);
  3581. if(it2 == _lazyModules.end()){
  3582. _error("ImportError", "module '" + name + "' not found");
  3583. }else{
  3584. _Code code = it2->second;
  3585. PyVar _m = newModule(name);
  3586. _exec(code, _m, {});
  3587. frame->push(_m);
  3588. _lazyModules.erase(it2);
  3589. }
  3590. }else{
  3591. frame->push(it->second);
  3592. }
  3593. } break;
  3594. case OP_WITH_ENTER: call(frame->popValue(this), "__enter__"_c); break;
  3595. case OP_WITH_EXIT: call(frame->popValue(this), "__exit__"_c); break;
  3596. default:
  3597. systemError(_Str("opcode ") + OP_NAMES[byte.op] + " is not implemented");
  3598. break;
  3599. }
  3600. }
  3601. if(frame->code->src->mode == EVAL_MODE || frame->code->src->mode == JSON_MODE){
  3602. if(frame->stackSize() != 1) systemError("stack size is not 1 in EVAL_MODE/JSON_MODE");
  3603. return frame->popValue(this);
  3604. }
  3605. if(frame->stackSize() != 0) systemError("stack not empty in EXEC_MODE");
  3606. return None;
  3607. }
  3608. public:
  3609. PyVarDict _types;
  3610. PyVar None, True, False, Ellipsis;
  3611. bool use_stdio;
  3612. std::ostream* _stdout;
  3613. std::ostream* _stderr;
  3614. PyVar builtins; // builtins module
  3615. PyVar _main; // __main__ module
  3616. int maxRecursionDepth = 1000;
  3617. VM(bool use_stdio){
  3618. this->use_stdio = use_stdio;
  3619. if(use_stdio){
  3620. std::cout.setf(std::ios::unitbuf);
  3621. std::cerr.setf(std::ios::unitbuf);
  3622. this->_stdout = &std::cout;
  3623. this->_stderr = &std::cerr;
  3624. }else{
  3625. this->_stdout = new _StrStream();
  3626. this->_stderr = new _StrStream();
  3627. }
  3628. initializeBuiltinClasses();
  3629. _smallIntegers.reserve(300);
  3630. for(_Int i=-5; i<=256; i++) _smallIntegers.push_back(newObject(_tp_int, i));
  3631. }
  3632. void keyboardInterrupt(){
  3633. _stopFlag = true;
  3634. }
  3635. void sleepForSecs(_Float sec){
  3636. _Int ms = (_Int)(sec * 1000);
  3637. for(_Int i=0; i<ms; i+=20){
  3638. _checkStopFlag();
  3639. std::this_thread::sleep_for(std::chrono::milliseconds(20));
  3640. }
  3641. }
  3642. PyVar asStr(const PyVar& obj){
  3643. PyVarOrNull str_fn = getAttr(obj, __str__, false);
  3644. if(str_fn != nullptr) return call(str_fn);
  3645. return asRepr(obj);
  3646. }
  3647. Frame* __findFrame(uint64_t up_f_id){
  3648. for(auto it=callstack.crbegin(); it!=callstack.crend(); ++it){
  3649. uint64_t f_id = it->get()->id;
  3650. if(f_id == up_f_id) return it->get();
  3651. if(f_id < up_f_id) return nullptr;
  3652. }
  3653. return nullptr;
  3654. }
  3655. Frame* topFrame(){
  3656. if(callstack.size() == 0) UNREACHABLE();
  3657. return callstack.back().get();
  3658. }
  3659. PyVar asRepr(const PyVar& obj){
  3660. if(obj->isType(_tp_type)) return PyStr("<class '" + UNION_GET(_Str, obj->attribs[__name__]) + "'>");
  3661. return call(obj, __repr__);
  3662. }
  3663. PyVar asJson(const PyVar& obj){
  3664. return call(obj, __json__);
  3665. }
  3666. const PyVar& asBool(const PyVar& obj){
  3667. if(obj == None) return False;
  3668. if(obj->_type == _tp_bool) return obj;
  3669. if(obj->_type == _tp_int) return PyBool(PyInt_AS_C(obj) != 0);
  3670. if(obj->_type == _tp_float) return PyBool(PyFloat_AS_C(obj) != 0.0);
  3671. PyVarOrNull len_fn = getAttr(obj, __len__, false);
  3672. if(len_fn != nullptr){
  3673. PyVar ret = call(len_fn);
  3674. return PyBool(PyInt_AS_C(ret) > 0);
  3675. }
  3676. return True;
  3677. }
  3678. PyVar fastCall(const _Str& name, pkpy::ArgList&& args){
  3679. const PyVar& obj = args[0];
  3680. PyObject* cls = obj->_type.get();
  3681. while(cls != None.get()) {
  3682. auto it = cls->attribs.find(name);
  3683. if(it != cls->attribs.end()) return call(it->second, std::move(args));
  3684. cls = cls->attribs[__base__].get();
  3685. }
  3686. attributeError(obj, name);
  3687. return nullptr;
  3688. }
  3689. inline PyVar call(const PyVar& _callable){
  3690. return call(_callable, pkpy::noArg(), pkpy::noArg(), false);
  3691. }
  3692. inline PyVar call(const PyVar& _callable, pkpy::ArgList args){
  3693. return call(_callable, args, pkpy::noArg(), false);
  3694. }
  3695. inline PyVar call(const PyVar& obj, const _Str& func, pkpy::ArgList args){
  3696. return call(getAttr(obj, func), args, pkpy::noArg(), false);
  3697. }
  3698. inline PyVar call(const PyVar& obj, const _Str& func){
  3699. return call(getAttr(obj, func), pkpy::noArg(), pkpy::noArg(), false);
  3700. }
  3701. PyVar call(const PyVar& _callable, pkpy::ArgList args, const pkpy::ArgList& kwargs, bool opCall){
  3702. if(_callable->isType(_tp_type)){
  3703. auto it = _callable->attribs.find(__new__);
  3704. PyVar obj;
  3705. if(it != _callable->attribs.end()){
  3706. obj = call(it->second, args, kwargs, false);
  3707. }else{
  3708. obj = newObject(_callable, (_Int)-1);
  3709. PyVarOrNull init_fn = getAttr(obj, __init__, false);
  3710. if (init_fn != nullptr) call(init_fn, args, kwargs, false);
  3711. }
  3712. return obj;
  3713. }
  3714. const PyVar* callable = &_callable;
  3715. if((*callable)->isType(_tp_bounded_method)){
  3716. auto& bm = PyBoundedMethod_AS_C((*callable));
  3717. // TODO: avoid insertion here, bad performance
  3718. pkpy::ArgList new_args(args.size()+1);
  3719. new_args[0] = bm.obj;
  3720. for(int i=0; i<args.size(); i++) new_args[i+1] = args[i];
  3721. callable = &bm.method;
  3722. args = std::move(new_args);
  3723. }
  3724. if((*callable)->isType(_tp_native_function)){
  3725. const auto& f = UNION_GET(_CppFunc, *callable);
  3726. // _CppFunc do not support kwargs
  3727. return f(this, args);
  3728. } else if((*callable)->isType(_tp_function)){
  3729. const _Func& fn = PyFunction_AS_C((*callable));
  3730. PyVarDict locals;
  3731. int i = 0;
  3732. for(const auto& name : fn->args){
  3733. if(i < args.size()){
  3734. locals.emplace(name, args[i++]);
  3735. continue;
  3736. }
  3737. typeError("missing positional argument '" + name + "'");
  3738. }
  3739. locals.insert(fn->kwArgs.begin(), fn->kwArgs.end());
  3740. std::vector<_Str> positional_overrided_keys;
  3741. if(!fn->starredArg.empty()){
  3742. // handle *args
  3743. PyVarList vargs;
  3744. while(i < args.size()) vargs.push_back(args[i++]);
  3745. locals.emplace(fn->starredArg, PyTuple(std::move(vargs)));
  3746. }else{
  3747. for(const auto& key : fn->kwArgsOrder){
  3748. if(i < args.size()){
  3749. locals[key] = args[i++];
  3750. positional_overrided_keys.push_back(key);
  3751. }else{
  3752. break;
  3753. }
  3754. }
  3755. if(i < args.size()) typeError("too many arguments");
  3756. }
  3757. for(int i=0; i<kwargs.size(); i+=2){
  3758. const _Str& key = PyStr_AS_C(kwargs[i]);
  3759. if(fn->kwArgs.find(key) == fn->kwArgs.end()){
  3760. typeError(key.__escape(true) + " is an invalid keyword argument for " + fn->name + "()");
  3761. }
  3762. const PyVar& val = kwargs[i+1];
  3763. if(!positional_overrided_keys.empty()){
  3764. auto it = std::find(positional_overrided_keys.begin(), positional_overrided_keys.end(), key);
  3765. if(it != positional_overrided_keys.end()){
  3766. typeError("multiple values for argument '" + key + "'");
  3767. }
  3768. }
  3769. locals[key] = val;
  3770. }
  3771. auto it_m = (*callable)->attribs.find(__module__);
  3772. PyVar _module = it_m != (*callable)->attribs.end() ? it_m->second : topFrame()->_module;
  3773. if(opCall){
  3774. __pushNewFrame(fn->code, _module, std::move(locals));
  3775. return __py2py_call_signal;
  3776. }
  3777. return _exec(fn->code, _module, std::move(locals));
  3778. }
  3779. typeError("'" + UNION_TP_NAME(*callable) + "' object is not callable");
  3780. return None;
  3781. }
  3782. // repl mode is only for setting `frame->id` to 0
  3783. virtual PyVarOrNull exec(const _Code& code, PyVar _module=nullptr){
  3784. if(_module == nullptr) _module = _main;
  3785. try {
  3786. return _exec(code, _module, {});
  3787. }catch (const _Error& e){
  3788. *_stderr << e.what() << '\n';
  3789. }catch (const std::exception& e) {
  3790. auto re = RuntimeError("UnexpectedError", e.what(), _cleanErrorAndGetSnapshots());
  3791. *_stderr << re.what() << '\n';
  3792. }
  3793. return nullptr;
  3794. }
  3795. virtual void execAsync(const _Code& code) {
  3796. exec(code);
  3797. }
  3798. Frame* __pushNewFrame(const _Code& code, PyVar _module, PyVarDict&& locals){
  3799. if(code == nullptr) UNREACHABLE();
  3800. if(callstack.size() > maxRecursionDepth){
  3801. throw RuntimeError("RecursionError", "maximum recursion depth exceeded", _cleanErrorAndGetSnapshots());
  3802. }
  3803. Frame* frame = new Frame(code.get(), _module, std::move(locals));
  3804. callstack.emplace_back(pkpy::unique_ptr<Frame>(frame));
  3805. return frame;
  3806. }
  3807. PyVar _exec(const _Code& code, PyVar _module, PyVarDict&& locals){
  3808. Frame* frame = __pushNewFrame(code, _module, std::move(locals));
  3809. if(code->mode() == SINGLE_MODE) frame->id = 0;
  3810. Frame* frameBase = frame;
  3811. PyVar ret = nullptr;
  3812. while(true){
  3813. ret = runFrame(frame);
  3814. if(ret != __py2py_call_signal){
  3815. if(frame == frameBase){ // [ frameBase<- ]
  3816. break;
  3817. }else{
  3818. callstack.pop_back();
  3819. frame = callstack.back().get();
  3820. frame->push(ret);
  3821. }
  3822. }else{
  3823. frame = callstack.back().get(); // [ frameBase, newFrame<- ]
  3824. }
  3825. }
  3826. callstack.pop_back();
  3827. return ret;
  3828. }
  3829. PyVar newUserClassType(_Str name, PyVar base){
  3830. PyVar obj = newClassType(name, base);
  3831. setAttr(obj, __name__, PyStr(name));
  3832. _types.erase(name);
  3833. return obj;
  3834. }
  3835. PyVar newClassType(_Str name, PyVar base=nullptr) {
  3836. if(base == nullptr) base = _tp_object;
  3837. PyVar obj = pkpy::make_shared<PyObject, Py_<_Int>>((_Int)0, _tp_type);
  3838. setAttr(obj, __base__, base);
  3839. _types[name] = obj;
  3840. return obj;
  3841. }
  3842. template<typename T>
  3843. inline PyVar newObject(PyVar type, T _value) {
  3844. __checkType(type, _tp_type);
  3845. return pkpy::make_shared<PyObject, Py_<T>>(_value, type);
  3846. }
  3847. PyVar newModule(_Str name) {
  3848. PyVar obj = newObject(_tp_module, (_Int)-2);
  3849. setAttr(obj, __name__, PyStr(name));
  3850. _modules[name] = obj;
  3851. return obj;
  3852. }
  3853. void addLazyModule(_Str name, _Code code){
  3854. _lazyModules[name] = code;
  3855. }
  3856. PyVarOrNull getAttr(const PyVar& obj, const _Str& name, bool throw_err=true) {
  3857. PyVarDict::iterator it;
  3858. PyObject* cls;
  3859. if(obj->isType(_tp_super)){
  3860. const PyVar* root = &obj;
  3861. int depth = 1;
  3862. while(true){
  3863. root = &UNION_GET(PyVar, *root);
  3864. if(!(*root)->isType(_tp_super)) break;
  3865. depth++;
  3866. }
  3867. cls = (*root)->_type.get();
  3868. for(int i=0; i<depth; i++) cls = cls->attribs[__base__].get();
  3869. it = (*root)->attribs.find(name);
  3870. if(it != (*root)->attribs.end()) return it->second;
  3871. }else{
  3872. it = obj->attribs.find(name);
  3873. if(it != obj->attribs.end()) return it->second;
  3874. cls = obj->_type.get();
  3875. }
  3876. while(cls != None.get()) {
  3877. it = cls->attribs.find(name);
  3878. if(it != cls->attribs.end()){
  3879. PyVar valueFromCls = it->second;
  3880. if(valueFromCls->isType(_tp_function) || valueFromCls->isType(_tp_native_function)){
  3881. return PyBoundedMethod({obj, std::move(valueFromCls)});
  3882. }else{
  3883. return valueFromCls;
  3884. }
  3885. }
  3886. cls = cls->attribs[__base__].get();
  3887. }
  3888. if(throw_err) attributeError(obj, name);
  3889. return nullptr;
  3890. }
  3891. void setAttr(PyVar& obj, const _Str& name, const PyVar& value) {
  3892. if(obj->isType(_tp_super)){
  3893. const PyVar* root = &obj;
  3894. while(true){
  3895. root = &UNION_GET(PyVar, *root);
  3896. if(!(*root)->isType(_tp_super)) break;
  3897. }
  3898. (*root)->attribs[name] = value;
  3899. }else{
  3900. obj->attribs[name] = value;
  3901. }
  3902. }
  3903. void setAttr(PyVar& obj, const _Str& name, PyVar&& value) {
  3904. if(obj->isType(_tp_super)){
  3905. const PyVar* root = &obj;
  3906. while(true){
  3907. root = &UNION_GET(PyVar, *root);
  3908. if(!(*root)->isType(_tp_super)) break;
  3909. }
  3910. (*root)->attribs[name] = std::move(value);
  3911. }else{
  3912. obj->attribs[name] = std::move(value);
  3913. }
  3914. }
  3915. void bindMethod(_Str typeName, _Str funcName, _CppFunc fn) {
  3916. funcName.intern();
  3917. PyVar type = _types[typeName];
  3918. PyVar func = PyNativeFunction(fn);
  3919. setAttr(type, funcName, func);
  3920. }
  3921. void bindMethodMulti(std::vector<_Str> typeNames, _Str funcName, _CppFunc fn) {
  3922. for(auto& typeName : typeNames){
  3923. bindMethod(typeName, funcName, fn);
  3924. }
  3925. }
  3926. void bindBuiltinFunc(_Str funcName, _CppFunc fn) {
  3927. bindFunc(builtins, funcName, fn);
  3928. }
  3929. void bindFunc(PyVar module, _Str funcName, _CppFunc fn) {
  3930. funcName.intern();
  3931. __checkType(module, _tp_module);
  3932. PyVar func = PyNativeFunction(fn);
  3933. setAttr(module, funcName, func);
  3934. }
  3935. bool isInstance(PyVar obj, PyVar type){
  3936. __checkType(type, _tp_type);
  3937. PyObject* t = obj->_type.get();
  3938. while (t != None.get()){
  3939. if (t == type.get()) return true;
  3940. t = t->attribs[__base__].get();
  3941. }
  3942. return false;
  3943. }
  3944. inline bool isIntOrFloat(const PyVar& obj){
  3945. return obj->isType(_tp_int) || obj->isType(_tp_float);
  3946. }
  3947. inline bool isIntOrFloat(const PyVar& obj1, const PyVar& obj2){
  3948. return isIntOrFloat(obj1) && isIntOrFloat(obj2);
  3949. }
  3950. inline _Float numToFloat(const PyVar& obj){
  3951. if (obj->isType(_tp_int)){
  3952. return (_Float)PyInt_AS_C(obj);
  3953. }else if(obj->isType(_tp_float)){
  3954. return PyFloat_AS_C(obj);
  3955. }
  3956. UNREACHABLE();
  3957. }
  3958. PyVar numNegated(const PyVar& obj){
  3959. if (obj->isType(_tp_int)){
  3960. return PyInt(-PyInt_AS_C(obj));
  3961. }else if(obj->isType(_tp_float)){
  3962. return PyFloat(-PyFloat_AS_C(obj));
  3963. }
  3964. typeError("unsupported operand type(s) for -");
  3965. return nullptr;
  3966. }
  3967. int normalizedIndex(int index, int size){
  3968. if(index < 0) index += size;
  3969. if(index < 0 || index >= size){
  3970. indexError("index out of range, " + std::to_string(index) + " not in [0, " + std::to_string(size) + ")");
  3971. }
  3972. return index;
  3973. }
  3974. // for quick access
  3975. PyVar _tp_object, _tp_type, _tp_int, _tp_float, _tp_bool, _tp_str;
  3976. PyVar _tp_list, _tp_tuple;
  3977. PyVar _tp_function, _tp_native_function, _tp_native_iterator, _tp_bounded_method;
  3978. PyVar _tp_slice, _tp_range, _tp_module, _tp_pointer;
  3979. PyVar _tp_user_pointer, _tp_super;
  3980. template<typename P>
  3981. inline VarRef PyPointer(P value) {
  3982. static_assert(std::is_base_of<BasePointer, P>::value, "P should derive from BasePointer");
  3983. return newObject(_tp_pointer, value);
  3984. }
  3985. inline const BasePointer* PyPointer_AS_C(const PyVar& obj)
  3986. {
  3987. if(!obj->isType(_tp_pointer)) typeError("expected an l-value");
  3988. return (const BasePointer*)(obj->value());
  3989. }
  3990. __DEF_PY_AS_C(Int, _Int, _tp_int)
  3991. inline PyVar PyInt(_Int value) {
  3992. if(value >= -5 && value <= 256) return _smallIntegers[value + 5];
  3993. return newObject(_tp_int, value);
  3994. }
  3995. DEF_NATIVE(Float, _Float, _tp_float)
  3996. DEF_NATIVE(Str, _Str, _tp_str)
  3997. DEF_NATIVE(List, PyVarList, _tp_list)
  3998. DEF_NATIVE(Tuple, PyVarList, _tp_tuple)
  3999. DEF_NATIVE(Function, _Func, _tp_function)
  4000. DEF_NATIVE(NativeFunction, _CppFunc, _tp_native_function)
  4001. DEF_NATIVE(Iter, _Iterator, _tp_native_iterator)
  4002. DEF_NATIVE(BoundedMethod, _BoundedMethod, _tp_bounded_method)
  4003. DEF_NATIVE(Range, _Range, _tp_range)
  4004. DEF_NATIVE(Slice, _Slice, _tp_slice)
  4005. // there is only one True/False, so no need to copy them!
  4006. inline bool PyBool_AS_C(const PyVar& obj){return obj == True;}
  4007. inline const PyVar& PyBool(bool value){return value ? True : False;}
  4008. void initializeBuiltinClasses(){
  4009. _tp_object = pkpy::make_shared<PyObject, Py_<_Int>>((_Int)0, nullptr);
  4010. _tp_type = pkpy::make_shared<PyObject, Py_<_Int>>((_Int)0, nullptr);
  4011. _types["object"] = _tp_object;
  4012. _types["type"] = _tp_type;
  4013. _tp_bool = newClassType("bool");
  4014. _tp_int = newClassType("int");
  4015. _tp_float = newClassType("float");
  4016. _tp_str = newClassType("str");
  4017. _tp_list = newClassType("list");
  4018. _tp_tuple = newClassType("tuple");
  4019. _tp_slice = newClassType("slice");
  4020. _tp_range = newClassType("range");
  4021. _tp_module = newClassType("module");
  4022. _tp_pointer = newClassType("_pointer");
  4023. _tp_user_pointer = newClassType("pointer");
  4024. newClassType("NoneType");
  4025. newClassType("ellipsis");
  4026. _tp_function = newClassType("function");
  4027. _tp_native_function = newClassType("_native_function");
  4028. _tp_native_iterator = newClassType("_native_iterator");
  4029. _tp_bounded_method = newClassType("_bounded_method");
  4030. _tp_super = newClassType("super");
  4031. this->None = newObject(_types["NoneType"], (_Int)0);
  4032. this->Ellipsis = newObject(_types["ellipsis"], (_Int)0);
  4033. this->True = newObject(_tp_bool, true);
  4034. this->False = newObject(_tp_bool, false);
  4035. this->builtins = newModule("builtins");
  4036. this->_main = newModule("__main__"_c);
  4037. setAttr(_tp_type, __base__, _tp_object);
  4038. _tp_type->_type = _tp_type;
  4039. setAttr(_tp_object, __base__, None);
  4040. _tp_object->_type = _tp_type;
  4041. for (auto& [name, type] : _types) {
  4042. setAttr(type, __name__, PyStr(name));
  4043. }
  4044. this->__py2py_call_signal = newObject(_tp_object, (_Int)7);
  4045. std::vector<_Str> publicTypes = {"type", "object", "bool", "int", "float", "str", "list", "tuple", "range"};
  4046. for (auto& name : publicTypes) {
  4047. setAttr(builtins, name, _types[name]);
  4048. }
  4049. }
  4050. _Int hash(const PyVar& obj){
  4051. if (obj->isType(_tp_int)) return PyInt_AS_C(obj);
  4052. if (obj->isType(_tp_bool)) return PyBool_AS_C(obj) ? 1 : 0;
  4053. if (obj->isType(_tp_float)){
  4054. _Float val = PyFloat_AS_C(obj);
  4055. return (_Int)std::hash<_Float>()(val);
  4056. }
  4057. if (obj->isType(_tp_str)) return PyStr_AS_C(obj).hash();
  4058. if (obj->isType(_tp_type)) return (_Int)obj.get();
  4059. if (obj->isType(_tp_tuple)) {
  4060. _Int x = 1000003;
  4061. for (const auto& item : PyTuple_AS_C(obj)) {
  4062. _Int y = hash(item);
  4063. // this is recommended by Github Copilot
  4064. // i am not sure whether it is a good idea
  4065. x = x ^ (y + 0x9e3779b9 + (x << 6) + (x >> 2));
  4066. }
  4067. return x;
  4068. }
  4069. typeError("unhashable type: " + UNION_TP_NAME(obj));
  4070. return 0;
  4071. }
  4072. /***** Error Reporter *****/
  4073. private:
  4074. void _error(const _Str& name, const _Str& msg){
  4075. throw RuntimeError(name, msg, _cleanErrorAndGetSnapshots());
  4076. }
  4077. std::stack<_Str> _cleanErrorAndGetSnapshots(){
  4078. std::stack<_Str> snapshots;
  4079. while (!callstack.empty()){
  4080. if(snapshots.size() < 8){
  4081. snapshots.push(callstack.back()->errorSnapshot());
  4082. }
  4083. callstack.pop_back();
  4084. }
  4085. return snapshots;
  4086. }
  4087. public:
  4088. void typeError(const _Str& msg){
  4089. _error("TypeError", msg);
  4090. }
  4091. void systemError(const _Str& msg){
  4092. _error("SystemError", msg);
  4093. }
  4094. void nullPointerError(){
  4095. _error("NullPointerError", "pointer is invalid");
  4096. }
  4097. void zeroDivisionError(){
  4098. _error("ZeroDivisionError", "division by zero");
  4099. }
  4100. void indexError(const _Str& msg){
  4101. _error("IndexError", msg);
  4102. }
  4103. void valueError(const _Str& msg){
  4104. _error("ValueError", msg);
  4105. }
  4106. void nameError(const _Str& name){
  4107. _error("NameError", "name '" + name + "' is not defined");
  4108. }
  4109. void attributeError(PyVar obj, const _Str& name){
  4110. _error("AttributeError", "type '" + UNION_TP_NAME(obj) + "' has no attribute '" + name + "'");
  4111. }
  4112. inline void __checkType(const PyVar& obj, const PyVar& type){
  4113. #ifndef PKPY_NO_TYPE_CHECK
  4114. if(!obj->isType(type)) typeError("expected '" + UNION_TP_NAME(type) + "', but got '" + UNION_TP_NAME(obj) + "'");
  4115. #endif
  4116. }
  4117. inline void __checkArgSize(const pkpy::ArgList& args, int size, bool method=false){
  4118. if(args.size() == size) return;
  4119. if(method) typeError(args.size()>size ? "too many arguments" : "too few arguments");
  4120. else typeError("expected " + std::to_string(size) + " arguments, but got " + std::to_string(args.size()));
  4121. }
  4122. void _assert(bool val, const _Str& msg){
  4123. if (!val) _error("AssertionError", msg);
  4124. }
  4125. virtual ~VM() {
  4126. if(!use_stdio){
  4127. delete _stdout;
  4128. delete _stderr;
  4129. }
  4130. }
  4131. };
  4132. /***** Pointers' Impl *****/
  4133. PyVar NamePointer::get(VM* vm, Frame* frame) const{
  4134. auto it = frame->f_locals.find(pair->first);
  4135. if(it != frame->f_locals.end()) return it->second;
  4136. it = frame->f_globals().find(pair->first);
  4137. if(it != frame->f_globals().end()) return it->second;
  4138. it = vm->builtins->attribs.find(pair->first);
  4139. if(it != vm->builtins->attribs.end()) return it->second;
  4140. vm->nameError(pair->first);
  4141. return nullptr;
  4142. }
  4143. void NamePointer::set(VM* vm, Frame* frame, PyVar val) const{
  4144. switch(pair->second) {
  4145. case NAME_LOCAL: frame->f_locals[pair->first] = std::move(val); break;
  4146. case NAME_GLOBAL:
  4147. {
  4148. if(frame->f_locals.count(pair->first) > 0){
  4149. frame->f_locals[pair->first] = std::move(val);
  4150. }else{
  4151. frame->f_globals()[pair->first] = std::move(val);
  4152. }
  4153. } break;
  4154. default: UNREACHABLE();
  4155. }
  4156. }
  4157. void NamePointer::del(VM* vm, Frame* frame) const{
  4158. switch(pair->second) {
  4159. case NAME_LOCAL: {
  4160. if(frame->f_locals.count(pair->first) > 0){
  4161. frame->f_locals.erase(pair->first);
  4162. }else{
  4163. vm->nameError(pair->first);
  4164. }
  4165. } break;
  4166. case NAME_GLOBAL:
  4167. {
  4168. if(frame->f_locals.count(pair->first) > 0){
  4169. frame->f_locals.erase(pair->first);
  4170. }else{
  4171. if(frame->f_globals().count(pair->first) > 0){
  4172. frame->f_globals().erase(pair->first);
  4173. }else{
  4174. vm->nameError(pair->first);
  4175. }
  4176. }
  4177. } break;
  4178. default: UNREACHABLE();
  4179. }
  4180. }
  4181. PyVar AttrPointer::get(VM* vm, Frame* frame) const{
  4182. return vm->getAttr(obj, attr.pair->first);
  4183. }
  4184. void AttrPointer::set(VM* vm, Frame* frame, PyVar val) const{
  4185. vm->setAttr(obj, attr.pair->first, val);
  4186. }
  4187. void AttrPointer::del(VM* vm, Frame* frame) const{
  4188. vm->typeError("cannot delete attribute");
  4189. }
  4190. PyVar IndexPointer::get(VM* vm, Frame* frame) const{
  4191. return vm->call(obj, __getitem__, pkpy::oneArg(index));
  4192. }
  4193. void IndexPointer::set(VM* vm, Frame* frame, PyVar val) const{
  4194. vm->call(obj, __setitem__, pkpy::twoArgs(index, val));
  4195. }
  4196. void IndexPointer::del(VM* vm, Frame* frame) const{
  4197. vm->call(obj, __delitem__, pkpy::oneArg(index));
  4198. }
  4199. PyVar CompoundPointer::get(VM* vm, Frame* frame) const{
  4200. PyVarList args(varRefs.size());
  4201. for (int i = 0; i < varRefs.size(); i++) {
  4202. args[i] = vm->PyPointer_AS_C(varRefs[i])->get(vm, frame);
  4203. }
  4204. return vm->PyTuple(args);
  4205. }
  4206. void CompoundPointer::set(VM* vm, Frame* frame, PyVar val) const{
  4207. if(!val->isType(vm->_tp_tuple) && !val->isType(vm->_tp_list)){
  4208. vm->typeError("only tuple or list can be unpacked");
  4209. }
  4210. const PyVarList& args = UNION_GET(PyVarList, val);
  4211. if(args.size() > varRefs.size()) vm->valueError("too many values to unpack");
  4212. if(args.size() < varRefs.size()) vm->valueError("not enough values to unpack");
  4213. for (int i = 0; i < varRefs.size(); i++) {
  4214. vm->PyPointer_AS_C(varRefs[i])->set(vm, frame, args[i]);
  4215. }
  4216. }
  4217. void CompoundPointer::del(VM* vm, Frame* frame) const{
  4218. for (auto& r : varRefs) vm->PyPointer_AS_C(r)->del(vm, frame);
  4219. }
  4220. PyVar UserPointer::get(VM* vm, Frame* frame) const{
  4221. frame = vm->__findFrame(f_id);
  4222. if(frame == nullptr) vm->nullPointerError();
  4223. return vm->PyPointer_AS_C(p)->get(vm, frame);
  4224. }
  4225. void UserPointer::set(VM* vm, Frame* frame, PyVar val) const{
  4226. frame = vm->__findFrame(f_id);
  4227. if(frame == nullptr) vm->nullPointerError();
  4228. vm->PyPointer_AS_C(p)->set(vm, frame, val);
  4229. }
  4230. void UserPointer::del(VM* vm, Frame* frame) const{
  4231. vm->typeError("delete is unsupported");
  4232. }
  4233. /***** Frame's Impl *****/
  4234. inline PyVar Frame::__deref_pointer(VM* vm, PyVar v){
  4235. if(v->isType(vm->_tp_pointer)) return vm->PyPointer_AS_C(v)->get(vm, this);
  4236. return v;
  4237. }
  4238. /***** Iterators' Impl *****/
  4239. PyVar RangeIterator::next(){
  4240. PyVar val = vm->PyInt(current);
  4241. current += r.step;
  4242. return val;
  4243. }
  4244. PyVar StringIterator::next(){
  4245. return vm->PyStr(str.u8_getitem(index++));
  4246. }
  4247. enum ThreadState {
  4248. THREAD_READY,
  4249. THREAD_RUNNING,
  4250. THREAD_SUSPENDED,
  4251. THREAD_FINISHED
  4252. };
  4253. class ThreadedVM : public VM {
  4254. std::thread* _thread = nullptr;
  4255. std::atomic<ThreadState> _state = THREAD_READY;
  4256. _Str _sharedStr = ""_c;
  4257. void __deleteThread(){
  4258. if(_thread != nullptr){
  4259. terminate();
  4260. _thread->join();
  4261. delete _thread;
  4262. _thread = nullptr;
  4263. }
  4264. }
  4265. public:
  4266. ThreadedVM(bool use_stdio) : VM(use_stdio) {
  4267. bindBuiltinFunc("__string_channel_call", [](VM* vm, const pkpy::ArgList& args){
  4268. vm->__checkArgSize(args, 1);
  4269. _Str data = vm->PyStr_AS_C(args[0]);
  4270. ThreadedVM* tvm = (ThreadedVM*)vm;
  4271. tvm->_sharedStr = data;
  4272. tvm->suspend();
  4273. return tvm->PyStr(tvm->readJsonRpcRequest());
  4274. });
  4275. }
  4276. void terminate(){
  4277. if(_state == THREAD_RUNNING || _state == THREAD_SUSPENDED){
  4278. keyboardInterrupt();
  4279. while(_state != THREAD_FINISHED);
  4280. }
  4281. }
  4282. void suspend(){
  4283. if(_state != THREAD_RUNNING) UNREACHABLE();
  4284. _state = THREAD_SUSPENDED;
  4285. while(_state == THREAD_SUSPENDED) _checkStopFlag();
  4286. }
  4287. _Str readJsonRpcRequest(){
  4288. _Str copy = _sharedStr;
  4289. _sharedStr = ""_c;
  4290. return copy;
  4291. }
  4292. /***** For outer use *****/
  4293. ThreadState getState(){
  4294. return _state;
  4295. }
  4296. void writeJsonrpcResponse(const char* value){
  4297. if(_state != THREAD_SUSPENDED) UNREACHABLE();
  4298. _sharedStr = _Str(value);
  4299. _state = THREAD_RUNNING;
  4300. }
  4301. void execAsync(const _Code& code) override {
  4302. if(_state != THREAD_READY) UNREACHABLE();
  4303. __deleteThread();
  4304. _thread = new std::thread([this, code](){
  4305. this->_state = THREAD_RUNNING;
  4306. VM::exec(code);
  4307. this->_state = THREAD_FINISHED;
  4308. });
  4309. }
  4310. PyVarOrNull exec(const _Code& code, PyVar _module = nullptr) override {
  4311. if(_state == THREAD_READY) return VM::exec(code, _module);
  4312. auto callstackBackup = std::move(callstack);
  4313. callstack.clear();
  4314. PyVarOrNull ret = VM::exec(code, _module);
  4315. callstack = std::move(callstackBackup);
  4316. return ret;
  4317. }
  4318. void resetState(){
  4319. if(this->_state != THREAD_FINISHED) return;
  4320. this->_state = THREAD_READY;
  4321. }
  4322. ~ThreadedVM(){
  4323. __deleteThread();
  4324. }
  4325. };
  4326. class Compiler;
  4327. typedef void (Compiler::*GrammarFn)();
  4328. typedef void (Compiler::*CompilerAction)();
  4329. struct GrammarRule{
  4330. GrammarFn prefix;
  4331. GrammarFn infix;
  4332. Precedence precedence;
  4333. };
  4334. struct Loop {
  4335. int start;
  4336. std::vector<int> breaks;
  4337. Loop(int start) : start(start) {}
  4338. };
  4339. class Compiler {
  4340. public:
  4341. pkpy::unique_ptr<Parser> parser;
  4342. std::stack<_Code> codes;
  4343. std::stack<Loop> loops;
  4344. bool isCompilingClass = false;
  4345. VM* vm;
  4346. emhash8::HashMap<_TokenType, GrammarRule> rules;
  4347. _Code getCode() {
  4348. return codes.top();
  4349. }
  4350. CompileMode mode() {
  4351. return parser->src->mode;
  4352. }
  4353. Loop& getLoop() {
  4354. return loops.top();
  4355. }
  4356. Compiler(VM* vm, const char* source, _Str filename, CompileMode mode){
  4357. this->vm = vm;
  4358. this->parser = pkpy::make_unique<Parser>(
  4359. pkpy::make_shared<SourceMetadata>(source, filename, mode)
  4360. );
  4361. // http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/
  4362. #define METHOD(name) &Compiler::name
  4363. #define NO_INFIX nullptr, PREC_NONE
  4364. for(_TokenType i=0; i<__TOKENS_LEN; i++) rules[i] = { nullptr, NO_INFIX };
  4365. rules[TK(".")] = { nullptr, METHOD(exprAttrib), PREC_ATTRIB };
  4366. rules[TK("->")] = { nullptr, METHOD(exprAttribPtr), PREC_ATTRIB };
  4367. rules[TK("(")] = { METHOD(exprGrouping), METHOD(exprCall), PREC_CALL };
  4368. rules[TK("[")] = { METHOD(exprList), METHOD(exprSubscript), PREC_SUBSCRIPT };
  4369. rules[TK("{")] = { METHOD(exprMap), NO_INFIX };
  4370. rules[TK("%")] = { nullptr, METHOD(exprBinaryOp), PREC_FACTOR };
  4371. rules[TK("+")] = { nullptr, METHOD(exprBinaryOp), PREC_TERM };
  4372. rules[TK("-")] = { METHOD(exprUnaryOp), METHOD(exprBinaryOp), PREC_TERM };
  4373. rules[TK("*")] = { METHOD(exprUnaryOp), METHOD(exprBinaryOp), PREC_FACTOR };
  4374. rules[TK("/")] = { nullptr, METHOD(exprBinaryOp), PREC_FACTOR };
  4375. rules[TK("//")] = { nullptr, METHOD(exprBinaryOp), PREC_FACTOR };
  4376. rules[TK("**")] = { nullptr, METHOD(exprBinaryOp), PREC_EXPONENT };
  4377. rules[TK(">")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION };
  4378. rules[TK("<")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION };
  4379. rules[TK("==")] = { nullptr, METHOD(exprBinaryOp), PREC_EQUALITY };
  4380. rules[TK("!=")] = { nullptr, METHOD(exprBinaryOp), PREC_EQUALITY };
  4381. rules[TK(">=")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION };
  4382. rules[TK("<=")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION };
  4383. rules[TK("in")] = { nullptr, METHOD(exprBinaryOp), PREC_TEST };
  4384. rules[TK("is")] = { nullptr, METHOD(exprBinaryOp), PREC_TEST };
  4385. rules[TK("not in")] = { nullptr, METHOD(exprBinaryOp), PREC_TEST };
  4386. rules[TK("is not")] = { nullptr, METHOD(exprBinaryOp), PREC_TEST };
  4387. rules[TK("and") ] = { nullptr, METHOD(exprAnd), PREC_LOGICAL_AND };
  4388. rules[TK("or")] = { nullptr, METHOD(exprOr), PREC_LOGICAL_OR };
  4389. rules[TK("not")] = { METHOD(exprUnaryOp), nullptr, PREC_UNARY };
  4390. rules[TK("True")] = { METHOD(exprValue), NO_INFIX };
  4391. rules[TK("False")] = { METHOD(exprValue), NO_INFIX };
  4392. rules[TK("lambda")] = { METHOD(exprLambda), NO_INFIX };
  4393. rules[TK("None")] = { METHOD(exprValue), NO_INFIX };
  4394. rules[TK("...")] = { METHOD(exprValue), NO_INFIX };
  4395. rules[TK("@id")] = { METHOD(exprName), NO_INFIX };
  4396. rules[TK("@num")] = { METHOD(exprLiteral), NO_INFIX };
  4397. rules[TK("@str")] = { METHOD(exprLiteral), NO_INFIX };
  4398. rules[TK("@fstr")] = { METHOD(exprFString), NO_INFIX };
  4399. rules[TK("?")] = { nullptr, METHOD(exprTernary), PREC_TERNARY };
  4400. rules[TK("=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4401. rules[TK("+=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4402. rules[TK("-=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4403. rules[TK("*=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4404. rules[TK("/=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4405. rules[TK("//=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT };
  4406. rules[TK(",")] = { nullptr, METHOD(exprComma), PREC_COMMA };
  4407. rules[TK("<<")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_SHIFT };
  4408. rules[TK(">>")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_SHIFT };
  4409. rules[TK("&")] = { METHOD(exprUnaryOp), METHOD(exprBinaryOp), PREC_BITWISE_AND };
  4410. rules[TK("|")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_OR };
  4411. rules[TK("^")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_XOR };
  4412. #undef METHOD
  4413. #undef NO_INFIX
  4414. #define EXPR() parsePrecedence(PREC_TERNARY) // no '=' and ',' just a simple expression
  4415. #define EXPR_TUPLE() parsePrecedence(PREC_COMMA) // no '=', but ',' is allowed
  4416. #define EXPR_ANY() parsePrecedence(PREC_ASSIGNMENT)
  4417. }
  4418. _Str eatStringUntil(char quote) {
  4419. std::vector<char> buff;
  4420. while (true) {
  4421. char c = parser->eatCharIncludeNewLine();
  4422. if (c == quote) break;
  4423. if (c == '\0' || c == '\n') syntaxError("EOL while scanning string literal");
  4424. if (c == '\\') {
  4425. switch (parser->eatCharIncludeNewLine()) {
  4426. case '"': buff.push_back('"'); break;
  4427. case '\'': buff.push_back('\''); break;
  4428. case '\\': buff.push_back('\\'); break;
  4429. case 'n': buff.push_back('\n'); break;
  4430. case 'r': buff.push_back('\r'); break;
  4431. case 't': buff.push_back('\t'); break;
  4432. case '\n': case '\r': break;
  4433. default: syntaxError("invalid escape character");
  4434. }
  4435. } else {
  4436. buff.push_back(c);
  4437. }
  4438. }
  4439. return _Str(buff.data(), buff.size());
  4440. }
  4441. void eatString(char quote, bool fstr) {
  4442. _Str s = eatStringUntil(quote);
  4443. if(fstr){
  4444. parser->setNextToken(TK("@fstr"), vm->PyStr(s));
  4445. }else{
  4446. parser->setNextToken(TK("@str"), vm->PyStr(s));
  4447. }
  4448. }
  4449. void eatNumber() {
  4450. static const std::regex pattern("^(0x)?[0-9a-fA-F]+(\\.[0-9]+)?");
  4451. std::smatch m;
  4452. const char* i = parser->token_start;
  4453. while(*i != '\n' && *i != '\0') i++;
  4454. std::string s = std::string(parser->token_start, i);
  4455. try{
  4456. if (std::regex_search(s, m, pattern)) {
  4457. // here is m.length()-1, since the first char is eaten by lexToken()
  4458. for(int j=0; j<m.length()-1; j++) parser->eatChar();
  4459. int base = 10;
  4460. size_t size;
  4461. if (m[1].matched) base = 16;
  4462. if (m[2].matched) {
  4463. if(base == 16) syntaxError("hex literal should not contain a dot");
  4464. parser->setNextToken(TK("@num"), vm->PyFloat(std::stod(m[0], &size)));
  4465. } else {
  4466. parser->setNextToken(TK("@num"), vm->PyInt(std::stoll(m[0], &size, base)));
  4467. }
  4468. if (size != m.length()) throw std::runtime_error("length mismatch");
  4469. }
  4470. }catch(std::exception& _){
  4471. syntaxError("invalid number literal");
  4472. }
  4473. }
  4474. // Lex the next token and set it as the next token.
  4475. void lexToken() {
  4476. parser->previous = parser->current;
  4477. parser->current = parser->nextToken();
  4478. //_Str _info = parser->current.info(); printf("%s\n", (const char*)_info);
  4479. while (parser->peekChar() != '\0') {
  4480. parser->token_start = parser->current_char;
  4481. char c = parser->eatCharIncludeNewLine();
  4482. switch (c) {
  4483. case '\'': case '"': eatString(c, false); return;
  4484. case '#': parser->skipLineComment(); break;
  4485. case '{': parser->setNextToken(TK("{")); return;
  4486. case '}': parser->setNextToken(TK("}")); return;
  4487. case ',': parser->setNextToken(TK(",")); return;
  4488. case ':': parser->setNextToken(TK(":")); return;
  4489. case ';': parser->setNextToken(TK(";")); return;
  4490. case '(': parser->setNextToken(TK("(")); return;
  4491. case ')': parser->setNextToken(TK(")")); return;
  4492. case '[': parser->setNextToken(TK("[")); return;
  4493. case ']': parser->setNextToken(TK("]")); return;
  4494. case '%': parser->setNextToken(TK("%")); return;
  4495. case '&': parser->setNextToken(TK("&")); return;
  4496. case '|': parser->setNextToken(TK("|")); return;
  4497. case '^': parser->setNextToken(TK("^")); return;
  4498. case '?': parser->setNextToken(TK("?")); return;
  4499. case '.': {
  4500. if(parser->matchChar('.')) {
  4501. if(parser->matchChar('.')) {
  4502. parser->setNextToken(TK("..."));
  4503. } else {
  4504. syntaxError("invalid token '..'");
  4505. }
  4506. } else {
  4507. parser->setNextToken(TK("."));
  4508. }
  4509. return;
  4510. }
  4511. case '=': parser->setNextTwoCharToken('=', TK("="), TK("==")); return;
  4512. case '+': parser->setNextTwoCharToken('=', TK("+"), TK("+=")); return;
  4513. case '>': {
  4514. if(parser->matchChar('=')) parser->setNextToken(TK(">="));
  4515. else if(parser->matchChar('>')) parser->setNextToken(TK(">>"));
  4516. else parser->setNextToken(TK(">"));
  4517. return;
  4518. }
  4519. case '<': {
  4520. if(parser->matchChar('=')) parser->setNextToken(TK("<="));
  4521. else if(parser->matchChar('<')) parser->setNextToken(TK("<<"));
  4522. else parser->setNextToken(TK("<"));
  4523. return;
  4524. }
  4525. case '-': {
  4526. if(parser->matchChar('=')) parser->setNextToken(TK("-="));
  4527. else if(parser->matchChar('>')) parser->setNextToken(TK("->"));
  4528. else parser->setNextToken(TK("-"));
  4529. return;
  4530. }
  4531. case '!':
  4532. if(parser->matchChar('=')) parser->setNextToken(TK("!="));
  4533. else syntaxError("expected '=' after '!'");
  4534. break;
  4535. case '*':
  4536. if (parser->matchChar('*')) {
  4537. parser->setNextToken(TK("**")); // '**'
  4538. } else {
  4539. parser->setNextTwoCharToken('=', TK("*"), TK("*="));
  4540. }
  4541. return;
  4542. case '/':
  4543. if(parser->matchChar('/')) {
  4544. parser->setNextTwoCharToken('=', TK("//"), TK("//="));
  4545. } else {
  4546. parser->setNextTwoCharToken('=', TK("/"), TK("/="));
  4547. }
  4548. return;
  4549. case '\r': break; // just ignore '\r'
  4550. case ' ': case '\t': parser->eatSpaces(); break;
  4551. case '\n': {
  4552. parser->setNextToken(TK("@eol")); while(parser->matchChar('\n'));
  4553. if(!parser->eatIndentation()) indentationError("unindent does not match any outer indentation level");
  4554. return;
  4555. }
  4556. default: {
  4557. if(c == 'f'){
  4558. if(parser->matchChar('\'')) {eatString('\'', true); return;}
  4559. if(parser->matchChar('"')) {eatString('"', true); return;}
  4560. }
  4561. if (isdigit(c)) {
  4562. eatNumber();
  4563. } else if (parser->isNameStart(c)) {
  4564. int ret = parser->eatName();
  4565. if(ret!=0) syntaxError("identifier is illegal, err " + std::to_string(ret));
  4566. } else {
  4567. syntaxError("unknown character: " + std::string(1, c));
  4568. }
  4569. return;
  4570. }
  4571. }
  4572. }
  4573. parser->token_start = parser->current_char;
  4574. parser->setNextToken(TK("@eof"));
  4575. }
  4576. inline _TokenType peek() {
  4577. return parser->current.type;
  4578. }
  4579. // not sure this will work
  4580. _TokenType peekNext() {
  4581. if(parser->nexts.empty()) return TK("@eof");
  4582. return parser->nexts.front().type;
  4583. }
  4584. bool match(_TokenType expected) {
  4585. if (peek() != expected) return false;
  4586. lexToken();
  4587. return true;
  4588. }
  4589. void consume(_TokenType expected) {
  4590. if (!match(expected)){
  4591. _StrStream ss;
  4592. ss << "expected '" << TK_STR(expected) << "', but got '" << TK_STR(peek()) << "'";
  4593. syntaxError(ss.str());
  4594. }
  4595. }
  4596. bool matchNewLines(bool repl_throw=false) {
  4597. bool consumed = false;
  4598. if (peek() == TK("@eol")) {
  4599. while (peek() == TK("@eol")) lexToken();
  4600. consumed = true;
  4601. }
  4602. if (repl_throw && peek() == TK("@eof")){
  4603. throw NeedMoreLines(isCompilingClass);
  4604. }
  4605. return consumed;
  4606. }
  4607. bool matchEndStatement() {
  4608. if (match(TK(";"))) {
  4609. matchNewLines();
  4610. return true;
  4611. }
  4612. if (matchNewLines() || peek() == TK("@eof"))
  4613. return true;
  4614. if (peek() == TK("@dedent")) return true;
  4615. return false;
  4616. }
  4617. void consumeEndStatement() {
  4618. if (!matchEndStatement()) syntaxError("expected statement end");
  4619. }
  4620. void exprLiteral() {
  4621. PyVar value = parser->previous.value;
  4622. int index = getCode()->addConst(value);
  4623. emitCode(OP_LOAD_CONST, index);
  4624. }
  4625. void exprFString() {
  4626. static const std::regex pattern(R"(\{(.*?)\})");
  4627. PyVar value = parser->previous.value;
  4628. std::string s = vm->PyStr_AS_C(value).str();
  4629. std::sregex_iterator begin(s.begin(), s.end(), pattern);
  4630. std::sregex_iterator end;
  4631. int size = 0;
  4632. int i = 0;
  4633. for(auto it = begin; it != end; it++) {
  4634. std::smatch m = *it;
  4635. if (i < m.position()) {
  4636. std::string literal = s.substr(i, m.position() - i);
  4637. emitCode(OP_LOAD_CONST, getCode()->addConst(vm->PyStr(literal)));
  4638. size++;
  4639. }
  4640. emitCode(OP_LOAD_EVAL_FN);
  4641. emitCode(OP_LOAD_CONST, getCode()->addConst(vm->PyStr(m[1].str())));
  4642. emitCode(OP_CALL, 1);
  4643. size++;
  4644. i = (int)(m.position() + m.length());
  4645. }
  4646. if (i < s.size()) {
  4647. std::string literal = s.substr(i, s.size() - i);
  4648. emitCode(OP_LOAD_CONST, getCode()->addConst(vm->PyStr(literal)));
  4649. size++;
  4650. }
  4651. emitCode(OP_BUILD_STRING, size);
  4652. }
  4653. void exprLambda() {
  4654. _Func func = pkpy::make_shared<Function>();
  4655. func->name = "<lambda>";
  4656. if(!match(TK(":"))){
  4657. __compileFunctionArgs(func);
  4658. consume(TK(":"));
  4659. }
  4660. func->code = pkpy::make_shared<CodeObject>(parser->src, func->name);
  4661. this->codes.push(func->code);
  4662. EXPR_TUPLE();
  4663. emitCode(OP_RETURN_VALUE);
  4664. this->codes.pop();
  4665. emitCode(OP_LOAD_LAMBDA, getCode()->addConst(vm->PyFunction(func)));
  4666. }
  4667. void exprAssign() {
  4668. _TokenType op = parser->previous.type;
  4669. if(op == TK("=")) { // a = (expr)
  4670. EXPR_TUPLE();
  4671. emitCode(OP_STORE_PTR);
  4672. }else{ // a += (expr) -> a = a + (expr)
  4673. // TODO: optimization is needed for inplace operators
  4674. emitCode(OP_DUP_TOP);
  4675. EXPR();
  4676. switch (op) {
  4677. case TK("+="): emitCode(OP_BINARY_OP, 0); break;
  4678. case TK("-="): emitCode(OP_BINARY_OP, 1); break;
  4679. case TK("*="): emitCode(OP_BINARY_OP, 2); break;
  4680. case TK("/="): emitCode(OP_BINARY_OP, 3); break;
  4681. case TK("//="): emitCode(OP_BINARY_OP, 4); break;
  4682. default: UNREACHABLE();
  4683. }
  4684. emitCode(OP_STORE_PTR);
  4685. }
  4686. }
  4687. void exprComma() {
  4688. int size = 1; // an expr is in the stack now
  4689. do {
  4690. EXPR(); // NOTE: "1," will fail, "1,2" will be ok
  4691. size++;
  4692. } while(match(TK(",")));
  4693. emitCode(OP_BUILD_SMART_TUPLE, size);
  4694. }
  4695. void exprOr() {
  4696. int patch = emitCode(OP_JUMP_IF_TRUE_OR_POP);
  4697. parsePrecedence(PREC_LOGICAL_OR);
  4698. patchJump(patch);
  4699. }
  4700. void exprAnd() {
  4701. int patch = emitCode(OP_JUMP_IF_FALSE_OR_POP);
  4702. parsePrecedence(PREC_LOGICAL_AND);
  4703. patchJump(patch);
  4704. }
  4705. void exprTernary() {
  4706. int patch = emitCode(OP_POP_JUMP_IF_FALSE);
  4707. EXPR(); // if true
  4708. int patch2 = emitCode(OP_JUMP_ABSOLUTE);
  4709. consume(TK(":"));
  4710. patchJump(patch);
  4711. EXPR(); // if false
  4712. patchJump(patch2);
  4713. }
  4714. void exprBinaryOp() {
  4715. _TokenType op = parser->previous.type;
  4716. parsePrecedence((Precedence)(rules[op].precedence + 1));
  4717. switch (op) {
  4718. case TK("+"): emitCode(OP_BINARY_OP, 0); break;
  4719. case TK("-"): emitCode(OP_BINARY_OP, 1); break;
  4720. case TK("*"): emitCode(OP_BINARY_OP, 2); break;
  4721. case TK("/"): emitCode(OP_BINARY_OP, 3); break;
  4722. case TK("//"): emitCode(OP_BINARY_OP, 4); break;
  4723. case TK("%"): emitCode(OP_BINARY_OP, 5); break;
  4724. case TK("**"): emitCode(OP_BINARY_OP, 6); break;
  4725. case TK("<"): emitCode(OP_COMPARE_OP, 0); break;
  4726. case TK("<="): emitCode(OP_COMPARE_OP, 1); break;
  4727. case TK("=="): emitCode(OP_COMPARE_OP, 2); break;
  4728. case TK("!="): emitCode(OP_COMPARE_OP, 3); break;
  4729. case TK(">"): emitCode(OP_COMPARE_OP, 4); break;
  4730. case TK(">="): emitCode(OP_COMPARE_OP, 5); break;
  4731. case TK("in"): emitCode(OP_CONTAINS_OP, 0); break;
  4732. case TK("not in"): emitCode(OP_CONTAINS_OP, 1); break;
  4733. case TK("is"): emitCode(OP_IS_OP, 0); break;
  4734. case TK("is not"): emitCode(OP_IS_OP, 1); break;
  4735. case TK("<<"): emitCode(OP_BITWISE_OP, 0); break;
  4736. case TK(">>"): emitCode(OP_BITWISE_OP, 1); break;
  4737. case TK("&"): emitCode(OP_BITWISE_OP, 2); break;
  4738. case TK("|"): emitCode(OP_BITWISE_OP, 3); break;
  4739. case TK("^"): emitCode(OP_BITWISE_OP, 4); break;
  4740. default: UNREACHABLE();
  4741. }
  4742. }
  4743. void exprUnaryOp() {
  4744. _TokenType op = parser->previous.type;
  4745. matchNewLines();
  4746. parsePrecedence((Precedence)(PREC_UNARY + 1));
  4747. switch (op) {
  4748. case TK("-"): emitCode(OP_UNARY_NEGATIVE); break;
  4749. case TK("not"): emitCode(OP_UNARY_NOT); break;
  4750. case TK("&"): emitCode(OP_UNARY_REF); break;
  4751. case TK("*"): emitCode(OP_UNARY_DEREF); break;
  4752. default: UNREACHABLE();
  4753. }
  4754. }
  4755. void exprGrouping() {
  4756. matchNewLines(mode()==SINGLE_MODE);
  4757. EXPR_TUPLE();
  4758. matchNewLines(mode()==SINGLE_MODE);
  4759. consume(TK(")"));
  4760. }
  4761. void exprList() {
  4762. int _patch = emitCode(OP_NO_OP);
  4763. int _body_start = getCode()->co_code.size();
  4764. int ARGC = 0;
  4765. do {
  4766. matchNewLines(mode()==SINGLE_MODE);
  4767. if (peek() == TK("]")) break;
  4768. EXPR(); ARGC++;
  4769. matchNewLines(mode()==SINGLE_MODE);
  4770. if(ARGC == 1 && match(TK("for"))) goto __LISTCOMP;
  4771. } while (match(TK(",")));
  4772. matchNewLines(mode()==SINGLE_MODE);
  4773. consume(TK("]"));
  4774. emitCode(OP_BUILD_LIST, ARGC);
  4775. return;
  4776. __LISTCOMP:
  4777. int _body_end = getCode()->co_code.size();
  4778. getCode()->co_code[_patch].op = OP_JUMP_ABSOLUTE;
  4779. getCode()->co_code[_patch].arg = _body_end;
  4780. emitCode(OP_BUILD_LIST, 0);
  4781. EXPR_FOR_VARS();consume(TK("in"));EXPR_TUPLE();
  4782. matchNewLines(mode()==SINGLE_MODE);
  4783. int _skipPatch = emitCode(OP_JUMP_ABSOLUTE);
  4784. int _cond_start = getCode()->co_code.size();
  4785. if(match(TK("if"))) EXPR_TUPLE();
  4786. int _cond_end = getCode()->co_code.size();
  4787. patchJump(_skipPatch);
  4788. emitCode(OP_GET_ITER);
  4789. Loop& loop = enterLoop();
  4790. int patch = emitCode(OP_FOR_ITER);
  4791. if(_cond_end != _cond_start) { // there is an if condition
  4792. getCode()->__moveToEnd(_cond_start, _cond_end);
  4793. int ifpatch = emitCode(OP_POP_JUMP_IF_FALSE);
  4794. getCode()->__moveToEnd(_body_start, _body_end);
  4795. emitCode(OP_LIST_APPEND);
  4796. patchJump(ifpatch);
  4797. }else{
  4798. getCode()->__moveToEnd(_body_start, _body_end);
  4799. emitCode(OP_LIST_APPEND);
  4800. }
  4801. emitCode(OP_JUMP_ABSOLUTE, loop.start); keepOpcodeLine();
  4802. patchJump(patch);
  4803. exitLoop();
  4804. matchNewLines(mode()==SINGLE_MODE);
  4805. consume(TK("]"));
  4806. }
  4807. void exprMap() {
  4808. int size = 0;
  4809. do {
  4810. matchNewLines(mode()==SINGLE_MODE);
  4811. if (peek() == TK("}")) break;
  4812. EXPR();consume(TK(":"));EXPR();
  4813. size++;
  4814. matchNewLines(mode()==SINGLE_MODE);
  4815. } while (match(TK(",")));
  4816. matchNewLines();
  4817. consume(TK("}"));
  4818. emitCode(OP_BUILD_MAP, size);
  4819. }
  4820. void exprCall() {
  4821. int ARGC = 0;
  4822. int KWARGC = 0;
  4823. do {
  4824. matchNewLines(mode()==SINGLE_MODE);
  4825. if (peek() == TK(")")) break;
  4826. if(peek() == TK("@id") && peekNext() == TK("=")) {
  4827. consume(TK("@id"));
  4828. const _Str& key = parser->previous.str();
  4829. emitCode(OP_LOAD_CONST, getCode()->addConst(vm->PyStr(key)));
  4830. consume(TK("="));
  4831. EXPR();
  4832. KWARGC++;
  4833. } else{
  4834. if(KWARGC > 0) syntaxError("positional argument follows keyword argument");
  4835. EXPR();
  4836. ARGC++;
  4837. }
  4838. matchNewLines(mode()==SINGLE_MODE);
  4839. } while (match(TK(",")));
  4840. consume(TK(")"));
  4841. emitCode(OP_CALL, (KWARGC << 16) | ARGC);
  4842. }
  4843. void exprName() {
  4844. Token tkname = parser->previous;
  4845. int index = getCode()->addName(
  4846. tkname.str(),
  4847. codes.size()>1 ? NAME_LOCAL : NAME_GLOBAL
  4848. );
  4849. emitCode(OP_LOAD_NAME_PTR, index);
  4850. }
  4851. void exprAttrib() {
  4852. consume(TK("@id"));
  4853. const _Str& name = parser->previous.str();
  4854. int index = getCode()->addName(name, NAME_ATTR);
  4855. emitCode(OP_BUILD_ATTR_PTR, index);
  4856. }
  4857. void exprAttribPtr(){
  4858. consume(TK("@id"));
  4859. const _Str& name = parser->previous.str();
  4860. int index = getCode()->addName(name, NAME_ATTR);
  4861. emitCode(OP_BUILD_ATTR_PTR_PTR, index);
  4862. }
  4863. // [:], [:b]
  4864. // [a], [a:], [a:b]
  4865. void exprSubscript() {
  4866. if(match(TK(":"))){
  4867. emitCode(OP_LOAD_NONE);
  4868. if(match(TK("]"))){
  4869. emitCode(OP_LOAD_NONE);
  4870. }else{
  4871. EXPR();
  4872. consume(TK("]"));
  4873. }
  4874. emitCode(OP_BUILD_SLICE);
  4875. }else{
  4876. EXPR();
  4877. if(match(TK(":"))){
  4878. if(match(TK("]"))){
  4879. emitCode(OP_LOAD_NONE);
  4880. }else{
  4881. EXPR();
  4882. consume(TK("]"));
  4883. }
  4884. emitCode(OP_BUILD_SLICE);
  4885. }else{
  4886. consume(TK("]"));
  4887. }
  4888. }
  4889. emitCode(OP_BUILD_INDEX_PTR);
  4890. }
  4891. void exprValue() {
  4892. _TokenType op = parser->previous.type;
  4893. switch (op) {
  4894. case TK("None"): emitCode(OP_LOAD_NONE); break;
  4895. case TK("True"): emitCode(OP_LOAD_TRUE); break;
  4896. case TK("False"): emitCode(OP_LOAD_FALSE); break;
  4897. case TK("..."): emitCode(OP_LOAD_ELLIPSIS); break;
  4898. default: UNREACHABLE();
  4899. }
  4900. }
  4901. void keepOpcodeLine(){
  4902. int i = getCode()->co_code.size() - 1;
  4903. getCode()->co_code[i].line = getCode()->co_code[i-1].line;
  4904. }
  4905. int emitCode(Opcode opcode, int arg=-1) {
  4906. int line = parser->previous.line;
  4907. getCode()->co_code.push_back(
  4908. ByteCode{(uint8_t)opcode, arg, (uint16_t)line}
  4909. );
  4910. return getCode()->co_code.size() - 1;
  4911. }
  4912. inline void patchJump(int addr_index) {
  4913. int target = getCode()->co_code.size();
  4914. getCode()->co_code[addr_index].arg = target;
  4915. }
  4916. void compileBlockBody(){
  4917. __compileBlockBody(&Compiler::compileStatement);
  4918. }
  4919. void __compileBlockBody(CompilerAction action) {
  4920. consume(TK(":"));
  4921. if(!matchNewLines(mode()==SINGLE_MODE)){
  4922. syntaxError("expected a new line after ':'");
  4923. }
  4924. consume(TK("@indent"));
  4925. while (peek() != TK("@dedent")) {
  4926. matchNewLines();
  4927. (this->*action)();
  4928. matchNewLines();
  4929. }
  4930. consume(TK("@dedent"));
  4931. }
  4932. Token compileImportPath() {
  4933. consume(TK("@id"));
  4934. Token tkmodule = parser->previous;
  4935. int index = getCode()->addName(tkmodule.str(), NAME_GLOBAL);
  4936. emitCode(OP_IMPORT_NAME, index);
  4937. return tkmodule;
  4938. }
  4939. // import a as b
  4940. void compileRegularImport() {
  4941. do {
  4942. Token tkmodule = compileImportPath();
  4943. if (match(TK("as"))) {
  4944. consume(TK("@id"));
  4945. tkmodule = parser->previous;
  4946. }
  4947. int index = getCode()->addName(tkmodule.str(), NAME_GLOBAL);
  4948. emitCode(OP_STORE_NAME_PTR, index);
  4949. } while (match(TK(",")));
  4950. consumeEndStatement();
  4951. }
  4952. // from a import b as c, d as e
  4953. void compileFromImport() {
  4954. Token tkmodule = compileImportPath();
  4955. consume(TK("import"));
  4956. do {
  4957. emitCode(OP_DUP_TOP);
  4958. consume(TK("@id"));
  4959. Token tkname = parser->previous;
  4960. int index = getCode()->addName(tkname.str(), NAME_GLOBAL);
  4961. emitCode(OP_BUILD_ATTR_PTR, index);
  4962. if (match(TK("as"))) {
  4963. consume(TK("@id"));
  4964. tkname = parser->previous;
  4965. }
  4966. index = getCode()->addName(tkname.str(), NAME_GLOBAL);
  4967. emitCode(OP_STORE_NAME_PTR, index);
  4968. } while (match(TK(",")));
  4969. emitCode(OP_POP_TOP);
  4970. consumeEndStatement();
  4971. }
  4972. void parsePrecedence(Precedence precedence) {
  4973. lexToken();
  4974. GrammarFn prefix = rules[parser->previous.type].prefix;
  4975. if (prefix == nullptr) syntaxError(_Str("expected an expression, but got ") + TK_STR(parser->previous.type));
  4976. (this->*prefix)();
  4977. while (rules[peek()].precedence >= precedence) {
  4978. lexToken();
  4979. _TokenType op = parser->previous.type;
  4980. GrammarFn infix = rules[op].infix;
  4981. if(infix == nullptr) throw std::runtime_error("(infix == nullptr) is true");
  4982. (this->*infix)();
  4983. }
  4984. }
  4985. void compileIfStatement() {
  4986. matchNewLines();
  4987. EXPR_TUPLE();
  4988. int ifpatch = emitCode(OP_POP_JUMP_IF_FALSE);
  4989. compileBlockBody();
  4990. if (match(TK("elif"))) {
  4991. int exit_jump = emitCode(OP_JUMP_ABSOLUTE);
  4992. patchJump(ifpatch);
  4993. compileIfStatement();
  4994. patchJump(exit_jump);
  4995. } else if (match(TK("else"))) {
  4996. int exit_jump = emitCode(OP_JUMP_ABSOLUTE);
  4997. patchJump(ifpatch);
  4998. compileBlockBody();
  4999. patchJump(exit_jump);
  5000. } else {
  5001. patchJump(ifpatch);
  5002. }
  5003. }
  5004. Loop& enterLoop(){
  5005. Loop lp((int)getCode()->co_code.size());
  5006. loops.push(lp);
  5007. return loops.top();
  5008. }
  5009. void exitLoop(){
  5010. Loop& lp = loops.top();
  5011. for(int addr : lp.breaks) patchJump(addr);
  5012. loops.pop();
  5013. }
  5014. void compileWhileLoop() {
  5015. Loop& loop = enterLoop();
  5016. EXPR_TUPLE();
  5017. int patch = emitCode(OP_POP_JUMP_IF_FALSE);
  5018. compileBlockBody();
  5019. emitCode(OP_JUMP_ABSOLUTE, loop.start); keepOpcodeLine();
  5020. patchJump(patch);
  5021. exitLoop();
  5022. }
  5023. void EXPR_FOR_VARS(){
  5024. int size = 0;
  5025. do {
  5026. consume(TK("@id"));
  5027. exprName(); size++;
  5028. } while (match(TK(",")));
  5029. if(size > 1) emitCode(OP_BUILD_SMART_TUPLE, size);
  5030. }
  5031. void compileForLoop() {
  5032. EXPR_FOR_VARS();consume(TK("in"));EXPR_TUPLE();
  5033. emitCode(OP_GET_ITER);
  5034. Loop& loop = enterLoop();
  5035. int patch = emitCode(OP_FOR_ITER);
  5036. compileBlockBody();
  5037. emitCode(OP_JUMP_ABSOLUTE, loop.start); keepOpcodeLine();
  5038. patchJump(patch);
  5039. exitLoop();
  5040. }
  5041. void compileStatement() {
  5042. if (match(TK("break"))) {
  5043. if (loops.empty()) syntaxError("'break' outside loop");
  5044. consumeEndStatement();
  5045. int patch = emitCode(OP_SAFE_JUMP_ABSOLUTE);
  5046. getLoop().breaks.push_back(patch);
  5047. } else if (match(TK("continue"))) {
  5048. if (loops.empty()) syntaxError("'continue' not properly in loop");
  5049. consumeEndStatement();
  5050. emitCode(OP_JUMP_ABSOLUTE, getLoop().start);
  5051. } else if (match(TK("return"))) {
  5052. if (codes.size() == 1)
  5053. syntaxError("'return' outside function");
  5054. if(matchEndStatement()){
  5055. emitCode(OP_LOAD_NONE);
  5056. }else{
  5057. EXPR_TUPLE();
  5058. consumeEndStatement();
  5059. }
  5060. emitCode(OP_RETURN_VALUE);
  5061. } else if (match(TK("if"))) {
  5062. compileIfStatement();
  5063. } else if (match(TK("while"))) {
  5064. compileWhileLoop();
  5065. } else if (match(TK("for"))) {
  5066. compileForLoop();
  5067. } else if(match(TK("assert"))){
  5068. EXPR();
  5069. emitCode(OP_ASSERT);
  5070. consumeEndStatement();
  5071. } else if(match(TK("with"))){
  5072. EXPR();
  5073. consume(TK("as"));
  5074. consume(TK("@id"));
  5075. Token tkname = parser->previous;
  5076. int index = getCode()->addName(
  5077. tkname.str(),
  5078. codes.size()>1 ? NAME_LOCAL : NAME_GLOBAL
  5079. );
  5080. emitCode(OP_STORE_NAME_PTR, index);
  5081. emitCode(OP_LOAD_NAME_PTR, index);
  5082. emitCode(OP_WITH_ENTER);
  5083. compileBlockBody();
  5084. emitCode(OP_LOAD_NAME_PTR, index);
  5085. emitCode(OP_WITH_EXIT);
  5086. } else if(match(TK("label"))){
  5087. if(mode() != EXEC_MODE) syntaxError("'label' is only available in EXEC_MODE");
  5088. consume(TK(".")); consume(TK("@id"));
  5089. getCode()->addLabel(parser->previous.str());
  5090. consumeEndStatement();
  5091. } else if(match(TK("goto"))){
  5092. // https://entrian.com/goto/
  5093. if(mode() != EXEC_MODE) syntaxError("'goto' is only available in EXEC_MODE");
  5094. consume(TK(".")); consume(TK("@id"));
  5095. emitCode(OP_LOAD_CONST, getCode()->addConst(vm->PyStr(parser->previous.str())));
  5096. emitCode(OP_GOTO);
  5097. consumeEndStatement();
  5098. } else if(match(TK("raise"))){
  5099. consume(TK("@id")); // dummy exception type
  5100. emitCode(OP_LOAD_CONST, getCode()->addConst(vm->PyStr(parser->previous.str())));
  5101. consume(TK("("));EXPR();consume(TK(")"));
  5102. emitCode(OP_RAISE_ERROR);
  5103. consumeEndStatement();
  5104. } else if(match(TK("del"))){
  5105. EXPR();
  5106. emitCode(OP_DELETE_PTR);
  5107. consumeEndStatement();
  5108. } else if(match(TK("global"))){
  5109. consume(TK("@id"));
  5110. getCode()->co_global_names.push_back(parser->previous.str());
  5111. consumeEndStatement();
  5112. } else if(match(TK("pass"))){
  5113. consumeEndStatement();
  5114. } else {
  5115. EXPR_ANY();
  5116. consumeEndStatement();
  5117. // If last op is not an assignment, pop the result.
  5118. uint8_t lastOp = getCode()->co_code.back().op;
  5119. if( lastOp != OP_STORE_NAME_PTR && lastOp != OP_STORE_PTR){
  5120. if(mode()==SINGLE_MODE && parser->indents.top() == 0){
  5121. emitCode(OP_PRINT_EXPR);
  5122. }
  5123. emitCode(OP_POP_TOP);
  5124. }
  5125. }
  5126. }
  5127. void compileClass(){
  5128. consume(TK("@id"));
  5129. int clsNameIdx = getCode()->addName(parser->previous.str(), NAME_GLOBAL);
  5130. int superClsNameIdx = -1;
  5131. if(match(TK("("))){
  5132. consume(TK("@id"));
  5133. superClsNameIdx = getCode()->addName(parser->previous.str(), NAME_GLOBAL);
  5134. consume(TK(")"));
  5135. }
  5136. emitCode(OP_LOAD_NONE);
  5137. isCompilingClass = true;
  5138. __compileBlockBody(&Compiler::compileFunction);
  5139. isCompilingClass = false;
  5140. if(superClsNameIdx == -1) emitCode(OP_LOAD_NONE);
  5141. else emitCode(OP_LOAD_NAME_PTR, superClsNameIdx);
  5142. emitCode(OP_BUILD_CLASS, clsNameIdx);
  5143. }
  5144. void __compileFunctionArgs(_Func func){
  5145. int state = 0; // 0 for args, 1 for *args, 2 for k=v, 3 for **kwargs
  5146. do {
  5147. if(state == 3) syntaxError("**kwargs should be the last argument");
  5148. matchNewLines();
  5149. if(match(TK("*"))){
  5150. if(state < 1) state = 1;
  5151. else syntaxError("*args should be placed before **kwargs");
  5152. }
  5153. else if(match(TK("**"))){
  5154. state = 3;
  5155. }
  5156. consume(TK("@id"));
  5157. const _Str& name = parser->previous.str();
  5158. if(func->hasName(name)) syntaxError("duplicate argument name");
  5159. if(state == 0 && peek() == TK("=")) state = 2;
  5160. switch (state)
  5161. {
  5162. case 0: func->args.push_back(name); break;
  5163. case 1: func->starredArg = name; state+=1; break;
  5164. case 2: {
  5165. consume(TK("="));
  5166. PyVarOrNull value = readLiteral();
  5167. if(value == nullptr){
  5168. syntaxError(_Str("expect a literal, not ") + TK_STR(parser->current.type));
  5169. }
  5170. func->kwArgs[name] = value;
  5171. func->kwArgsOrder.push_back(name);
  5172. } break;
  5173. case 3: syntaxError("**kwargs is not supported yet"); break;
  5174. }
  5175. } while (match(TK(",")));
  5176. }
  5177. void compileFunction(){
  5178. if(isCompilingClass){
  5179. if(match(TK("pass"))) return;
  5180. consume(TK("def"));
  5181. }
  5182. _Func func = pkpy::make_shared<Function>();
  5183. consume(TK("@id"));
  5184. func->name = parser->previous.str();
  5185. if (match(TK("(")) && !match(TK(")"))) {
  5186. __compileFunctionArgs(func);
  5187. consume(TK(")"));
  5188. }
  5189. func->code = pkpy::make_shared<CodeObject>(parser->src, func->name);
  5190. this->codes.push(func->code);
  5191. compileBlockBody();
  5192. this->codes.pop();
  5193. emitCode(OP_LOAD_CONST, getCode()->addConst(vm->PyFunction(func)));
  5194. if(!isCompilingClass) emitCode(OP_STORE_FUNCTION);
  5195. }
  5196. PyVarOrNull readLiteral(){
  5197. if(match(TK("-"))){
  5198. consume(TK("@num"));
  5199. PyVar val = parser->previous.value;
  5200. return vm->numNegated(val);
  5201. }
  5202. if(match(TK("@num"))) return parser->previous.value;
  5203. if(match(TK("@str"))) return parser->previous.value;
  5204. if(match(TK("True"))) return vm->PyBool(true);
  5205. if(match(TK("False"))) return vm->PyBool(false);
  5206. if(match(TK("None"))) return vm->None;
  5207. if(match(TK("..."))) return vm->Ellipsis;
  5208. return nullptr;
  5209. }
  5210. void compileTopLevelStatement() {
  5211. if (match(TK("class"))) {
  5212. compileClass();
  5213. } else if (match(TK("def"))) {
  5214. compileFunction();
  5215. } else if (match(TK("import"))) {
  5216. compileRegularImport();
  5217. } else if (match(TK("from"))) {
  5218. compileFromImport();
  5219. } else {
  5220. compileStatement();
  5221. }
  5222. }
  5223. _Code __fillCode(){
  5224. _Code code = pkpy::make_shared<CodeObject>(parser->src, _Str("<module>"));
  5225. codes.push(code);
  5226. // Lex initial tokens. current <-- next.
  5227. lexToken();
  5228. lexToken();
  5229. matchNewLines();
  5230. if(mode()==EVAL_MODE) {
  5231. EXPR_TUPLE();
  5232. consume(TK("@eof"));
  5233. return code;
  5234. }else if(mode()==JSON_MODE){
  5235. PyVarOrNull value = readLiteral();
  5236. if(value != nullptr) emitCode(OP_LOAD_CONST, code->addConst(value));
  5237. else if(match(TK("{"))) exprMap();
  5238. else if(match(TK("["))) exprList();
  5239. else syntaxError("expect a JSON object or array");
  5240. consume(TK("@eof"));
  5241. return code;
  5242. }
  5243. while (!match(TK("@eof"))) {
  5244. compileTopLevelStatement();
  5245. matchNewLines();
  5246. }
  5247. return code;
  5248. }
  5249. /***** Error Reporter *****/
  5250. _Str getLineSnapshot(){
  5251. int lineno = parser->current_line;
  5252. if(parser->peekChar() == '\n') lineno--;
  5253. return parser->src->snapshot(lineno);
  5254. }
  5255. void syntaxError(_Str msg){
  5256. throw CompileError("SyntaxError", msg, getLineSnapshot());
  5257. }
  5258. void indentationError(_Str msg){
  5259. throw CompileError("IndentationError", msg, getLineSnapshot());
  5260. }
  5261. void unexpectedError(_Str msg){
  5262. throw CompileError("UnexpectedError", msg, getLineSnapshot());
  5263. }
  5264. };
  5265. _Code compile(VM* vm, const char* source, _Str filename, CompileMode mode=EXEC_MODE, bool noThrow=true) {
  5266. Compiler compiler(vm, source, filename, mode);
  5267. if(!noThrow) return compiler.__fillCode();
  5268. try{
  5269. return compiler.__fillCode();
  5270. }catch(_Error& e){
  5271. (*vm->_stderr) << e.what() << '\n';
  5272. }catch(std::exception& e){
  5273. auto ce = CompileError("UnexpectedError", e.what(), compiler.getLineSnapshot());
  5274. (*vm->_stderr) << ce.what() << '\n';
  5275. }
  5276. return nullptr;
  5277. }
  5278. enum InputResult {
  5279. NEED_MORE_LINES = 0,
  5280. EXEC_DONE = 1,
  5281. EXEC_SKIPPED = 2,
  5282. };
  5283. class REPL {
  5284. protected:
  5285. int need_more_lines = 0;
  5286. std::string buffer;
  5287. VM* vm;
  5288. bool exited = false;
  5289. void _exit(){
  5290. exited = true;
  5291. exit(0);
  5292. }
  5293. public:
  5294. REPL(VM* vm) : vm(vm){
  5295. (*vm->_stdout) << ("pocketpy " PK_VERSION " (" __DATE__ ", " __TIME__ ")\n");
  5296. (*vm->_stdout) << ("https://github.com/blueloveTH/pocketpy" "\n");
  5297. (*vm->_stdout) << ("Type \"exit()\" to exit." "\n");
  5298. }
  5299. bool is_need_more_lines() const {
  5300. return need_more_lines;
  5301. }
  5302. InputResult input(std::string line){
  5303. if(exited) return EXEC_SKIPPED;
  5304. if(need_more_lines){
  5305. buffer += line;
  5306. buffer += '\n';
  5307. int n = buffer.size();
  5308. if(n>=need_more_lines){
  5309. for(int i=buffer.size()-need_more_lines; i<buffer.size(); i++){
  5310. if(buffer[i] != '\n') goto __NOT_ENOUGH_LINES;
  5311. }
  5312. need_more_lines = 0;
  5313. line = buffer;
  5314. buffer.clear();
  5315. }else{
  5316. __NOT_ENOUGH_LINES:
  5317. return NEED_MORE_LINES;
  5318. }
  5319. }else{
  5320. if(line == "exit()") _exit();
  5321. if(line.empty()) return EXEC_SKIPPED;
  5322. }
  5323. try{
  5324. _Code code = compile(vm, line.c_str(), "<stdin>", SINGLE_MODE);
  5325. if(code == nullptr) return EXEC_SKIPPED;
  5326. vm->execAsync(code);
  5327. return EXEC_DONE;
  5328. }catch(NeedMoreLines& ne){
  5329. buffer += line;
  5330. buffer += '\n';
  5331. need_more_lines = ne.isClassDef ? 3 : 2;
  5332. return NEED_MORE_LINES;
  5333. }
  5334. }
  5335. };
  5336. #define BIND_NUM_ARITH_OPT(name, op) \
  5337. _vm->bindMethodMulti({"int","float"}, #name, [](VM* vm, const pkpy::ArgList& args){ \
  5338. if(!vm->isIntOrFloat(args[0], args[1])) \
  5339. vm->typeError("unsupported operand type(s) for " #op ); \
  5340. if(args[0]->isType(vm->_tp_int) && args[1]->isType(vm->_tp_int)){ \
  5341. return vm->PyInt(vm->PyInt_AS_C(args[0]) op vm->PyInt_AS_C(args[1])); \
  5342. }else{ \
  5343. return vm->PyFloat(vm->numToFloat(args[0]) op vm->numToFloat(args[1])); \
  5344. } \
  5345. });
  5346. #define BIND_NUM_LOGICAL_OPT(name, op, is_eq) \
  5347. _vm->bindMethodMulti({"int","float"}, #name, [](VM* vm, const pkpy::ArgList& args){ \
  5348. if(!vm->isIntOrFloat(args[0], args[1])){ \
  5349. if constexpr(is_eq) return vm->PyBool(args[0] == args[1]); \
  5350. vm->typeError("unsupported operand type(s) for " #op ); \
  5351. } \
  5352. return vm->PyBool(vm->numToFloat(args[0]) op vm->numToFloat(args[1])); \
  5353. });
  5354. void __initializeBuiltinFunctions(VM* _vm) {
  5355. BIND_NUM_ARITH_OPT(__add__, +)
  5356. BIND_NUM_ARITH_OPT(__sub__, -)
  5357. BIND_NUM_ARITH_OPT(__mul__, *)
  5358. BIND_NUM_LOGICAL_OPT(__lt__, <, false)
  5359. BIND_NUM_LOGICAL_OPT(__le__, <=, false)
  5360. BIND_NUM_LOGICAL_OPT(__gt__, >, false)
  5361. BIND_NUM_LOGICAL_OPT(__ge__, >=, false)
  5362. BIND_NUM_LOGICAL_OPT(__eq__, ==, true)
  5363. #undef BIND_NUM_ARITH_OPT
  5364. #undef BIND_NUM_LOGICAL_OPT
  5365. _vm->bindBuiltinFunc("__sys_stdout_write", [](VM* vm, const pkpy::ArgList& args) {
  5366. vm->__checkArgSize(args, 1);
  5367. (*vm->_stdout) << vm->PyStr_AS_C(args[0]);
  5368. return vm->None;
  5369. });
  5370. _vm->bindBuiltinFunc("super", [](VM* vm, const pkpy::ArgList& args) {
  5371. vm->__checkArgSize(args, 0);
  5372. auto it = vm->topFrame()->f_locals.find("self"_c);
  5373. if(it == vm->topFrame()->f_locals.end()) vm->typeError("super() can only be called in a class method");
  5374. return vm->newObject(vm->_tp_super, it->second);
  5375. });
  5376. _vm->bindBuiltinFunc("eval", [](VM* vm, const pkpy::ArgList& args) {
  5377. vm->__checkArgSize(args, 1);
  5378. const _Str& expr = vm->PyStr_AS_C(args[0]);
  5379. _Code code = compile(vm, expr.c_str(), "<eval>", EVAL_MODE, false);
  5380. return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals());
  5381. });
  5382. _vm->bindBuiltinFunc("isinstance", [](VM* vm, const pkpy::ArgList& args) {
  5383. vm->__checkArgSize(args, 2);
  5384. return vm->PyBool(vm->isInstance(args[0], args[1]));
  5385. });
  5386. _vm->bindBuiltinFunc("repr", [](VM* vm, const pkpy::ArgList& args) {
  5387. vm->__checkArgSize(args, 1);
  5388. return vm->asRepr(args[0]);
  5389. });
  5390. _vm->bindBuiltinFunc("hash", [](VM* vm, const pkpy::ArgList& args) {
  5391. vm->__checkArgSize(args, 1);
  5392. return vm->PyInt(vm->hash(args[0]));
  5393. });
  5394. _vm->bindBuiltinFunc("chr", [](VM* vm, const pkpy::ArgList& args) {
  5395. vm->__checkArgSize(args, 1);
  5396. _Int i = vm->PyInt_AS_C(args[0]);
  5397. if (i < 0 || i > 128) vm->valueError("chr() arg not in range(128)");
  5398. return vm->PyStr(std::string(1, (char)i));
  5399. });
  5400. _vm->bindBuiltinFunc("ord", [](VM* vm, const pkpy::ArgList& args) {
  5401. vm->__checkArgSize(args, 1);
  5402. _Str s = vm->PyStr_AS_C(args[0]);
  5403. if (s.size() != 1) vm->typeError("ord() expected an ASCII character");
  5404. return vm->PyInt((_Int)s[0]);
  5405. });
  5406. _vm->bindBuiltinFunc("globals", [](VM* vm, const pkpy::ArgList& args) {
  5407. vm->__checkArgSize(args, 0);
  5408. const auto& d = vm->topFrame()->f_globals();
  5409. PyVar obj = vm->call(vm->builtins->attribs["dict"]);
  5410. for (const auto& [k, v] : d) {
  5411. vm->call(obj, __setitem__, pkpy::twoArgs(vm->PyStr(k), v));
  5412. }
  5413. return obj;
  5414. });
  5415. _vm->bindBuiltinFunc("locals", [](VM* vm, const pkpy::ArgList& args) {
  5416. vm->__checkArgSize(args, 0);
  5417. const auto& d = vm->topFrame()->f_locals;
  5418. PyVar obj = vm->call(vm->builtins->attribs["dict"]);
  5419. for (const auto& [k, v] : d) {
  5420. vm->call(obj, __setitem__, pkpy::twoArgs(vm->PyStr(k), v));
  5421. }
  5422. return obj;
  5423. });
  5424. _vm->bindBuiltinFunc("dir", [](VM* vm, const pkpy::ArgList& args) {
  5425. vm->__checkArgSize(args, 1);
  5426. std::vector<_Str> names;
  5427. for (auto& [k, _] : args[0]->attribs) names.push_back(k);
  5428. for (auto& [k, _] : args[0]->_type->attribs) {
  5429. if (k.str().find("__") == 0) continue;
  5430. if (std::find(names.begin(), names.end(), k) == names.end()) names.push_back(k);
  5431. }
  5432. PyVarList ret;
  5433. for (const auto& name : names) ret.push_back(vm->PyStr(name));
  5434. return vm->PyList(ret);
  5435. });
  5436. _vm->bindMethod("object", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5437. PyVar _self = args[0];
  5438. _Str s = "<" + UNION_TP_NAME(_self) + " object at " + std::to_string((uintptr_t)_self.get()) + ">";
  5439. return vm->PyStr(s);
  5440. });
  5441. _vm->bindMethod("type", "__new__", [](VM* vm, const pkpy::ArgList& args) {
  5442. vm->__checkArgSize(args, 1);
  5443. return args[0]->_type;
  5444. });
  5445. _vm->bindMethod("range", "__new__", [](VM* vm, const pkpy::ArgList& args) {
  5446. _Range r;
  5447. switch (args.size()) {
  5448. case 1: r.stop = vm->PyInt_AS_C(args[0]); break;
  5449. case 2: r.start = vm->PyInt_AS_C(args[0]); r.stop = vm->PyInt_AS_C(args[1]); break;
  5450. 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;
  5451. default: vm->typeError("expected 1-3 arguments, but got " + std::to_string(args.size()));
  5452. }
  5453. return vm->PyRange(r);
  5454. });
  5455. _vm->bindMethod("range", "__iter__", [](VM* vm, const pkpy::ArgList& args) {
  5456. vm->__checkType(args[0], vm->_tp_range);
  5457. return vm->PyIter(
  5458. pkpy::make_shared<BaseIterator, RangeIterator>(vm, args[0])
  5459. );
  5460. });
  5461. _vm->bindMethod("NoneType", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5462. return vm->PyStr("None");
  5463. });
  5464. _vm->bindMethod("NoneType", "__json__", [](VM* vm, const pkpy::ArgList& args) {
  5465. return vm->PyStr("null");
  5466. });
  5467. _vm->bindMethod("NoneType", "__eq__", [](VM* vm, const pkpy::ArgList& args) {
  5468. return vm->PyBool(args[0] == args[1]);
  5469. });
  5470. _vm->bindMethodMulti({"int", "float"}, "__truediv__", [](VM* vm, const pkpy::ArgList& args) {
  5471. if(!vm->isIntOrFloat(args[0], args[1]))
  5472. vm->typeError("unsupported operand type(s) for " "/" );
  5473. _Float rhs = vm->numToFloat(args[1]);
  5474. if (rhs == 0) vm->zeroDivisionError();
  5475. return vm->PyFloat(vm->numToFloat(args[0]) / rhs);
  5476. });
  5477. _vm->bindMethodMulti({"int", "float"}, "__pow__", [](VM* vm, const pkpy::ArgList& args) {
  5478. if(!vm->isIntOrFloat(args[0], args[1]))
  5479. vm->typeError("unsupported operand type(s) for " "**" );
  5480. if(args[0]->isType(vm->_tp_int) && args[1]->isType(vm->_tp_int)){
  5481. return vm->PyInt((_Int)round(pow(vm->PyInt_AS_C(args[0]), vm->PyInt_AS_C(args[1]))));
  5482. }else{
  5483. return vm->PyFloat((_Float)pow(vm->numToFloat(args[0]), vm->numToFloat(args[1])));
  5484. }
  5485. });
  5486. /************ PyInt ************/
  5487. _vm->bindMethod("int", "__new__", [](VM* vm, const pkpy::ArgList& args) {
  5488. if(args.size() == 0) return vm->PyInt(0);
  5489. vm->__checkArgSize(args, 1);
  5490. if (args[0]->isType(vm->_tp_int)) return args[0];
  5491. if (args[0]->isType(vm->_tp_float)) return vm->PyInt((_Int)vm->PyFloat_AS_C(args[0]));
  5492. if (args[0]->isType(vm->_tp_bool)) return vm->PyInt(vm->PyBool_AS_C(args[0]) ? 1 : 0);
  5493. if (args[0]->isType(vm->_tp_str)) {
  5494. const _Str& s = vm->PyStr_AS_C(args[0]);
  5495. try{
  5496. size_t parsed = 0;
  5497. _Int val = std::stoll(s.str(), &parsed, 10);
  5498. if(parsed != s.str().size()) throw std::invalid_argument("");
  5499. return vm->PyInt(val);
  5500. }catch(std::invalid_argument&){
  5501. vm->valueError("invalid literal for int(): '" + s + "'");
  5502. }
  5503. }
  5504. vm->typeError("int() argument must be a int, float, bool or str");
  5505. return vm->None;
  5506. });
  5507. _vm->bindMethod("int", "__floordiv__", [](VM* vm, const pkpy::ArgList& args) {
  5508. if(!args[0]->isType(vm->_tp_int) || !args[1]->isType(vm->_tp_int))
  5509. vm->typeError("unsupported operand type(s) for " "//" );
  5510. _Int rhs = vm->PyInt_AS_C(args[1]);
  5511. if(rhs == 0) vm->zeroDivisionError();
  5512. return vm->PyInt(vm->PyInt_AS_C(args[0]) / rhs);
  5513. });
  5514. _vm->bindMethod("int", "__mod__", [](VM* vm, const pkpy::ArgList& args) {
  5515. if(!args[0]->isType(vm->_tp_int) || !args[1]->isType(vm->_tp_int))
  5516. vm->typeError("unsupported operand type(s) for " "%" );
  5517. _Int rhs = vm->PyInt_AS_C(args[1]);
  5518. if(rhs == 0) vm->zeroDivisionError();
  5519. return vm->PyInt(vm->PyInt_AS_C(args[0]) % rhs);
  5520. });
  5521. _vm->bindMethod("int", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5522. return vm->PyStr(std::to_string(vm->PyInt_AS_C(args[0])));
  5523. });
  5524. _vm->bindMethod("int", "__json__", [](VM* vm, const pkpy::ArgList& args) {
  5525. return vm->PyStr(std::to_string((int)vm->PyInt_AS_C(args[0])));
  5526. });
  5527. #define __INT_BITWISE_OP(name,op) \
  5528. _vm->bindMethod("int", #name, [](VM* vm, const pkpy::ArgList& args) { \
  5529. if(!args[0]->isType(vm->_tp_int) || !args[1]->isType(vm->_tp_int)) \
  5530. vm->typeError("unsupported operand type(s) for " #op ); \
  5531. return vm->PyInt(vm->PyInt_AS_C(args[0]) op vm->PyInt_AS_C(args[1])); \
  5532. });
  5533. __INT_BITWISE_OP(__lshift__, <<)
  5534. __INT_BITWISE_OP(__rshift__, >>)
  5535. __INT_BITWISE_OP(__and__, &)
  5536. __INT_BITWISE_OP(__or__, |)
  5537. __INT_BITWISE_OP(__xor__, ^)
  5538. #undef __INT_BITWISE_OP
  5539. _vm->bindMethod("int", "__xor__", [](VM* vm, const pkpy::ArgList& args) {
  5540. if(!args[0]->isType(vm->_tp_int) || !args[1]->isType(vm->_tp_int))
  5541. vm->typeError("unsupported operand type(s) for " "^" );
  5542. return vm->PyInt(vm->PyInt_AS_C(args[0]) ^ vm->PyInt_AS_C(args[1]));
  5543. });
  5544. /************ PyFloat ************/
  5545. _vm->bindMethod("float", "__new__", [](VM* vm, const pkpy::ArgList& args) {
  5546. if(args.size() == 0) return vm->PyFloat(0.0);
  5547. vm->__checkArgSize(args, 1);
  5548. if (args[0]->isType(vm->_tp_int)) return vm->PyFloat((_Float)vm->PyInt_AS_C(args[0]));
  5549. if (args[0]->isType(vm->_tp_float)) return args[0];
  5550. if (args[0]->isType(vm->_tp_bool)) return vm->PyFloat(vm->PyBool_AS_C(args[0]) ? 1.0 : 0.0);
  5551. if (args[0]->isType(vm->_tp_str)) {
  5552. const _Str& s = vm->PyStr_AS_C(args[0]);
  5553. if(s == "inf") return vm->PyFloat(INFINITY);
  5554. if(s == "-inf") return vm->PyFloat(-INFINITY);
  5555. try{
  5556. _Float val = std::stod(s.str());
  5557. return vm->PyFloat(val);
  5558. }catch(std::invalid_argument&){
  5559. vm->valueError("invalid literal for float(): '" + s + "'");
  5560. }
  5561. }
  5562. vm->typeError("float() argument must be a int, float, bool or str");
  5563. return vm->None;
  5564. });
  5565. _vm->bindMethod("float", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5566. _Float val = vm->PyFloat_AS_C(args[0]);
  5567. if(std::isinf(val) || std::isnan(val)) return vm->PyStr(std::to_string(val));
  5568. _StrStream ss;
  5569. ss << std::setprecision(std::numeric_limits<_Float>::max_digits10-1) << val;
  5570. std::string s = ss.str();
  5571. if(std::all_of(s.begin()+1, s.end(), isdigit)) s += ".0";
  5572. return vm->PyStr(s);
  5573. });
  5574. _vm->bindMethod("float", "__json__", [](VM* vm, const pkpy::ArgList& args) {
  5575. return vm->PyStr(std::to_string((float)vm->PyFloat_AS_C(args[0])));
  5576. });
  5577. /************ PyString ************/
  5578. _vm->bindMethod("str", "__new__", [](VM* vm, const pkpy::ArgList& args) {
  5579. vm->__checkArgSize(args, 1);
  5580. return vm->asStr(args[0]);
  5581. });
  5582. _vm->bindMethod("str", "__add__", [](VM* vm, const pkpy::ArgList& args) {
  5583. if(!args[0]->isType(vm->_tp_str) || !args[1]->isType(vm->_tp_str))
  5584. vm->typeError("unsupported operand type(s) for " "+" );
  5585. const _Str& lhs = vm->PyStr_AS_C(args[0]);
  5586. const _Str& rhs = vm->PyStr_AS_C(args[1]);
  5587. return vm->PyStr(lhs + rhs);
  5588. });
  5589. _vm->bindMethod("str", "__len__", [](VM* vm, const pkpy::ArgList& args) {
  5590. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5591. return vm->PyInt(_self.u8_length());
  5592. });
  5593. _vm->bindMethod("str", "__contains__", [](VM* vm, const pkpy::ArgList& args) {
  5594. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5595. const _Str& _other = vm->PyStr_AS_C(args[1]);
  5596. return vm->PyBool(_self.str().find(_other.str()) != _Str::npos);
  5597. });
  5598. _vm->bindMethod("str", "__str__", [](VM* vm, const pkpy::ArgList& args) {
  5599. return args[0]; // str is immutable
  5600. });
  5601. _vm->bindMethod("str", "__iter__", [](VM* vm, const pkpy::ArgList& args) {
  5602. return vm->PyIter(
  5603. pkpy::make_shared<BaseIterator, StringIterator>(vm, args[0])
  5604. );
  5605. });
  5606. _vm->bindMethod("str", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5607. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5608. return vm->PyStr(_self.__escape(true));
  5609. });
  5610. _vm->bindMethod("str", "__json__", [](VM* vm, const pkpy::ArgList& args) {
  5611. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5612. return vm->PyStr(_self.__escape(false));
  5613. });
  5614. _vm->bindMethod("str", "__eq__", [](VM* vm, const pkpy::ArgList& args) {
  5615. if(args[0]->isType(vm->_tp_str) && args[1]->isType(vm->_tp_str))
  5616. return vm->PyBool(vm->PyStr_AS_C(args[0]) == vm->PyStr_AS_C(args[1]));
  5617. return vm->PyBool(args[0] == args[1]); // fallback
  5618. });
  5619. _vm->bindMethod("str", "__getitem__", [](VM* vm, const pkpy::ArgList& args) {
  5620. const _Str& _self (vm->PyStr_AS_C(args[0]));
  5621. if(args[1]->isType(vm->_tp_slice)){
  5622. _Slice s = vm->PySlice_AS_C(args[1]);
  5623. s.normalize(_self.u8_length());
  5624. return vm->PyStr(_self.u8_substr(s.start, s.stop));
  5625. }
  5626. int _index = (int)vm->PyInt_AS_C(args[1]);
  5627. _index = vm->normalizedIndex(_index, _self.u8_length());
  5628. return vm->PyStr(_self.u8_getitem(_index));
  5629. });
  5630. _vm->bindMethod("str", "__gt__", [](VM* vm, const pkpy::ArgList& args) {
  5631. const _Str& _self (vm->PyStr_AS_C(args[0]));
  5632. const _Str& _obj (vm->PyStr_AS_C(args[1]));
  5633. return vm->PyBool(_self > _obj);
  5634. });
  5635. _vm->bindMethod("str", "__lt__", [](VM* vm, const pkpy::ArgList& args) {
  5636. const _Str& _self (vm->PyStr_AS_C(args[0]));
  5637. const _Str& _obj (vm->PyStr_AS_C(args[1]));
  5638. return vm->PyBool(_self < _obj);
  5639. });
  5640. _vm->bindMethod("str", "upper", [](VM* vm, const pkpy::ArgList& args) {
  5641. vm->__checkArgSize(args, 1, true);
  5642. const _Str& _self (vm->PyStr_AS_C(args[0]));
  5643. _StrStream ss;
  5644. for(auto c : _self.str()) ss << (char)toupper(c);
  5645. return vm->PyStr(ss.str());
  5646. });
  5647. _vm->bindMethod("str", "lower", [](VM* vm, const pkpy::ArgList& args) {
  5648. vm->__checkArgSize(args, 1, true);
  5649. const _Str& _self (vm->PyStr_AS_C(args[0]));
  5650. _StrStream ss;
  5651. for(auto c : _self.str()) ss << (char)tolower(c);
  5652. return vm->PyStr(ss.str());
  5653. });
  5654. _vm->bindMethod("str", "replace", [](VM* vm, const pkpy::ArgList& args) {
  5655. vm->__checkArgSize(args, 3, true);
  5656. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5657. const _Str& _old = vm->PyStr_AS_C(args[1]);
  5658. const _Str& _new = vm->PyStr_AS_C(args[2]);
  5659. std::string _copy = _self.str();
  5660. // replace all occurences of _old with _new in _copy
  5661. size_t pos = 0;
  5662. while ((pos = _copy.find(_old.str(), pos)) != std::string::npos) {
  5663. _copy.replace(pos, _old.str().length(), _new.str());
  5664. pos += _new.str().length();
  5665. }
  5666. return vm->PyStr(_copy);
  5667. });
  5668. _vm->bindMethod("str", "startswith", [](VM* vm, const pkpy::ArgList& args) {
  5669. vm->__checkArgSize(args, 2, true);
  5670. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5671. const _Str& _prefix = vm->PyStr_AS_C(args[1]);
  5672. return vm->PyBool(_self.str().find(_prefix.str()) == 0);
  5673. });
  5674. _vm->bindMethod("str", "endswith", [](VM* vm, const pkpy::ArgList& args) {
  5675. vm->__checkArgSize(args, 2, true);
  5676. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5677. const _Str& _suffix = vm->PyStr_AS_C(args[1]);
  5678. return vm->PyBool(_self.str().rfind(_suffix.str()) == _self.str().length() - _suffix.str().length());
  5679. });
  5680. _vm->bindMethod("str", "join", [](VM* vm, const pkpy::ArgList& args) {
  5681. vm->__checkArgSize(args, 2, true);
  5682. const _Str& _self = vm->PyStr_AS_C(args[0]);
  5683. PyVarList* _list;
  5684. if(args[1]->isType(vm->_tp_list)){
  5685. _list = &vm->PyList_AS_C(args[1]);
  5686. }else if(args[1]->isType(vm->_tp_tuple)){
  5687. _list = &vm->PyTuple_AS_C(args[1]);
  5688. }else{
  5689. vm->typeError("can only join a list or tuple");
  5690. }
  5691. _StrStream ss;
  5692. for(int i = 0; i < _list->size(); i++){
  5693. if(i > 0) ss << _self;
  5694. ss << vm->PyStr_AS_C(vm->asStr(_list->operator[](i)));
  5695. }
  5696. return vm->PyStr(ss.str());
  5697. });
  5698. /************ PyList ************/
  5699. _vm->bindMethod("list", "__iter__", [](VM* vm, const pkpy::ArgList& args) {
  5700. vm->__checkType(args[0], vm->_tp_list);
  5701. return vm->PyIter(
  5702. pkpy::make_shared<BaseIterator, VectorIterator>(vm, args[0])
  5703. );
  5704. });
  5705. _vm->bindMethod("list", "append", [](VM* vm, const pkpy::ArgList& args) {
  5706. vm->__checkArgSize(args, 2, true);
  5707. PyVarList& _self = vm->PyList_AS_C(args[0]);
  5708. _self.push_back(args[1]);
  5709. return vm->None;
  5710. });
  5711. _vm->bindMethod("list", "insert", [](VM* vm, const pkpy::ArgList& args) {
  5712. vm->__checkArgSize(args, 3, true);
  5713. PyVarList& _self = vm->PyList_AS_C(args[0]);
  5714. int _index = (int)vm->PyInt_AS_C(args[1]);
  5715. if(_index < 0) _index += _self.size();
  5716. if(_index < 0) _index = 0;
  5717. if(_index > _self.size()) _index = _self.size();
  5718. _self.insert(_self.begin() + _index, args[2]);
  5719. return vm->None;
  5720. });
  5721. _vm->bindMethod("list", "clear", [](VM* vm, const pkpy::ArgList& args) {
  5722. vm->__checkArgSize(args, 1, true);
  5723. vm->PyList_AS_C(args[0]).clear();
  5724. return vm->None;
  5725. });
  5726. _vm->bindMethod("list", "copy", [](VM* vm, const pkpy::ArgList& args) {
  5727. vm->__checkArgSize(args, 1, true);
  5728. return vm->PyList(vm->PyList_AS_C(args[0]));
  5729. });
  5730. _vm->bindMethod("list", "pop", [](VM* vm, const pkpy::ArgList& args) {
  5731. vm->__checkArgSize(args, 1, true);
  5732. PyVarList& _self = vm->PyList_AS_C(args[0]);
  5733. if(_self.empty()) vm->indexError("pop from empty list");
  5734. PyVar ret = _self.back();
  5735. _self.pop_back();
  5736. return ret;
  5737. });
  5738. _vm->bindMethod("list", "__add__", [](VM* vm, const pkpy::ArgList& args) {
  5739. const PyVarList& _self = vm->PyList_AS_C(args[0]);
  5740. const PyVarList& _obj = vm->PyList_AS_C(args[1]);
  5741. PyVarList _new_list = _self;
  5742. _new_list.insert(_new_list.end(), _obj.begin(), _obj.end());
  5743. return vm->PyList(_new_list);
  5744. });
  5745. _vm->bindMethod("list", "__len__", [](VM* vm, const pkpy::ArgList& args) {
  5746. const PyVarList& _self = vm->PyList_AS_C(args[0]);
  5747. return vm->PyInt(_self.size());
  5748. });
  5749. _vm->bindMethod("list", "__getitem__", [](VM* vm, const pkpy::ArgList& args) {
  5750. const PyVarList& _self = vm->PyList_AS_C(args[0]);
  5751. if(args[1]->isType(vm->_tp_slice)){
  5752. _Slice s = vm->PySlice_AS_C(args[1]);
  5753. s.normalize(_self.size());
  5754. PyVarList _new_list;
  5755. for(size_t i = s.start; i < s.stop; i++)
  5756. _new_list.push_back(_self[i]);
  5757. return vm->PyList(_new_list);
  5758. }
  5759. int _index = (int)vm->PyInt_AS_C(args[1]);
  5760. _index = vm->normalizedIndex(_index, _self.size());
  5761. return _self[_index];
  5762. });
  5763. _vm->bindMethod("list", "__setitem__", [](VM* vm, const pkpy::ArgList& args) {
  5764. PyVarList& _self = vm->PyList_AS_C(args[0]);
  5765. int _index = (int)vm->PyInt_AS_C(args[1]);
  5766. _index = vm->normalizedIndex(_index, _self.size());
  5767. _self[_index] = args[2];
  5768. return vm->None;
  5769. });
  5770. _vm->bindMethod("list", "__delitem__", [](VM* vm, const pkpy::ArgList& args) {
  5771. PyVarList& _self = vm->PyList_AS_C(args[0]);
  5772. int _index = (int)vm->PyInt_AS_C(args[1]);
  5773. _index = vm->normalizedIndex(_index, _self.size());
  5774. _self.erase(_self.begin() + _index);
  5775. return vm->None;
  5776. });
  5777. /************ PyTuple ************/
  5778. _vm->bindMethod("tuple", "__new__", [](VM* vm, const pkpy::ArgList& args) {
  5779. vm->__checkArgSize(args, 1);
  5780. PyVarList _list = vm->PyList_AS_C(vm->call(vm->builtins->attribs["list"], args));
  5781. return vm->PyTuple(_list);
  5782. });
  5783. _vm->bindMethod("tuple", "__iter__", [](VM* vm, const pkpy::ArgList& args) {
  5784. vm->__checkType(args[0], vm->_tp_tuple);
  5785. return vm->PyIter(
  5786. pkpy::make_shared<BaseIterator, VectorIterator>(vm, args[0])
  5787. );
  5788. });
  5789. _vm->bindMethod("tuple", "__len__", [](VM* vm, const pkpy::ArgList& args) {
  5790. const PyVarList& _self = vm->PyTuple_AS_C(args[0]);
  5791. return vm->PyInt(_self.size());
  5792. });
  5793. _vm->bindMethod("tuple", "__getitem__", [](VM* vm, const pkpy::ArgList& args) {
  5794. const PyVarList& _self = vm->PyTuple_AS_C(args[0]);
  5795. int _index = (int)vm->PyInt_AS_C(args[1]);
  5796. _index = vm->normalizedIndex(_index, _self.size());
  5797. return _self[_index];
  5798. });
  5799. /************ PyBool ************/
  5800. _vm->bindMethod("bool", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5801. bool val = vm->PyBool_AS_C(args[0]);
  5802. return vm->PyStr(val ? "True" : "False");
  5803. });
  5804. _vm->bindMethod("bool", "__json__", [](VM* vm, const pkpy::ArgList& args) {
  5805. bool val = vm->PyBool_AS_C(args[0]);
  5806. return vm->PyStr(val ? "true" : "false");
  5807. });
  5808. _vm->bindMethod("bool", "__eq__", [](VM* vm, const pkpy::ArgList& args) {
  5809. return vm->PyBool(args[0] == args[1]);
  5810. });
  5811. _vm->bindMethod("bool", "__xor__", [](VM* vm, const pkpy::ArgList& args) {
  5812. bool _self = vm->PyBool_AS_C(args[0]);
  5813. bool _obj = vm->PyBool_AS_C(args[1]);
  5814. return vm->PyBool(_self ^ _obj);
  5815. });
  5816. _vm->bindMethod("ellipsis", "__repr__", [](VM* vm, const pkpy::ArgList& args) {
  5817. return vm->PyStr("Ellipsis");
  5818. });
  5819. _vm->bindMethod("_native_function", "__call__", [](VM* vm, const pkpy::ArgList& args) {
  5820. const _CppFunc& _self = vm->PyNativeFunction_AS_C(args[0]);
  5821. return _self(vm, args.subList(1));
  5822. });
  5823. _vm->bindMethod("function", "__call__", [](VM* vm, const pkpy::ArgList& args) {
  5824. return vm->call(args[0], args.subList(1));
  5825. });
  5826. _vm->bindMethod("_bounded_method", "__call__", [](VM* vm, const pkpy::ArgList& args) {
  5827. vm->__checkType(args[0], vm->_tp_bounded_method);
  5828. const _BoundedMethod& _self = vm->PyBoundedMethod_AS_C(args[0]);
  5829. pkpy::ArgList newArgs(args.size());
  5830. newArgs[0] = _self.obj;
  5831. for(int i = 1; i < args.size(); i++) newArgs[i] = args[i];
  5832. return vm->call(_self.method, newArgs);
  5833. });
  5834. }
  5835. #ifdef _WIN32
  5836. #define __EXPORT __declspec(dllexport)
  5837. #elif __APPLE__
  5838. #define __EXPORT __attribute__((visibility("default"))) __attribute__((used))
  5839. #else
  5840. #define __EXPORT
  5841. #endif
  5842. void __addModuleTime(VM* vm){
  5843. PyVar mod = vm->newModule("time");
  5844. vm->bindFunc(mod, "time", [](VM* vm, const pkpy::ArgList& args) {
  5845. auto now = std::chrono::high_resolution_clock::now();
  5846. return vm->PyFloat(std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()).count() / 1000000.0);
  5847. });
  5848. vm->bindFunc(mod, "sleep", [](VM* vm, const pkpy::ArgList& args) {
  5849. vm->__checkArgSize(args, 1);
  5850. if(!vm->isIntOrFloat(args[0])){
  5851. vm->typeError("time.sleep() argument must be int or float");
  5852. }
  5853. double sec = vm->numToFloat(args[0]);
  5854. vm->sleepForSecs(sec);
  5855. return vm->None;
  5856. });
  5857. }
  5858. void __addModuleSys(VM* vm){
  5859. PyVar mod = vm->newModule("sys");
  5860. vm->bindFunc(mod, "getrefcount", [](VM* vm, const pkpy::ArgList& args) {
  5861. vm->__checkArgSize(args, 1);
  5862. return vm->PyInt(args[0].use_count());
  5863. });
  5864. vm->bindFunc(mod, "getrecursionlimit", [](VM* vm, const pkpy::ArgList& args) {
  5865. vm->__checkArgSize(args, 0);
  5866. return vm->PyInt(vm->maxRecursionDepth);
  5867. });
  5868. vm->bindFunc(mod, "setrecursionlimit", [](VM* vm, const pkpy::ArgList& args) {
  5869. vm->__checkArgSize(args, 1);
  5870. vm->maxRecursionDepth = (int)vm->PyInt_AS_C(args[0]);
  5871. return vm->None;
  5872. });
  5873. vm->setAttr(mod, "version", vm->PyStr(PK_VERSION));
  5874. }
  5875. void __addModuleJson(VM* vm){
  5876. PyVar mod = vm->newModule("json");
  5877. vm->bindFunc(mod, "loads", [](VM* vm, const pkpy::ArgList& args) {
  5878. vm->__checkArgSize(args, 1);
  5879. const _Str& expr = vm->PyStr_AS_C(args[0]);
  5880. _Code code = compile(vm, expr.c_str(), "<json>", JSON_MODE, false);
  5881. return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals());
  5882. });
  5883. vm->bindFunc(mod, "dumps", [](VM* vm, const pkpy::ArgList& args) {
  5884. vm->__checkArgSize(args, 1);
  5885. return vm->asJson(args[0]);
  5886. });
  5887. }
  5888. void __addModuleMath(VM* vm){
  5889. PyVar mod = vm->newModule("math");
  5890. vm->setAttr(mod, "pi", vm->PyFloat(3.1415926535897932384));
  5891. vm->setAttr(mod, "e" , vm->PyFloat(2.7182818284590452354));
  5892. vm->bindFunc(mod, "log", [](VM* vm, const pkpy::ArgList& args) {
  5893. vm->__checkArgSize(args, 1);
  5894. return vm->PyFloat(log(vm->numToFloat(args[0])));
  5895. });
  5896. vm->bindFunc(mod, "log10", [](VM* vm, const pkpy::ArgList& args) {
  5897. vm->__checkArgSize(args, 1);
  5898. return vm->PyFloat(log10(vm->numToFloat(args[0])));
  5899. });
  5900. vm->bindFunc(mod, "log2", [](VM* vm, const pkpy::ArgList& args) {
  5901. vm->__checkArgSize(args, 1);
  5902. return vm->PyFloat(log2(vm->numToFloat(args[0])));
  5903. });
  5904. vm->bindFunc(mod, "sin", [](VM* vm, const pkpy::ArgList& args) {
  5905. vm->__checkArgSize(args, 1);
  5906. return vm->PyFloat(sin(vm->numToFloat(args[0])));
  5907. });
  5908. vm->bindFunc(mod, "cos", [](VM* vm, const pkpy::ArgList& args) {
  5909. vm->__checkArgSize(args, 1);
  5910. return vm->PyFloat(cos(vm->numToFloat(args[0])));
  5911. });
  5912. vm->bindFunc(mod, "tan", [](VM* vm, const pkpy::ArgList& args) {
  5913. vm->__checkArgSize(args, 1);
  5914. return vm->PyFloat(tan(vm->numToFloat(args[0])));
  5915. });
  5916. vm->bindFunc(mod, "isclose", [](VM* vm, const pkpy::ArgList& args) {
  5917. vm->__checkArgSize(args, 2);
  5918. _Float a = vm->numToFloat(args[0]);
  5919. _Float b = vm->numToFloat(args[1]);
  5920. return vm->PyBool(fabs(a - b) < 1e-6);
  5921. });
  5922. }
  5923. class _PkExported{
  5924. public:
  5925. virtual ~_PkExported() = default;
  5926. virtual void* get() = 0;
  5927. };
  5928. static std::vector<_PkExported*> _pkLookupTable;
  5929. template<typename T>
  5930. class PkExported : public _PkExported{
  5931. T* _ptr;
  5932. public:
  5933. template<typename... Args>
  5934. PkExported(Args&&... args) {
  5935. _ptr = new T(std::forward<Args>(args)...);
  5936. _pkLookupTable.push_back(this);
  5937. }
  5938. ~PkExported() override { delete _ptr; }
  5939. void* get() override { return _ptr; }
  5940. operator T*() { return _ptr; }
  5941. };
  5942. #define pkpy_allocate(T, ...) *(new PkExported<T>(__VA_ARGS__))
  5943. extern "C" {
  5944. __EXPORT
  5945. /// Delete a pointer allocated by `pkpy_xxx_xxx`.
  5946. /// It can be `VM*`, `REPL*`, `ThreadedVM*`, `char*`, etc.
  5947. ///
  5948. /// !!!
  5949. /// If the pointer is not allocated by `pkpy_xxx_xxx`, the behavior is undefined.
  5950. /// For char*, you can also use trivial `delete` in your language.
  5951. /// !!!
  5952. void pkpy_delete(void* p){
  5953. for(int i = 0; i < _pkLookupTable.size(); i++){
  5954. if(_pkLookupTable[i]->get() == p){
  5955. delete _pkLookupTable[i];
  5956. _pkLookupTable.erase(_pkLookupTable.begin() + i);
  5957. return;
  5958. }
  5959. }
  5960. free(p);
  5961. }
  5962. __EXPORT
  5963. /// Run a given source on a virtual machine.
  5964. ///
  5965. /// Return `true` if there is no compile error.
  5966. bool pkpy_vm_exec(VM* vm, const char* source){
  5967. _Code code = compile(vm, source, "main.py");
  5968. if(code == nullptr) return false;
  5969. vm->exec(code);
  5970. return true;
  5971. }
  5972. __EXPORT
  5973. /// Get a global variable of a virtual machine.
  5974. ///
  5975. /// Return a json representing the result.
  5976. /// If the variable is not found, return `nullptr`.
  5977. char* pkpy_vm_get_global(VM* vm, const char* name){
  5978. auto it = vm->_main->attribs.find(name);
  5979. if(it == vm->_main->attribs.end()) return nullptr;
  5980. try{
  5981. _Str _json = vm->PyStr_AS_C(vm->asJson(it->second));
  5982. return strdup(_json.c_str());
  5983. }catch(...){
  5984. return nullptr;
  5985. }
  5986. }
  5987. __EXPORT
  5988. /// Evaluate an expression.
  5989. ///
  5990. /// Return a json representing the result.
  5991. /// If there is any error, return `nullptr`.
  5992. char* pkpy_vm_eval(VM* vm, const char* source){
  5993. _Code code = compile(vm, source, "<eval>", EVAL_MODE);
  5994. if(code == nullptr) return nullptr;
  5995. PyVarOrNull ret = vm->exec(code);
  5996. if(ret == nullptr) return nullptr;
  5997. try{
  5998. _Str _json = vm->PyStr_AS_C(vm->asJson(ret));
  5999. return strdup(_json.c_str());
  6000. }catch(...){
  6001. return nullptr;
  6002. }
  6003. }
  6004. __EXPORT
  6005. /// Create a REPL, using the given virtual machine as the backend.
  6006. REPL* pkpy_new_repl(VM* vm){
  6007. return pkpy_allocate(REPL, vm);
  6008. }
  6009. __EXPORT
  6010. /// Input a source line to an interactive console.
  6011. ///
  6012. /// Return `0` if need more lines,
  6013. /// `1` if execution happened,
  6014. /// `2` if execution skipped (compile error or empty input).
  6015. int pkpy_repl_input(REPL* r, const char* line){
  6016. return r->input(line);
  6017. }
  6018. __EXPORT
  6019. /// Add a source module into a virtual machine.
  6020. ///
  6021. /// Return `true` if there is no complie error.
  6022. bool pkpy_vm_add_module(VM* vm, const char* name, const char* source){
  6023. // compile the module but don't execute it
  6024. _Code code = compile(vm, source, name + _Str(".py"));
  6025. if(code == nullptr) return false;
  6026. vm->addLazyModule(name, code);
  6027. return true;
  6028. }
  6029. void __vm_init(VM* vm){
  6030. __initializeBuiltinFunctions(vm);
  6031. __addModuleSys(vm);
  6032. __addModuleTime(vm);
  6033. __addModuleJson(vm);
  6034. __addModuleMath(vm);
  6035. _Code code = compile(vm, __BUILTINS_CODE, "<builtins>");
  6036. if(code == nullptr) exit(1);
  6037. vm->_exec(code, vm->builtins, {});
  6038. pkpy_vm_add_module(vm, "random", __RANDOM_CODE);
  6039. pkpy_vm_add_module(vm, "os", __OS_CODE);
  6040. }
  6041. __EXPORT
  6042. /// Create a virtual machine.
  6043. VM* pkpy_new_vm(bool use_stdio){
  6044. VM* vm = pkpy_allocate(VM, use_stdio);
  6045. __vm_init(vm);
  6046. return vm;
  6047. }
  6048. __EXPORT
  6049. /// Create a virtual machine that supports asynchronous execution.
  6050. ThreadedVM* pkpy_new_tvm(bool use_stdio){
  6051. ThreadedVM* vm = pkpy_allocate(ThreadedVM, use_stdio);
  6052. __vm_init(vm);
  6053. return vm;
  6054. }
  6055. __EXPORT
  6056. /// Read the standard output and standard error as string of a virtual machine.
  6057. /// The `vm->use_stdio` should be `false`.
  6058. /// After this operation, both stream will be cleared.
  6059. ///
  6060. /// Return a json representing the result.
  6061. char* pkpy_vm_read_output(VM* vm){
  6062. if(vm->use_stdio) return nullptr;
  6063. _StrStream* s_out = (_StrStream*)(vm->_stdout);
  6064. _StrStream* s_err = (_StrStream*)(vm->_stderr);
  6065. _Str _stdout = s_out->str();
  6066. _Str _stderr = s_err->str();
  6067. _StrStream ss;
  6068. ss << '{' << "\"stdout\": " << _stdout.__escape(false);
  6069. ss << ", ";
  6070. ss << "\"stderr\": " << _stderr.__escape(false) << '}';
  6071. s_out->str("");
  6072. s_err->str("");
  6073. return strdup(ss.str().c_str());
  6074. }
  6075. __EXPORT
  6076. /// Get the current state of a threaded virtual machine.
  6077. ///
  6078. /// Return `0` for `THREAD_READY`,
  6079. /// `1` for `THREAD_RUNNING`,
  6080. /// `2` for `THREAD_SUSPENDED`,
  6081. /// `3` for `THREAD_FINISHED`.
  6082. int pkpy_tvm_get_state(ThreadedVM* vm){
  6083. return vm->getState();
  6084. }
  6085. __EXPORT
  6086. /// Set the state of a threaded virtual machine to `THREAD_READY`.
  6087. /// The current state should be `THREAD_FINISHED`.
  6088. void pkpy_tvm_reset_state(ThreadedVM* vm){
  6089. vm->resetState();
  6090. }
  6091. __EXPORT
  6092. /// Read the current JSONRPC request from shared string buffer.
  6093. char* pkpy_tvm_read_jsonrpc_request(ThreadedVM* vm){
  6094. _Str s = vm->readJsonRpcRequest();
  6095. return strdup(s.c_str());
  6096. }
  6097. __EXPORT
  6098. /// Write a JSONRPC response to shared string buffer.
  6099. void pkpy_tvm_write_jsonrpc_response(ThreadedVM* vm, const char* value){
  6100. vm->writeJsonrpcResponse(value);
  6101. }
  6102. __EXPORT
  6103. /// Emit a KeyboardInterrupt signal to stop a running threaded virtual machine.
  6104. void pkpy_tvm_terminate(ThreadedVM* vm){
  6105. vm->terminate();
  6106. }
  6107. __EXPORT
  6108. /// Run a given source on a threaded virtual machine.
  6109. /// The excution will be started in a new thread.
  6110. ///
  6111. /// Return `true` if there is no compile error.
  6112. bool pkpy_tvm_exec_async(VM* vm, const char* source){
  6113. // although this is a method of VM, it's only used in ThreadedVM
  6114. _Code code = compile(vm, source, "main.py");
  6115. if(code == nullptr) return false;
  6116. vm->execAsync(code);
  6117. return true;
  6118. }
  6119. }
  6120. #endif // POCKETPY_H