From 3a8a17ab60ca1e284faedc771107a527fa4fc072 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Thu, 12 Feb 2026 04:28:14 -0600 Subject: [PATCH] mcode->mach --- fold.mach | Bin 30239 -> 157352 bytes fold_new.mach | Bin 0 -> 157352 bytes internal/bootstrap.mach | Bin 7792 -> 18512 bytes internal/engine.mach | Bin 22693 -> 44672 bytes mcode.mach | Bin 51271 -> 150904 bytes meson.build | 1 - parse.cm | 14 +- parse.mach | Bin 54337 -> 202524 bytes qbe.mach | Bin 40178 -> 44737 bytes qbe_emit.mach | Bin 30553 -> 80218 bytes regen.cm | 36 +- source/cell.c | 39 +- source/mach.c | 2576 ++++++++----------------------------- source/mcode.c | 2038 ----------------------------- source/quickjs-internal.h | 40 - source/quickjs.h | 22 - source/runtime.c | 189 +-- streamline.mach | Bin 8382 -> 32631 bytes tokenize.mach | Bin 19226 -> 76339 bytes 19 files changed, 635 insertions(+), 4320 deletions(-) create mode 100644 fold_new.mach delete mode 100644 source/mcode.c diff --git a/fold.mach b/fold.mach index 3b4ec01373ec7038bb7cefa1335de2eb2a1fc408..54952d4c011f215bc3191ecc0bb848a124359c17 100644 GIT binary patch literal 157352 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

3bx0d`$8{XYF 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 BNtO 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

3bx0d`$8{XYF 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 diff --git a/internal/engine.mach b/internal/engine.mach index 3ec759ecba7c77442ea719aeb236c4b65ce1631c..2f76ed144d0c8ff2cfcda86a5aa42cfbc26a7468 100644 GIT binary patch literal 44672 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

X?V>0t+GKl8O! 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 YL!TX@o8!_e80Ebg#SZ3Xphfh501eVe(*OVf literal 22693 zcmb813v^spdGGf*GiP2JNq)()WzT5FmgVu-(!|a~iQ~j^9ylR(Jd%@;Ct@s(?QtZH z7>$yckaF(@E~HJ#rK=PO^l=y5tU{Wu0vF0_@hGJ9mZm@(F1-a>9v5yY?Mg~1l<>&? z{r5R%&PXiN(?8`4;4 zw5_AoI^{QIp?=?~<+HZt#;lE6s?VLYl`b#Ur)O$2r|a$-Dmq0)wYlktF12uE+7eWw z4QF3bxBb^zUYM>ewWm)m*wW4{H5Y7YmT2o!^TU=`RGv-PZp_zh=PtII3+<-uxs$cI zxf8V9@5WjSZ+*_DZq;V$Hgu`}^5yyh9*xml^HgJo?o`JtH7QRcRKK_0I_vf*s9kHd zm!|J)1ie~cm<@d5g2vLc--jAZO7cq~jisvAYB7ekK%6zdK-wy@r|S#%+O}KITw|V2 zwtUr^R!GauQlc$;dcHp245(SCx2Kott$P~~uP$lT7w68}49#VKkmhTR1zY({bKzv; zl&ySbu1SB0Q3+hA&$Ju#uXu8?*=o~tbptVNsNE8QJzz824)EL6rrSm1GKJJ< z>$5g~wmwJ8)O&TP3#wjTobx+!soh+tyM4sA>Zck@ux`*{;#V3r?YG==FZJIuJzu-u zwv6{QRnOeB)PPAu?9y4X&szeT5I5IY@VmR!Y_=^Wr&@Ig5GC!ii~iuk7pGdac^h4C zwHS;`iN2{>2qFqgi}jht$wqy4yl~4BlVyKlram`UI1t2-&(yCh+$qK%A0NNlZ{_`r zlzMEb-d?D|FLoX?9=788{eEOH_iRF#If{}xl(w$)U2*3nTca2J$zIAnAwvt^5-r;*5e(6_-fXak2#LF z;h6FLy}tj&$4s%>XG+z$eVfUClQ>qL9Hq_fG3vX9`X<*9mokNGCaYunjq$1l!YHq* z@~VNK^5nO1Ykl{XVca_3pAY@(eSb3aZ}9zltHvA{FwXV^rZ~0HxW|oIGdXp)IDkP?ohQjnS!QkOn!2Ub*p{($*n;+eK(m4 z!t=QEfqNMDaNsWBE>z8Ak$MZZ-F~~a`E>3J>E7=9W1)Y<_YYJ}?vjBWxl0E|bI!od z-1>piSQ)y@yE6H5Ih`->uH?&mF3Ok3O8N4-(R_K_%a?*?;yofPAY}4hYdIocoQ=11E>r&MtJQ0mO{4k2_$W4-_ zI=NZ=k(+Xdh9{@ChL9{Y7D-4G4aEf z&|B9Nc7x`H4Ld%3V{YpB4TQg#vIcWIt4BQBo+DN3zpQ%HoiwJudf8;D>X_VR?oerG zhPsPwK6l|mAZFH@xallCf=P%3}i>Giu zMZXAtiTf|L zM~J_n{{I91mULg{{dctM?{R;Py1x$1-yrOp{?(gz` z26~<$?itcX*ou3r`5tlKGwUqA5ADK)(`PPqdMz$<))-;G({FLPv(^X)oV3M3;)FxQ zU(LHt-qTLjqUo$Ni-f%#{}S#t?l+KEcsu3)4q?Ab`rpI<4*bGb@C#q3JmFj96~6EE zSR`C@0MLWREDTr-@bQn z()PH!+2RBEKj0355l{vfSbPx0Q}_@{;)l@xgpc4CK1$d}-3=Xl47!DnL!0nPG+p6O zpgY2l`80W-B=3`i3!lOL8FwSt8ek7^AAdtR!r#(9;mf4`GI@lr;Qk6*9AO_aVP9;0 z2N%V%Mz}cUfqpR1g%RAlKn3jUV1jfLu}vN9$1Pk=_<`6Ob44rx)~>*nv0ig!Y_x-e zv81^wwk1H3cgf;v@?K5eZd@DdGuOq20u*@fv^Y%K!=&xT^|2US{fqzIK$;t3Jr+mk zk0Y^62fLBgQq;8#(WC8(cDnWX6ZKgI`o;n6Zs}EH&Mf(cfN2tG!!+VLmm8L#MBH-> z{}ZveS9Tp|H#xKpY-GM}L>6u|1+eoRki^z6by|JeH_g8bL>VcZK2l2CUYK3!8qo`)3)5u z(4gK@;Is^ew(h05yZ5l?&cJqF#tKEvKDADJVDc35Zah=Wc&3<5n2}y*e>qE9 z@>CeQa>jK^9(xhu^KLRz%+j~Lu1WM{dlQ)+$MmF4BAMx-oDE(!X(lpGrj$V+&-9p) zEMa|wWu2_b^RkRO<$1_+wZVh_LQguQiN3mA;`by{VY%2RY`KG!+Z&WiSWvEQTO7MZ zrq6gi?7N`R){{_JzcJZ0qSx_gp9k&b41IDQ8hn~OpC)==!sjaVx~rI)htSooMyg#6 zR|?l4_pX6Eh3kmB4&CrNIQ2Sq57#k)R^vtJgNMQOq`i?zbR)t=ID+6m!r&euEH5O+}S9i+X3e5-LMdi0&d-O0)k;x5wP1>JX zmqNn{`rrgBkT64E2%&)0BnY2qCM!fSBZ!WXxVwMYjXMS08nGj^;E1^x9O^*nyC3DX z7TuLas!|mZKJteINTh@|<|vm^SV2Hk^TZhpx|;Dt7}|?FrW|7;Ay2e8L+X}c7WHsp zZqvv%tIJA^;EzC2E0hh%eGKGtm~Lll?OH^J)*36X7Mj++sa3b*z&u-*nxg40H6srd zQbY2t+o9%_Q1eRI+DDOh1ac`GvHoMJXf7-@=jzkgrz0vZJbFcID`4pAK3fg{s;Cwc=!Io0~bD+Sw}<>Bl<|c)06A#ci3APXN_mdy-d_}FTw`_gskzh zF*BZun{5arG&kdE`S1`ZanJ0gc8#5{S|)f4Yry(0{9?tkJC>sCnk(DB9`yiXzJ&r+ z7i3GP!!CFbTdEoHoQs_VJm$e;v|sD`aLo0jhV*+*qU5Db5q)DM<@Dy#@mMYsk9$2V z2r2rMew*+dcN9aNNq9l}UduxLUW~l(H5-l>%#R_@BoaY>_`*vvEMDvd^U-AJKj^Vo zjWe#>Qp~P&nsM%dKE~6h&yMG78N=5iC_?;Kgp%-jglC9{n57RPa2`T{JcQEzkh$m_ z{3?Pv#II3igstXb@;^-ehspmi`5z|#YWzC+L%acj_XdR9BjkI8e2wk8BO38zt6tM_pV*eeqD7mAq~TvTruM*kc`upBdns3H^(bLcT-wGdoUm*uo}x_j4$sMkDtIy8!^VR%8Jed} zK*`A%>L)FFRopp9{aNbo4QUF(L{l&BJUbR>HqT4!ycw2y3wV@u(?=igp%r)=tnfD2 zr5kT2?CpdJzs;cg*uXny@q3gf{CDEsLHX~*{Z7h#rzr&3&D+Og#63pbW5k7c7h%G? zDgWIpHz6LU-p5&cA16$B4{6>@9m4x?zYnn~{7?MC`w4qLe&K@%!w;gzgb;&C_=zpU zM;zmC#WhgfoYF1fa>QvtgKrDX1&OvoyIBaB6K6AGMpe+5)fzMsa}RnPsg0+R97sTu zgr!nxQ%)c`G$d?^N#l+r-0R0+*L*VWlwrdlE~er71Df;mW?~rr1Zkc?$~=Med4l0s z4T`ZdR!!BD1vAW{cHKW%jk>^gklz4SHoFJuw|wsTI(Xbkl;g(9v)vyht$2Klc?7R+ z@t6mNm=_N>!=FOWjF88@Z58&IPeb&RjMb=_j6g1tbTq*{hSLfF z)^AP1A`{KCYdQO2;=?t3+8Hzv^0j&cm_OC+MB~8nawSu*zW& zY}0TD;8gS6G-0q+8KdkH>T|kvvBb{W-XX9F!k{+x&LBZ>AHYu|)x@R=LT4=z4beo$cbM`7gC)^KG(vU{0Vs<6%g!@U=MXmZ=qjmx{(3aX* zm~O)`OB~9poK9p{xY$Q&UCkBxcKY60t5MVa5AEE8PL2X4P;^4iRg1ai(o(pFwd+M9 zq|WAGG^w+iEl6oMAB)9#$MejXyqgHallfRm;pu!VLwHY&eA&F44dZ+Bu|CE3=VNR1 zUYn1tBi(wX+mLq$^xl|vH|jl@cLzIa^L;Se{V=6)77O|-u$BuCbm2jm@mH{>3$JoE zcJQCcEBqI%=dXt0h1Udlt%Jf7;B|xvuP49okds{jy23KHm`IO0?KGUpu$*o#wIims zv(--E@J>d+`gW=Z%BbQsEv&?@&Ca%1>a7sg1(kC|w||GFK3k|2xQSFyMqfcizqchw zS(RJ7cq+J)5-1YV9pU$Ofg3=}^#bfwXrA;vwjOS?)Z6~0Bo>5_R83!BC(#85|JF?5 z6t^y-G=-C`=Dg0~jM;CA2&P9+>P&Oi*T^j+N}aJ+cV=ehaf(o>F*#|#tS$XJmxv=V zCr~+Js26Ej2uqkKq_T9YD5N=vEkmjj8{ba)?C2FC&AkE58%1+iURLE4xl%HcbT)-+ zVTJZd>e@2X{U+B#yD~lTL<-{4m`swXbS_O;D(xlksLs*tVLco`+P)c9J$s>hJ@M-# z;d60!gH)(o!rhRgT?6b+N^wlZ_^E%(FrB1!=HiKX-iyc26Yk|bkBR86ml{d=SL8f* zy%*7&(yE~qL~HqbnPBf@0>0ltMPcHF_yAj?a4r93-hccbNdL#qUL$;vW3dl1QA2!) z73jmz@nPusurpxs5&R!v;tC(d{ZVIg2OlHd$DBk4+&SV!pf%_9o_D_&6!VvBu z^C{v!g~0igb3qpl;T8^`gHKb>r>Q5zla%`;{t$l(-9CnRNB9i%eukCQ$1dJJ{*3TH zBizR*Zy$e7IX*V<9s`$Jd=`2?i?9nJ9YfGACwwAFC28Rc9Z4dIBrS|~{;~=)f0d0X z=H%FA~K^^v4M`8y8w<9_W6cSqGHHikSuyO2mo5{9iIOfDlgwaGMtCPslTtAK7 zKW!OCcV$Al^uCkV{tP{}D=fwxvsjV*MUQ(nnzVt5q5=iwm}|S}^X%n54`Z*yCi4Zl zEixP91hr61Ix;S+VULhNAEI~Oyk zCGlCzy+S-^2Or}}*pmNE4I#e7wD^)!03)E>fy&chhqXx;_c!;8EIv`a5#ui}o%Z+N zy4>8E0^-pki5R8b+5zXGC(lTPv=mvtifDmFu2>b_O(5R^Sy#}op+ke!Ivexz_1Ol@ z7g3`eVj4`BMVT|L&<)0Kl$u6SAxAmG525sGWq1k`wNf=i)7H00u&dk_`MrN_V zT6iI;jxH~?3(Bl*VQryc`>fy_TE`2A+T222Y@>dJNl-Ud%?{NSl|m7I<^noFvo$+z zttAcr=CsuZq*HTockV><{^|PtT$AmRI#z29BNsJ78jny(Qv0}}EGWws6+fVKO`C=6%W(WKl0^ z)@vip$m{&k>SRSFu(yp#OPWwC3+PmgEth+=9aeL(B(Nv(LjA^*<$hMN7AHCIce49VY8m_ z+{~(SdrIDMX=GjXkhjav7R4LYjPiQf=Ja`#yQzzY9)s2trhRLAgUP3Q(zIv2+OxxR29=J3z(KU!HNJgT{Xej}|JT}d z{m|d%^yjjDJ=pJkcW)p0(2i5exAA=W2D|!4hlgRmuA!d>J&9Y-nedW~IY-6gTHZZ( z(O+H);ylU*m4;!d~2a&9#Idrrd5^4~^Zp0oqpMMlM1LN0FLG zS&AZz;TA4C2RHF$gm8>JA*!^s%H=F!l0KV6FimpMw;EHVd!fEp{LM&b$6EjXWA9tw zm0PGg!WFnz;#SJOl{Vi>zjos`!f&I$ZzH@LchI+YAvk|odSF}oXc5t)#Y%#i?^3Km zzDrTG`i+((U-^@9V8n4QETM<nQ{*{5>{~}x4(MZysX}xyjF8KXfmvrL7Fj*L5k}qi9{-&NV-x* zSv_`XbuFb>4Kld>RXJ5kZSpk_56vU(r9{t8R$tP4xr~>J>S5J}#*sDT?RVBhbaD!L z9y-|qrE)1RlTY-dN?fBPZ=%fYdaXW`eU%3tg>*7SxLZN*wxN6?lOm0a z*3g?zq?G1rFOAlc;S&T-J2n4gS$+jZ&-FOw_@j?>rKau9uAVuFnns*Q$Lh?rt z`-D$4ovn0|0<3TRFg{9_B1EoYYn2>!WAPF-jkx$@PSVaoxP8KPpAXYqL>i6UTM=Au zg~||*vJO3ptbde^(WCAbi?=bVZ-d$pqNbZNO=(TjRn*Bl%RXhcuAP(!(FH;sZ|PDA z{%txP(j^nzFDkQ+h@d}W82<>V65>6ieGlv)ycc%}lCIbfsxR1(OwTWMU2?F!B-z0I zgximbAgZ#PL4W&cI$O`DDEcWz;3?Yu6r2-+EVivGUXM;t5H##kI9r$wKOc-*uFB{_ zecCwN^=aWfTo#qE>6|_L0-A4K<&ec!2Rab9a{xk0SbxLX1{);WULilUM5d$ zMJV=IDs=nTpMrnQfJazoo~E3q8QiC7(9;a0j|+HTeh#S0Hc~5;9@(}78@#{GkF3*C zOQn3&b#(aOmB$^U;Xd3!)kY%WZPldl0f`=!ij{LU{M#Tox4* zhC{cSQ#+r*24~xLsJcxAc10KO`})L1xDHcg#~KjU>#yY6*E54^bA`rIp^gT1Vy>}t znono#>g^A^b)L&Ud@I+*K4cG>1WjeWew0|dw!?x9fv#XM=A47r-7@Q_hk;r5wAm$( z9tz`QLHvLY;o_vZku{DTcU-%FZ`kDwg~DV$qP&FivfED(mo%)Oe%a`yT(@AIWY-+m zuGzbYI!8-k9qAz58qqMK+fAr~8S?CsP%Oj}-i021;+WSyeGDLecDz~bcza|m7{%)4 zw~2ES+om->&8zBW18NG;uKZp$9^6tw#BeUM$_mjZ-u^C<@1NlBe+JJmxX-X6gm@NS zf0lJO#J`aCU*Opg--GA>mH2;UchHURBL=_EJpMjug@42EBgfmv4=C#gNZZx;A>ltH zPl$gfuka)2dycxEV}THUOuC;y?@tI1@iY8C!!JCKTX6Wq!{HN;5HUVUiPK4OK1Yc# zihC59^1^zG=C&UF)#9c{3U)9rgGm<6ObOPGq>luprf5eywo^!loYTkbP0VZSd|^;W z*z0i;NA=YN4&|~hj;|y{Q$kZ5wzxqS?~+6x=f<$% z4c1Z~98rlS*oiorD*iFqPO&SZ617hT4A|Dcn<JOyY`4BBguqUGZBKF9QunaLIfs zna(FMBXy-^s-;TYV50u3s4K-CSkF!~bOO~OQ4F0|!S1PxII0s(r0olCH}!>S_y|3q zl__SA^q?>9Y^Kaic*K_BtDzo-yqB+XLi91reX)%J^1SmLhInQjUkB0fuoZf?#x_{wpeu)3 zo{O!s;5^^tp-mWuo^7P}F~Gaf!FJMZhpj`5K*vZd*8yE-AMuVJv8sMsVVa-Sn7Jon zPjLvdL|aDx7a^3v?wqXV<~V~T&Lh}(53-f9;nwJsq0~n|Z@$$A zdtxz=1)Dk`shv0>Rq{u)$fp=e-%sh~?z_>?m@;1$UJed-p!A|&y4{SDc#vG^7<7jg;?#)il40DzjqC$FMuaoUSE!CsegwLv$Nxsk5?$L#Edk0m_c+zUQXVLQb zn%m!`jq73&N_{d^@QajPWJ9Fydm_gmMVy?|fUHqWrm~u2wg3 zn9Vg5h``dOE@UJ8qB7G*1fOAa&oJWMxQDP1B(avXa9Ni>YJh0BT&lZ5OQE`~c@Q3~ z`KNA5$8Y5XzXl}rSqEN4f_>G}m1?Q8Sgz-A{RS0~gOjZ~XelST>dB!~=OCwZ7~@K< z*0jVSLp~Aj9Q-J}j0U5&KEkz$N4O5rjsM1gy^;35k+?T<0^N<@ApAFp z|4nAgYP^ZKH<9N}uvv)TBJ8aUSO}`Lav>{6@I-xQl^}JDFM2iloiqMmbGVDJLvu`` z*|Tg{_`M{1H!IjHut(q)qs|NcySCU$__3`Hm}6<0Mpnv z{7TGQv27HtGISOcuGok(i$Wv^nyVwSPL3T0n~;;(W?DMB9iXa_1!@=Hbrnh=U*GBU(6Gt7FImpTL{R};K8P`a? zd@Rlla_2^gg92ZR>oQA`4-R~_JsHz?N8*=nbIHWVdh-uV?-1WX2LB^`^j+=&h4?4@ z!asv&;E!hz1;VqqpQW5i){#sw<8eto$VZq5K-5uKddc zwjdn=A%M+-xk{j2PRDKEghnC_47VS4|DtRiJ6wSSe+|vJ?Rgb!9kP`aDPRBw(EcM> zZZA~lz=~YtL!P2z`F1(e}V3qPRKg&)$fKf?bb+}(JN@aLFV!jEzPlmYoE?w>k^^WtZu`5E!T z^SJqP4)lO^VABfF>=lz#gBSixTQqQX;q8vnyr8?d_=tIzZQ}&}s4h%WRT4>^WH%pz zU|U7F#44}V`c{?S3Ablg@Jc@y97+_bWd9JBUz1C$N!`y1k zr#fY1;qZT-UYuX%y6fp2}=v-sOX}U4M_6xqQ_l0JGL|BPV@#}>C zu2Vna=bwNgHqW+CqxZ~`h8r>axDjJYS&Rf(XWvMlb1k2sv+`x_WD=(ZX`C>P$7lGY z;d67+5I>%kQk}KhNRiLsi+z{{`kivQk2IV+R^YjE7Rg7Ks?lmou@|Ee>B_y1vo@RV zEoIqqC1Yu>QSn7AcdM~avhbMUUa!ye@ik|*w@>x!bAGRvrH(ULmFam@-kT)eqYQel zmlG~N(Jv%=v!m)W@+Nw@Wz^@m!`VJh;STLfq|@2azkB|9eZ`zhx#>}cN}I9@acEOn z()Z+g`+De`Ea#(H$~>4Sul+fJK4$}Gtk+KTIeqqAReix-@M5+f+7Ryap`}ef8Ng@y z^xwGG$DQ|nwxYpL7nJy&8+1 zN6jQZe=~)tWr{oZQ{;(|$DKFFiN6`#0&XS#R*X~KcnOB5+t6rl$I#?s18-rd3p;R^ zL8XH`C@aDc?(H4iiE-*q%D5B5*qzWI+{Mr7gqVhw>DcA~W9DV}g*y4VaT339nz~M7 zuRTpUtI;4|gSZC9uMlSlJA>Kj4C&86SBQHsQ_W#0o5SEH%;Od`Wi^Y%O5qa;3WX>J z;htc7xxy?p7288EUkna)p!6zDQ#gF0(o~n7=l)N51R_BKTgqqxD*$y|gBszM7}d}% w^A6{?`?SU)hEuGuovY$CdZ;gE1E~28+W-In diff --git a/mcode.mach b/mcode.mach index f5227053df5540e34b380cbdd5ecdbd0727cfea6..45d0685b199a64b22649631f6f977c8d97360e2a 100644 GIT binary patch literal 150904 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%0DO_A>VXY%g>FUG3!z+RHB5%P#82 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 Ordl=%|4y$m=KljH^9?ru diff --git a/qbe_emit.mach b/qbe_emit.mach index 7a41d10584a6908334a7e65c28094ed95dae3fc9..c14c23d3e8104472f2ce950bd8025e21670eb4d3 100644 GIT binary patch literal 80218 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 0) { + ei = 0 + while (ei < length(errs)) { + e = errs[ei] + if (e.line != null) { + print(`${entry.src}:${text(e.line)}:${text(e.column)}: error: ${e.message}`) + } else { + print(`${entry.src}: error: ${e.message}`) + } + ei = ei + 1 + } + had_errors = true + i = i + 1 + continue + } folded = fold(ast) - ast_json = json.encode(folded) - bytecode = mach_compile_ast(entry.name, ast_json) + compiled = mcode(folded) + optimized = streamline(compiled) + mcode_json = json.encode(optimized) + bytecode = mach_compile_mcode_bin(entry.name, mcode_json) f = fd.open(entry.out, "w") fd.write(f, bytecode) fd.close(f) print(`wrote ${entry.out}`) i = i + 1 } +if (had_errors) { + print("regen aborted: fix errors above") +} diff --git a/source/cell.c b/source/cell.c index e28f18df..5937b01d 100644 --- a/source/cell.c +++ b/source/cell.c @@ -12,7 +12,6 @@ #include "cJSON.h" #define BOOTSTRAP_MACH "internal/bootstrap.mach" -#define BOOTSTRAP_AST "internal/bootstrap.ast.json" #define BOOTSTRAP_SRC "internal/bootstrap.cm" #define CELL_SHOP_DIR ".cell" #define CELL_CORE_DIR "packages/core" @@ -179,14 +178,9 @@ void script_startup(cell_rt *prt) cell_rt *crt = JS_GetContextOpaque(js); JS_FreeValue(js, js_blob_use(js)); - // Load pre-compiled bootstrap bytecode (.mach), fall back to AST JSON + // Load pre-compiled bootstrap bytecode (.mach) size_t boot_size; - int boot_is_bin = 1; char *boot_data = load_core_file(BOOTSTRAP_MACH, &boot_size); - if (!boot_data) { - boot_is_bin = 0; - boot_data = load_core_file(BOOTSTRAP_AST, &boot_size); - } if (!boot_data) { printf("ERROR: Could not load bootstrap from %s!\n", core_path); return; @@ -225,17 +219,8 @@ void script_startup(cell_rt *prt) // Run through MACH VM crt->state = ACTOR_RUNNING; - JSValue v; - if (boot_is_bin) { - v = JS_RunMachBin(js, (const uint8_t *)boot_data, boot_size, hidden_env); - free(boot_data); - } else { - cJSON *ast = cJSON_Parse(boot_data); - free(boot_data); - if (!ast) { printf("ERROR: Failed to parse bootstrap AST\n"); return; } - v = JS_RunMachTree(js, ast, hidden_env); - cJSON_Delete(ast); - } + JSValue v = JS_RunMachBin(js, (const uint8_t *)boot_data, boot_size, hidden_env); + free(boot_data); uncaught_exception(js, v); crt->state = ACTOR_IDLE; set_actor_state(crt); @@ -359,12 +344,7 @@ int cell_init(int argc, char **argv) actor_initialize(); size_t boot_size; - int boot_is_bin = 1; char *boot_data = load_core_file(BOOTSTRAP_MACH, &boot_size); - if (!boot_data) { - boot_is_bin = 0; - boot_data = load_core_file(BOOTSTRAP_AST, &boot_size); - } if (!boot_data) { printf("ERROR: Could not load bootstrap from %s\n", core_path); return 1; @@ -433,17 +413,8 @@ int cell_init(int argc, char **argv) JS_SetPropertyStr(ctx, hidden_env, "args", args_arr); hidden_env = JS_Stone(ctx, hidden_env); - JSValue result; - if (boot_is_bin) { - result = JS_RunMachBin(ctx, (const uint8_t *)boot_data, boot_size, hidden_env); - free(boot_data); - } else { - cJSON *ast = cJSON_Parse(boot_data); - free(boot_data); - if (!ast) { printf("Failed to parse bootstrap AST\n"); JS_FreeContext(ctx); JS_FreeRuntime(g_runtime); return 1; } - result = JS_RunMachTree(ctx, ast, hidden_env); - cJSON_Delete(ast); - } + JSValue result = JS_RunMachBin(ctx, (const uint8_t *)boot_data, boot_size, hidden_env); + free(boot_data); int exit_code = 0; if (JS_IsException(result)) { diff --git a/source/mach.c b/source/mach.c index 4c1f489a..757035d7 100644 --- a/source/mach.c +++ b/source/mach.c @@ -61,161 +61,8 @@ typedef struct MachCode { uint16_t disruption_pc; /* start of disruption handler (0 = none) */ } MachCode; -/* ---- Compiler state ---- */ +/* ---- Helpers ---- */ -typedef struct MachCompState { - /* Instruction buffer (growable) */ - MachInstr32 *code; - int code_count; - int code_capacity; - - /* Constant pool (raw entries, no GC objects) */ - MachCPoolEntry *cpool; - int cpool_count; - int cpool_capacity; - - /* Nested functions */ - MachCode **functions; - int func_count; - int func_capacity; - - /* Variables */ - MachVarInfo *vars; - int var_count; - int var_capacity; - - /* Register allocation (Lua-style) */ - int freereg; /* next free register */ - int maxreg; /* high-water mark */ - int nr_args; /* parameter count */ - - /* Loop labels for break/continue */ - int loop_break; /* instruction index to patch, or -1 */ - int loop_continue; /* instruction index to patch, or -1 */ - - /* Named label stack for labeled break/continue */ -#define MACH_MAX_LABELS 8 - struct { - const char *name; - int break_chain; - int continue_chain; - } labels[MACH_MAX_LABELS]; - int label_count; - int pending_label; /* label index associated with next loop, or -1 */ - - /* Parent for nested function compilation */ - struct MachCompState *parent; - - /* AST semantic annotations */ - int function_nr; /* current function number (0=program body) */ - cJSON *scopes; /* pointer to AST "scopes" array (not owned) */ - - /* Error tracking */ - int has_error; - - /* Line tracking for debug info */ - int cur_line, cur_col; - MachLineEntry *line_info; /* growable, parallel to code[] */ - int line_capacity; - const char *filename; /* pointer into AST cJSON (not owned) */ -} MachCompState; - -/* Forward declarations */ -static int mach_compile_expr(MachCompState *cs, cJSON *node, int dest); -static void mach_compile_stmt(MachCompState *cs, cJSON *stmt); - -/* ---- Compiler helpers ---- */ - -static void mach_set_pos(MachCompState *cs, cJSON *node) { - cJSON *r = cJSON_GetObjectItemCaseSensitive(node, "from_row"); - cJSON *c = cJSON_GetObjectItemCaseSensitive(node, "from_column"); - if (r) cs->cur_line = (int)r->valuedouble + 1; - if (c) cs->cur_col = (int)c->valuedouble + 1; -} - -static void mach_emit(MachCompState *cs, MachInstr32 instr) { - if (cs->code_count >= cs->code_capacity) { - int new_cap = cs->code_capacity ? cs->code_capacity * 2 : 64; - cs->code = sys_realloc(cs->code, new_cap * sizeof(MachInstr32)); - cs->code_capacity = new_cap; - } - if (cs->code_count >= cs->line_capacity) { - int new_cap = cs->line_capacity ? cs->line_capacity * 2 : 64; - cs->line_info = sys_realloc(cs->line_info, new_cap * sizeof(MachLineEntry)); - cs->line_capacity = new_cap; - } - cs->line_info[cs->code_count] = (MachLineEntry){cs->cur_line, cs->cur_col}; - cs->code[cs->code_count++] = instr; -} - -static int mach_current_pc(MachCompState *cs) { - return cs->code_count; -} - -/* Reserve a register at freereg */ -static int mach_reserve_reg(MachCompState *cs) { - int r = cs->freereg++; - if (cs->freereg > cs->maxreg) cs->maxreg = cs->freereg; - return r; -} - -/* Free temporary registers back to a saved freereg level */ -static void mach_free_reg_to(MachCompState *cs, int saved) { - cs->freereg = saved; -} - -/* Add an integer constant to the pool, return its index */ -static int mach_cpool_add_int(MachCompState *cs, int32_t val) { - for (int i = 0; i < cs->cpool_count; i++) { - MachCPoolEntry *e = &cs->cpool[i]; - if (e->type == MACH_CP_INT && e->ival == val) return i; - } - if (cs->cpool_count >= cs->cpool_capacity) { - int new_cap = cs->cpool_capacity ? cs->cpool_capacity * 2 : 16; - cs->cpool = sys_realloc(cs->cpool, new_cap * sizeof(MachCPoolEntry)); - cs->cpool_capacity = new_cap; - } - cs->cpool[cs->cpool_count] = (MachCPoolEntry){ .type = MACH_CP_INT, .ival = val }; - return cs->cpool_count++; -} - -/* Add a float constant to the pool, return its index */ -static int mach_cpool_add_float(MachCompState *cs, double val) { - for (int i = 0; i < cs->cpool_count; i++) { - MachCPoolEntry *e = &cs->cpool[i]; - if (e->type == MACH_CP_FLOAT && e->fval == val) return i; - } - if (cs->cpool_count >= cs->cpool_capacity) { - int new_cap = cs->cpool_capacity ? cs->cpool_capacity * 2 : 16; - cs->cpool = sys_realloc(cs->cpool, new_cap * sizeof(MachCPoolEntry)); - cs->cpool_capacity = new_cap; - } - cs->cpool[cs->cpool_count] = (MachCPoolEntry){ .type = MACH_CP_FLOAT, .fval = val }; - return cs->cpool_count++; -} - -/* Add a string constant, return its cpool index */ -static int mach_cpool_add_str(MachCompState *cs, const char *str) { - /* Check for existing identical string */ - for (int i = 0; i < cs->cpool_count; i++) { - MachCPoolEntry *e = &cs->cpool[i]; - if (e->type == MACH_CP_STR && strcmp(e->str, str) == 0) - return i; - } - if (cs->cpool_count >= cs->cpool_capacity) { - int new_cap = cs->cpool_capacity ? cs->cpool_capacity * 2 : 16; - cs->cpool = sys_realloc(cs->cpool, new_cap * sizeof(MachCPoolEntry)); - cs->cpool_capacity = new_cap; - } - char *dup = sys_malloc(strlen(str) + 1); - memcpy(dup, str, strlen(str) + 1); - cs->cpool[cs->cpool_count] = (MachCPoolEntry){ .type = MACH_CP_STR, .str = dup }; - return cs->cpool_count++; -} - -/* Convert compile-time cpool entries to JSValue array for JSCodeRegister. - Caller takes ownership of the returned array. Frees the raw entries. - Strings are interned into stone memory (no GC allocation). */ static JSValue *mach_materialize_cpool(JSContext *ctx, MachCPoolEntry *entries, int count) { if (count == 0) { sys_free(entries); return NULL; } JSValue *cpool = js_malloc_rt(count * sizeof(JSValue)); @@ -235,1744 +82,6 @@ static JSValue *mach_materialize_cpool(JSContext *ctx, MachCPoolEntry *entries, return cpool; } -/* Add a variable */ -static void mach_add_var(MachCompState *cs, const char *name, int slot, int is_const) { - if (cs->var_count >= cs->var_capacity) { - int new_cap = cs->var_capacity ? cs->var_capacity * 2 : 16; - cs->vars = sys_realloc(cs->vars, new_cap * sizeof(MachVarInfo)); - cs->var_capacity = new_cap; - } - MachVarInfo *v = &cs->vars[cs->var_count++]; - v->name = sys_malloc(strlen(name) + 1); - strcpy(v->name, name); - v->slot = slot; - v->is_const = is_const; - v->is_closure = 0; -} - -/* Find a variable in the current scope */ -static int mach_find_var(MachCompState *cs, const char *name) { - for (int i = cs->var_count - 1; i >= 0; i--) { - if (strcmp(cs->vars[i].name, name) == 0) - return cs->vars[i].slot; - } - return -1; -} - -/* Add a nested function, return its index */ -static int mach_add_function(MachCompState *cs, MachCode *fn) { - if (cs->func_count >= cs->func_capacity) { - int new_cap = cs->func_capacity ? cs->func_capacity * 2 : 4; - cs->functions = sys_realloc(cs->functions, new_cap * sizeof(MachCode*)); - cs->func_capacity = new_cap; - } - cs->functions[cs->func_count] = fn; - return cs->func_count++; -} - -/* Find the scope record for a given function_nr in the scopes array */ -cJSON *mach_find_scope_record(cJSON *scopes, int function_nr) { - if (!scopes) return NULL; - int count = cJSON_GetArraySize(scopes); - for (int i = 0; i < count; i++) { - cJSON *scope = cJSON_GetArrayItem(scopes, i); - cJSON *fn_nr = cJSON_GetObjectItemCaseSensitive(scope, "function_nr"); - if (fn_nr && (int)cJSON_GetNumberValue(fn_nr) == function_nr) - return scope; - } - return NULL; -} - -/* Scan AST scope record for variable declarations. - Variables are direct keys on the scope object with a "make" field. */ -static void mach_scan_scope(MachCompState *cs) { - cJSON *scope = mach_find_scope_record(cs->scopes, cs->function_nr); - if (!scope) return; - cJSON *v; - cJSON_ArrayForEach(v, scope) { - const char *name = v->string; - if (!name || strcmp(name, "function_nr") == 0 || strcmp(name, "nr_close_slots") == 0) continue; - const char *make = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(v, "make")); - if (!make || strcmp(make, "input") == 0) continue; - if (mach_find_var(cs, name) < 0) { - int is_const = (strcmp(make, "def") == 0 || strcmp(make, "function") == 0); - int slot = mach_reserve_reg(cs); - mach_add_var(cs, name, slot, is_const); - } - } -} - -/* ---- Expression compiler ---- */ - -/* Compile an expression into register dest. If dest < 0, allocate a temp. - Returns the register containing the result. */ -static int mach_compile_expr(MachCompState *cs, cJSON *node, int dest) { - if (!node) { - if (dest < 0) dest = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADNULL, dest, 0)); - return dest; - } - - mach_set_pos(cs, node); - const char *kind = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(node, "kind")); - if (!kind) { - if (dest < 0) dest = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADNULL, dest, 0)); - return dest; - } - - /* Number literal */ - if (strcmp(kind, "number") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - cJSON *num = cJSON_GetObjectItemCaseSensitive(node, "number"); - if (num && cJSON_IsNumber(num)) { - double dval = num->valuedouble; - int ival = (int)dval; - if (dval == (double)ival && ival >= -32768 && ival <= 32767) { - /* Small integer: use LOADI */ - mach_emit(cs, MACH_AsBx(MACH_LOADI, dest, (int16_t)ival)); - } else { - /* Large number: use constant pool */ - int ki; - if (dval == (double)(int32_t)dval) - ki = mach_cpool_add_int(cs, (int32_t)dval); - else - ki = mach_cpool_add_float(cs, dval); - mach_emit(cs, MACH_ABx(MACH_LOADK, dest, ki)); - } - } else { - mach_emit(cs, MACH_AsBx(MACH_LOADI, dest, 0)); - } - return dest; - } - - /* String literal */ - if (strcmp(kind, "string") == 0 || strcmp(kind, "text") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - const char *val = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(node, "value")); - if (val) { - int ki = mach_cpool_add_str(cs, val); - mach_emit(cs, MACH_ABx(MACH_LOADK, dest, ki)); - } else { - int ki = mach_cpool_add_str(cs, ""); - mach_emit(cs, MACH_ABx(MACH_LOADK, dest, ki)); - } - return dest; - } - - /* Template literal with expressions: kind="text literal" - Format: value = "hello {0} world {1}", list = [expr0, expr1] - Compile as: format(fmt_string, [expr0, expr1, ...]) */ - if (strcmp(kind, "text literal") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - int save_freereg = cs->freereg; - - cJSON *list = cJSON_GetObjectItemCaseSensitive(node, "list"); - int nexpr = list ? cJSON_GetArraySize(list) : 0; - - /* Reserve consecutive regs for call: [format_fn, fmt_str, arr] */ - int call_base = mach_reserve_reg(cs); - int arg1_reg = mach_reserve_reg(cs); - int arg2_reg = mach_reserve_reg(cs); - - /* Reserve consecutive regs for NEWARRAY: arr_reg, then elem slots */ - int arr_base = mach_reserve_reg(cs); - for (int i = 0; i < nexpr; i++) mach_reserve_reg(cs); - /* Now arr_base+1..arr_base+nexpr are the element slots */ - - /* Compile expressions into arr_base+1..arr_base+nexpr */ - for (int i = 0; i < nexpr; i++) { - cJSON *expr = cJSON_GetArrayItem(list, i); - int slot = arr_base + 1 + i; - int r = mach_compile_expr(cs, expr, slot); - if (r != slot) mach_emit(cs, MACH_ABC(MACH_MOVE, slot, r, 0)); - } - - /* Create array from consecutive element regs */ - mach_emit(cs, MACH_ABC(MACH_NEWARRAY, arr_base, nexpr, 0)); - - /* Load format function */ - int ki_format = mach_cpool_add_str(cs, "format"); - mach_emit(cs, MACH_ABx(MACH_GETINTRINSIC, call_base, ki_format)); - - /* Load format string */ - const char *fmt = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(node, "value")); - int ki_fmt = mach_cpool_add_str(cs, fmt ? fmt : ""); - mach_emit(cs, MACH_ABx(MACH_LOADK, arg1_reg, ki_fmt)); - - /* Move array to arg2 position */ - mach_emit(cs, MACH_ABC(MACH_MOVE, arg2_reg, arr_base, 0)); - - /* Call format(fmt, arr) */ - mach_emit(cs, MACH_ABC(MACH_CALL, call_base, 2, 1)); - - mach_free_reg_to(cs, save_freereg); - if (dest != call_base) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, call_base, 0)); - return dest; - } - - /* Boolean/null literals */ - if (strcmp(kind, "true") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADTRUE, dest, 0)); - return dest; - } - if (strcmp(kind, "false") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADFALSE, dest, 0)); - return dest; - } - if (strcmp(kind, "null") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADNULL, dest, 0)); - return dest; - } - - /* Name (variable reference) */ - if (strcmp(kind, "name") == 0) { - const char *name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(node, "name")); - if (name) { - cJSON *level_node = cJSON_GetObjectItemCaseSensitive(node, "level"); - int level = level_node ? (int)cJSON_GetNumberValue(level_node) : -1; - - if (level == 0) { - /* Local variable */ - int slot = mach_find_var(cs, name); - if (slot >= 0) { - if (dest >= 0 && dest != slot) { - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, slot, 0)); - return dest; - } - return slot; - } - } else if (level > 0) { - /* Closure variable — walk parent compiler states for slot */ - MachCompState *target = cs; - for (int i = 0; i < level; i++) target = target->parent; - int slot = mach_find_var(target, name); - if (dest < 0) dest = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABC(MACH_GETUP, dest, level, slot)); - return dest; - } - /* Unbound or fallback — emit placeholder, patched at link time */ - if (dest < 0) dest = mach_reserve_reg(cs); - int ki = mach_cpool_add_str(cs, name); - mach_emit(cs, MACH_ABx(MACH_GETNAME, dest, ki)); - return dest; - } - if (dest < 0) dest = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADNULL, dest, 0)); - return dest; - } - - /* Function call: kind="(" */ - if (strcmp(kind, "(") == 0) { - cJSON *fn_expr = cJSON_GetObjectItemCaseSensitive(node, "expression"); - cJSON *args = cJSON_GetObjectItemCaseSensitive(node, "list"); - int nargs = args ? cJSON_GetArraySize(args) : 0; - - /* Check if this is a method call: obj.method(args) or obj[key](args) */ - const char *fn_kind = NULL; - if (fn_expr) - fn_kind = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(fn_expr, "kind")); - - /* Functino: inline operator call */ - if (fn_kind && strcmp(fn_kind, "name") == 0) { - const char *fn_make = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(fn_expr, "make")); - if (fn_make && strcmp(fn_make, "functino") == 0) { - const char *fname = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(fn_expr, "name")); - if (dest < 0) dest = mach_reserve_reg(cs); - - if (strcmp(fname, "~!") == 0) { - int save = cs->freereg; - int r = mach_compile_expr(cs, cJSON_GetArrayItem(args, 0), -1); - mach_emit(cs, MACH_ABC(MACH_BNOT, dest, r, 0)); - mach_free_reg_to(cs, save); - return dest; - } - if (strcmp(fname, "[]!") == 0) { - int save = cs->freereg; - int r0 = mach_compile_expr(cs, cJSON_GetArrayItem(args, 0), -1); - if (cs->freereg <= r0) cs->freereg = r0 + 1; - int r1 = mach_compile_expr(cs, cJSON_GetArrayItem(args, 1), -1); - mach_emit(cs, MACH_ABC(MACH_GETINDEX, dest, r0, r1)); - mach_free_reg_to(cs, save); - return dest; - } - if ((strcmp(fname, "=!") == 0 || strcmp(fname, "!=!") == 0) && nargs == 3) { - int save = cs->freereg; - int base = mach_reserve_reg(cs); - int r0 = mach_compile_expr(cs, cJSON_GetArrayItem(args, 0), base); - if (r0 != base) mach_emit(cs, MACH_ABC(MACH_MOVE, base, r0, 0)); - int r1_reg = mach_reserve_reg(cs); - int r1 = mach_compile_expr(cs, cJSON_GetArrayItem(args, 1), r1_reg); - if (r1 != r1_reg) mach_emit(cs, MACH_ABC(MACH_MOVE, r1_reg, r1, 0)); - int r2_reg = mach_reserve_reg(cs); - int r2 = mach_compile_expr(cs, cJSON_GetArrayItem(args, 2), r2_reg); - if (r2 != r2_reg) mach_emit(cs, MACH_ABC(MACH_MOVE, r2_reg, r2, 0)); - MachOpcode top = (strcmp(fname, "=!") == 0) ? MACH_EQ_TOL : MACH_NEQ_TOL; - mach_emit(cs, MACH_ABC(top, dest, base, 3)); - mach_free_reg_to(cs, save); - return dest; - } - if (strcmp(fname, "&&!") == 0) { - int save = cs->freereg; - int r0 = mach_compile_expr(cs, cJSON_GetArrayItem(args, 0), -1); - if (cs->freereg <= r0) cs->freereg = r0 + 1; - int r1 = mach_compile_expr(cs, cJSON_GetArrayItem(args, 1), -1); - /* Non-short-circuiting: if left is falsy, result=left, else result=right */ - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, r0, 0)); - int jmp_pc = mach_current_pc(cs); - mach_emit(cs, MACH_AsBx(MACH_JMPFALSE, dest, 0)); - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, r1, 0)); - { - int offset = mach_current_pc(cs) - (jmp_pc + 1); - cs->code[jmp_pc] = MACH_AsBx(MACH_GET_OP(cs->code[jmp_pc]), dest, (int16_t)offset); - } - mach_free_reg_to(cs, save); - return dest; - } - if (strcmp(fname, "||!") == 0) { - int save = cs->freereg; - int r0 = mach_compile_expr(cs, cJSON_GetArrayItem(args, 0), -1); - if (cs->freereg <= r0) cs->freereg = r0 + 1; - int r1 = mach_compile_expr(cs, cJSON_GetArrayItem(args, 1), -1); - /* Non-short-circuiting: if left is truthy, result=left, else result=right */ - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, r0, 0)); - int jmp_pc = mach_current_pc(cs); - mach_emit(cs, MACH_AsBx(MACH_JMPTRUE, dest, 0)); - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, r1, 0)); - { - int offset = mach_current_pc(cs) - (jmp_pc + 1); - cs->code[jmp_pc] = MACH_AsBx(MACH_GET_OP(cs->code[jmp_pc]), dest, (int16_t)offset); - } - mach_free_reg_to(cs, save); - return dest; - } - /* Standard 2-arg binary functino */ - { - int save = cs->freereg; - int r0 = mach_compile_expr(cs, cJSON_GetArrayItem(args, 0), -1); - if (cs->freereg <= r0) cs->freereg = r0 + 1; - int r1 = mach_compile_expr(cs, cJSON_GetArrayItem(args, 1), -1); - MachOpcode op; - if (strcmp(fname, "+!") == 0) op = MACH_ADD; - else if (strcmp(fname, "-!") == 0) op = MACH_SUB; - else if (strcmp(fname, "*!") == 0) op = MACH_MUL; - else if (strcmp(fname, "/!") == 0) op = MACH_DIV; - else if (strcmp(fname, "%!") == 0) op = MACH_MOD; - else if (strcmp(fname, "**!") == 0) op = MACH_POW; - else if (strcmp(fname, "!") == 0) op = MACH_GT; - else if (strcmp(fname, "<=!") == 0) op = MACH_LE; - else if (strcmp(fname, ">=!") == 0) op = MACH_GE; - else if (strcmp(fname, "=!") == 0) op = MACH_EQ; - else if (strcmp(fname, "!=!") == 0) op = MACH_NEQ; - else if (strcmp(fname, "&!") == 0) op = MACH_BAND; - else if (strcmp(fname, "|!") == 0) op = MACH_BOR; - else if (strcmp(fname, "^!") == 0) op = MACH_BXOR; - else if (strcmp(fname, "<>!") == 0) op = MACH_SHR; - else op = MACH_USHR; /* >>>! */ - mach_emit(cs, MACH_ABC(op, dest, r0, r1)); - mach_free_reg_to(cs, save); - return dest; - } - } - } - - if (fn_kind && strcmp(fn_kind, ".") == 0) { - /* Method call with dot notation: obj.method(args) */ - int save_freereg = cs->freereg; - int base = mach_reserve_reg(cs); /* R(base) = obj */ - if (dest < 0) dest = base; - mach_reserve_reg(cs); /* R(base+1) = temp slot for VM */ - - /* Compile obj into base */ - cJSON *obj_expr = cJSON_GetObjectItemCaseSensitive(fn_expr, "expression"); - if (!obj_expr) obj_expr = cJSON_GetObjectItemCaseSensitive(fn_expr, "left"); - int obj_r = mach_compile_expr(cs, obj_expr, base); - if (obj_r != base) - mach_emit(cs, MACH_ABC(MACH_MOVE, base, obj_r, 0)); - - /* Extract property name */ - cJSON *prop = cJSON_GetObjectItemCaseSensitive(fn_expr, "name"); - if (!prop) prop = cJSON_GetObjectItemCaseSensitive(fn_expr, "right"); - const char *prop_name = NULL; - if (cJSON_IsString(prop)) prop_name = cJSON_GetStringValue(prop); - else if (prop) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(prop, "value")); - if (!prop_name && prop) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(prop, "name")); - if (!prop_name) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(fn_expr, "value")); - if (!prop_name) prop_name = "unknown"; - - int ki = mach_cpool_add_str(cs, prop_name); - - /* If ki overflows 8-bit C field, load key into R(base+1) register */ - if (ki >= 0xFF) { - mach_emit(cs, MACH_ABx(MACH_LOADK, base + 1, ki)); - } - - /* Compile args into R(base+2)..R(base+1+nargs) */ - for (int i = 0; i < nargs; i++) { - int arg_reg = mach_reserve_reg(cs); - cJSON *arg = cJSON_GetArrayItem(args, i); - int r = mach_compile_expr(cs, arg, arg_reg); - if (r != arg_reg) - mach_emit(cs, MACH_ABC(MACH_MOVE, arg_reg, r, 0)); - } - - mach_emit(cs, MACH_ABC(MACH_CALLMETHOD, base, nargs, ki >= 0xFF ? 0xFF : ki)); - mach_free_reg_to(cs, save_freereg); - if (dest >= 0 && dest != base) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, base, 0)); - else - dest = base; - return dest; - } - - if (fn_kind && strcmp(fn_kind, "[") == 0) { - /* Method call with bracket notation: obj[expr](args) */ - int save_freereg = cs->freereg; - int base = mach_reserve_reg(cs); /* R(base) = obj */ - if (dest < 0) dest = base; - int key_reg = mach_reserve_reg(cs); /* R(base+1) = key */ - - /* Compile obj into base */ - cJSON *obj_expr = cJSON_GetObjectItemCaseSensitive(fn_expr, "expression"); - if (!obj_expr) obj_expr = cJSON_GetObjectItemCaseSensitive(fn_expr, "left"); - int obj_r = mach_compile_expr(cs, obj_expr, base); - if (obj_r != base) - mach_emit(cs, MACH_ABC(MACH_MOVE, base, obj_r, 0)); - - /* Compile key expr into R(base+1) */ - cJSON *idx_expr = cJSON_GetObjectItemCaseSensitive(fn_expr, "index"); - if (!idx_expr) idx_expr = cJSON_GetObjectItemCaseSensitive(fn_expr, "right"); - int kr = mach_compile_expr(cs, idx_expr, key_reg); - if (kr != key_reg) - mach_emit(cs, MACH_ABC(MACH_MOVE, key_reg, kr, 0)); - - /* Compile args into R(base+2)..R(base+1+nargs) */ - for (int i = 0; i < nargs; i++) { - int arg_reg = mach_reserve_reg(cs); - cJSON *arg = cJSON_GetArrayItem(args, i); - int r = mach_compile_expr(cs, arg, arg_reg); - if (r != arg_reg) - mach_emit(cs, MACH_ABC(MACH_MOVE, arg_reg, r, 0)); - } - - /* C=0xFF signals key is in R(base+1) */ - mach_emit(cs, MACH_ABC(MACH_CALLMETHOD, base, nargs, 0xFF)); - mach_free_reg_to(cs, save_freereg); - if (dest >= 0 && dest != base) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, base, 0)); - else - dest = base; - return dest; - } - - /* Save freereg so we can allocate consecutive regs for call */ - int save_freereg = cs->freereg; - - /* Allocate base register for the function */ - int base = mach_reserve_reg(cs); - if (dest < 0) dest = base; /* result goes to base */ - - /* Compile function expression into base */ - int fn_reg = mach_compile_expr(cs, fn_expr, base); - if (fn_reg != base) { - mach_emit(cs, MACH_ABC(MACH_MOVE, base, fn_reg, 0)); - } - - /* Allocate consecutive arg registers and compile args */ - for (int i = 0; i < nargs; i++) { - int arg_reg = mach_reserve_reg(cs); - cJSON *arg = cJSON_GetArrayItem(args, i); - int r = mach_compile_expr(cs, arg, arg_reg); - if (r != arg_reg) { - mach_emit(cs, MACH_ABC(MACH_MOVE, arg_reg, r, 0)); - } - } - - /* Emit CALL: base=func, B=nargs, C=1 if we want result */ - int keep = (dest >= 0) ? 1 : 0; - mach_emit(cs, MACH_ABC(MACH_CALL, base, nargs, keep)); - - /* Restore freereg */ - mach_free_reg_to(cs, save_freereg); - - /* If we want the result and dest != base, move it */ - if (dest >= 0 && dest != base) { - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, base, 0)); - } else { - dest = base; - } - return dest; - } - - /* Binary operators */ - if (strcmp(kind, "+") == 0 || strcmp(kind, "-") == 0 || - strcmp(kind, "*") == 0 || strcmp(kind, "/") == 0 || - strcmp(kind, "%") == 0 || strcmp(kind, "**") == 0 || - strcmp(kind, "==") == 0 || strcmp(kind, "!=") == 0 || - strcmp(kind, "===") == 0 || strcmp(kind, "!==") == 0 || - strcmp(kind, "<") == 0 || strcmp(kind, "<=") == 0 || - strcmp(kind, ">") == 0 || strcmp(kind, ">=") == 0 || - strcmp(kind, "&") == 0 || strcmp(kind, "|") == 0 || - strcmp(kind, "^") == 0 || strcmp(kind, "<<") == 0 || - strcmp(kind, ">>") == 0 || strcmp(kind, ">>>") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - - int save = cs->freereg; - cJSON *left = cJSON_GetObjectItemCaseSensitive(node, "left"); - cJSON *right = cJSON_GetObjectItemCaseSensitive(node, "right"); - - int lr = mach_compile_expr(cs, left, -1); - if (cs->freereg <= lr) cs->freereg = lr + 1; /* protect lr from reuse */ - int rr = mach_compile_expr(cs, right, -1); - - MachOpcode op; - if (strcmp(kind, "+") == 0) op = MACH_ADD; - else if (strcmp(kind, "-") == 0) op = MACH_SUB; - else if (strcmp(kind, "*") == 0) op = MACH_MUL; - else if (strcmp(kind, "/") == 0) op = MACH_DIV; - else if (strcmp(kind, "%") == 0) op = MACH_MOD; - else if (strcmp(kind, "**") == 0) op = MACH_POW; - else if (strcmp(kind, "==") == 0 || strcmp(kind, "===") == 0) op = MACH_EQ; - else if (strcmp(kind, "!=") == 0 || strcmp(kind, "!==") == 0) op = MACH_NEQ; - else if (strcmp(kind, "<") == 0) op = MACH_LT; - else if (strcmp(kind, "<=") == 0) op = MACH_LE; - else if (strcmp(kind, ">") == 0) op = MACH_GT; - else if (strcmp(kind, ">=") == 0) op = MACH_GE; - else if (strcmp(kind, "&") == 0) op = MACH_BAND; - else if (strcmp(kind, "|") == 0) op = MACH_BOR; - else if (strcmp(kind, "^") == 0) op = MACH_BXOR; - else if (strcmp(kind, "<<") == 0) op = MACH_SHL; - else if (strcmp(kind, ">>") == 0) op = MACH_SHR; - else op = MACH_USHR; /* >>> */ - - mach_emit(cs, MACH_ABC(op, dest, lr, rr)); - mach_free_reg_to(cs, save); - return dest; - } - - /* Short-circuit logical operators */ - if (strcmp(kind, "&&") == 0 || strcmp(kind, "||") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - cJSON *left = cJSON_GetObjectItemCaseSensitive(node, "left"); - cJSON *right = cJSON_GetObjectItemCaseSensitive(node, "right"); - - int lr = mach_compile_expr(cs, left, dest); - if (lr != dest) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, lr, 0)); - - /* Emit conditional jump — patch offset later */ - int jmp_pc = mach_current_pc(cs); - if (strcmp(kind, "&&") == 0) - mach_emit(cs, MACH_AsBx(MACH_JMPFALSE, dest, 0)); /* skip right if false */ - else - mach_emit(cs, MACH_AsBx(MACH_JMPTRUE, dest, 0)); /* skip right if true */ - - int rr = mach_compile_expr(cs, right, dest); - if (rr != dest) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, rr, 0)); - - /* Patch jump offset: target is current PC, offset relative to instruction after jmp */ - int offset = mach_current_pc(cs) - (jmp_pc + 1); - cs->code[jmp_pc] = MACH_AsBx(MACH_GET_OP(cs->code[jmp_pc]), dest, (int16_t)offset); - return dest; - } - - /* Unary operators */ - if (strcmp(kind, "!") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - cJSON *operand = cJSON_GetObjectItemCaseSensitive(node, "expression"); - if (!operand) operand = cJSON_GetObjectItemCaseSensitive(node, "right"); - int save = cs->freereg; - int r = mach_compile_expr(cs, operand, -1); - mach_emit(cs, MACH_ABC(MACH_LNOT, dest, r, 0)); - mach_free_reg_to(cs, save); - return dest; - } - if (strcmp(kind, "~") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - cJSON *operand = cJSON_GetObjectItemCaseSensitive(node, "expression"); - if (!operand) operand = cJSON_GetObjectItemCaseSensitive(node, "right"); - int save = cs->freereg; - int r = mach_compile_expr(cs, operand, -1); - mach_emit(cs, MACH_ABC(MACH_BNOT, dest, r, 0)); - mach_free_reg_to(cs, save); - return dest; - } - if (strcmp(kind, "unary_-") == 0 || strcmp(kind, "-unary") == 0 || (strcmp(kind, "-") == 0 && !cJSON_GetObjectItemCaseSensitive(node, "left"))) { - if (dest < 0) dest = mach_reserve_reg(cs); - cJSON *operand = cJSON_GetObjectItemCaseSensitive(node, "expression"); - if (!operand) operand = cJSON_GetObjectItemCaseSensitive(node, "right"); - int save = cs->freereg; - int r = mach_compile_expr(cs, operand, -1); - mach_emit(cs, MACH_ABC(MACH_NEG, dest, r, 0)); - mach_free_reg_to(cs, save); - return dest; - } - - /* Unary plus: identity for numbers */ - if (strcmp(kind, "+unary") == 0 || strcmp(kind, "pos") == 0) { - cJSON *operand = cJSON_GetObjectItemCaseSensitive(node, "expression"); - return mach_compile_expr(cs, operand, dest); - } - - /* Comma operator: compile left for side effects, return right */ - if (strcmp(kind, ",") == 0) { - cJSON *left = cJSON_GetObjectItemCaseSensitive(node, "left"); - cJSON *right = cJSON_GetObjectItemCaseSensitive(node, "right"); - int save = cs->freereg; - mach_compile_expr(cs, left, -1); - mach_free_reg_to(cs, save); - return mach_compile_expr(cs, right, dest); - } - - /* Increment/Decrement as expression */ - if (strcmp(kind, "++") == 0 || strcmp(kind, "--") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - MachOpcode inc_op = (kind[0] == '+') ? MACH_INC : MACH_DEC; - cJSON *operand = cJSON_GetObjectItemCaseSensitive(node, "expression"); - cJSON *postfix_node = cJSON_GetObjectItemCaseSensitive(node, "postfix"); - int is_postfix = postfix_node && cJSON_IsTrue(postfix_node); - - const char *op_kind = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(operand, "kind")); - if (op_kind && strcmp(op_kind, "name") == 0) { - const char *name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(operand, "name")); - cJSON *level_node = cJSON_GetObjectItemCaseSensitive(operand, "level"); - int level = level_node ? (int)cJSON_GetNumberValue(level_node) : -1; - if (level == 0 && name) { - int slot = mach_find_var(cs, name); - if (slot >= 0) { - if (is_postfix) { - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, slot, 0)); - mach_emit(cs, MACH_ABC(inc_op, slot, slot, 0)); - } else { - mach_emit(cs, MACH_ABC(inc_op, slot, slot, 0)); - if (dest != slot) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, slot, 0)); - } - return dest; - } - } else if (level > 0 && name) { - /* Closure variable */ - int save = cs->freereg; - MachCompState *target = cs; - for (int i = 0; i < level; i++) target = target->parent; - int slot = mach_find_var(target, name); - int val_r = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABC(MACH_GETUP, val_r, level, slot)); - if (is_postfix) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, val_r, 0)); - mach_emit(cs, MACH_ABC(inc_op, val_r, val_r, 0)); - if (!is_postfix) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, val_r, 0)); - mach_emit(cs, MACH_ABC(MACH_SETUP, val_r, level, slot)); - mach_free_reg_to(cs, save); - return dest; - } - } - /* Property access: obj.prop++ */ - if (op_kind && strcmp(op_kind, ".") == 0) { - int save = cs->freereg; - cJSON *obj_expr = cJSON_GetObjectItemCaseSensitive(operand, "expression"); - if (!obj_expr) obj_expr = cJSON_GetObjectItemCaseSensitive(operand, "left"); - cJSON *prop = cJSON_GetObjectItemCaseSensitive(operand, "name"); - if (!prop) prop = cJSON_GetObjectItemCaseSensitive(operand, "right"); - const char *prop_name = NULL; - if (cJSON_IsString(prop)) prop_name = cJSON_GetStringValue(prop); - else if (prop) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(prop, "value")); - if (!prop_name && prop) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(prop, "name")); - if (!prop_name) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(operand, "value")); - if (prop_name) { - int obj_r = mach_compile_expr(cs, obj_expr, -1); - if (cs->freereg <= obj_r) cs->freereg = obj_r + 1; - int ki = mach_cpool_add_str(cs, prop_name); - int val_r = mach_reserve_reg(cs); - if (ki < 256) { - mach_emit(cs, MACH_ABC(MACH_GETFIELD, val_r, obj_r, ki)); - } else { - int kr = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADK, kr, ki)); - mach_emit(cs, MACH_ABC(MACH_GETINDEX, val_r, obj_r, kr)); - } - if (is_postfix) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, val_r, 0)); - mach_emit(cs, MACH_ABC(inc_op, val_r, val_r, 0)); - if (!is_postfix) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, val_r, 0)); - if (ki < 256) { - mach_emit(cs, MACH_ABC(MACH_SETFIELD, obj_r, ki, val_r)); - } else { - int kr = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADK, kr, ki)); - mach_emit(cs, MACH_ABC(MACH_SETINDEX, obj_r, kr, val_r)); - } - mach_free_reg_to(cs, save); - return dest; - } - } - /* Computed property access: obj[idx]++ */ - if (op_kind && strcmp(op_kind, "[") == 0) { - int save = cs->freereg; - cJSON *obj_expr = cJSON_GetObjectItemCaseSensitive(operand, "expression"); - if (!obj_expr) obj_expr = cJSON_GetObjectItemCaseSensitive(operand, "left"); - cJSON *idx_expr = cJSON_GetObjectItemCaseSensitive(operand, "index"); - if (!idx_expr) idx_expr = cJSON_GetObjectItemCaseSensitive(operand, "right"); - int obj_r = mach_compile_expr(cs, obj_expr, -1); - if (cs->freereg <= obj_r) cs->freereg = obj_r + 1; - int idx_r = mach_compile_expr(cs, idx_expr, -1); - if (cs->freereg <= idx_r) cs->freereg = idx_r + 1; - int val_r = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABC(MACH_GETINDEX, val_r, obj_r, idx_r)); - if (is_postfix) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, val_r, 0)); - mach_emit(cs, MACH_ABC(inc_op, val_r, val_r, 0)); - if (!is_postfix) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, val_r, 0)); - mach_emit(cs, MACH_ABC(MACH_SETINDEX, obj_r, idx_r, val_r)); - mach_free_reg_to(cs, save); - return dest; - } - /* Fallback: just compile operand */ - return mach_compile_expr(cs, operand, dest); - } - - /* Compound assignment operators */ - if (strcmp(kind, "+=") == 0 || strcmp(kind, "-=") == 0 || - strcmp(kind, "*=") == 0 || strcmp(kind, "/=") == 0 || - strcmp(kind, "%=") == 0 || strcmp(kind, "**=") == 0 || - strcmp(kind, "&=") == 0 || strcmp(kind, "|=") == 0 || - strcmp(kind, "^=") == 0 || strcmp(kind, "<<=") == 0 || - strcmp(kind, ">>=") == 0 || strcmp(kind, ">>>=") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - cJSON *left = cJSON_GetObjectItemCaseSensitive(node, "left"); - cJSON *right = cJSON_GetObjectItemCaseSensitive(node, "right"); - - /* Map compound op to binary op */ - MachOpcode binop; - if (strcmp(kind, "+=") == 0) binop = MACH_ADD; - else if (strcmp(kind, "-=") == 0) binop = MACH_SUB; - else if (strcmp(kind, "*=") == 0) binop = MACH_MUL; - else if (strcmp(kind, "/=") == 0) binop = MACH_DIV; - else if (strcmp(kind, "%=") == 0) binop = MACH_MOD; - else if (strcmp(kind, "**=") == 0) binop = MACH_POW; - else if (strcmp(kind, "&=") == 0) binop = MACH_BAND; - else if (strcmp(kind, "|=") == 0) binop = MACH_BOR; - else if (strcmp(kind, "^=") == 0) binop = MACH_BXOR; - else if (strcmp(kind, "<<=") == 0) binop = MACH_SHL; - else if (strcmp(kind, ">>=") == 0) binop = MACH_SHR; - else binop = MACH_USHR; /* >>>= */ - - const char *lk = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(left, "kind")); - if (lk && strcmp(lk, "name") == 0) { - const char *name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(left, "name")); - cJSON *level_node = cJSON_GetObjectItemCaseSensitive(left, "level"); - int level = level_node ? (int)cJSON_GetNumberValue(level_node) : -1; - if (level == 0 && name) { - int slot = mach_find_var(cs, name); - if (slot >= 0) { - int save = cs->freereg; - int rr = mach_compile_expr(cs, right, -1); - mach_emit(cs, MACH_ABC(binop, slot, slot, rr)); - mach_free_reg_to(cs, save); - if (dest != slot) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, slot, 0)); - return dest; - } - } - } - /* Fallback: load null */ - mach_emit(cs, MACH_ABx(MACH_LOADNULL, dest, 0)); - return dest; - } - - /* In operator */ - if (strcmp(kind, "in") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - cJSON *left = cJSON_GetObjectItemCaseSensitive(node, "left"); - cJSON *right = cJSON_GetObjectItemCaseSensitive(node, "right"); - int save = cs->freereg; - int lr = mach_compile_expr(cs, left, -1); - if (cs->freereg <= lr) cs->freereg = lr + 1; - int rr = mach_compile_expr(cs, right, -1); - mach_emit(cs, MACH_ABC(MACH_HASPROP, dest, rr, lr)); - mach_free_reg_to(cs, save); - return dest; - } - - /* Assignment */ - if (strcmp(kind, "assign") == 0) { - cJSON *left = cJSON_GetObjectItemCaseSensitive(node, "left"); - cJSON *right = cJSON_GetObjectItemCaseSensitive(node, "right"); - - /* Push: arr[] = val */ - cJSON *push_node = cJSON_GetObjectItemCaseSensitive(node, "push"); - if (push_node && cJSON_IsTrue(push_node)) { - if (dest < 0) dest = mach_reserve_reg(cs); - int save = cs->freereg; - cJSON *arr_expr = cJSON_GetObjectItemCaseSensitive(left, "left"); - if (!arr_expr) arr_expr = cJSON_GetObjectItemCaseSensitive(left, "expression"); - int arr_r = mach_compile_expr(cs, arr_expr, -1); - int val_r = mach_compile_expr(cs, right, -1); - mach_emit(cs, MACH_ABC(MACH_PUSH, arr_r, val_r, 0)); - if (dest >= 0) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, val_r, 0)); - mach_free_reg_to(cs, save); - return dest; - } - - const char *lk = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(left, "kind")); - - if (lk && strcmp(lk, "name") == 0) { - const char *name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(left, "name")); - cJSON *level_node = cJSON_GetObjectItemCaseSensitive(left, "level"); - int level = level_node ? (int)cJSON_GetNumberValue(level_node) : -1; - - if (level == 0) { - /* Local assignment */ - int slot = name ? mach_find_var(cs, name) : -1; - if (slot >= 0) { - int r = mach_compile_expr(cs, right, slot); - if (r != slot) - mach_emit(cs, MACH_ABC(MACH_MOVE, slot, r, 0)); - if (dest >= 0 && dest != slot) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, slot, 0)); - return slot; - } - } else if (level > 0) { - /* Closure assignment — walk parent states for slot */ - MachCompState *target = cs; - for (int i = 0; i < level; i++) target = target->parent; - int slot = mach_find_var(target, name); - if (dest < 0) dest = mach_reserve_reg(cs); - int r = mach_compile_expr(cs, right, dest); - if (r != dest) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, r, 0)); - mach_emit(cs, MACH_ABC(MACH_SETUP, dest, level, slot)); - return dest; - } - /* Unbound (level -1) — error, AST parser should have rejected this */ - if (dest < 0) dest = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADNULL, dest, 0)); - return dest; - } - - /* Property assignment: left kind="." */ - if (lk && strcmp(lk, ".") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - int save = cs->freereg; - cJSON *obj_expr = cJSON_GetObjectItemCaseSensitive(left, "expression"); - if (!obj_expr) obj_expr = cJSON_GetObjectItemCaseSensitive(left, "left"); - cJSON *prop = cJSON_GetObjectItemCaseSensitive(left, "name"); - if (!prop) prop = cJSON_GetObjectItemCaseSensitive(left, "right"); - const char *prop_name = NULL; - if (cJSON_IsString(prop)) prop_name = cJSON_GetStringValue(prop); - else if (prop) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(prop, "value")); - if (!prop_name && prop) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(prop, "name")); - if (!prop_name) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(left, "value")); - - int obj_r = mach_compile_expr(cs, obj_expr, -1); - if (cs->freereg <= obj_r) cs->freereg = obj_r + 1; - int val_r = mach_compile_expr(cs, right, dest); - if (prop_name) { - int ki = mach_cpool_add_str(cs, prop_name); - if (ki < 256) { - mach_emit(cs, MACH_ABC(MACH_SETFIELD, obj_r, ki, val_r)); - } else { - int kr = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADK, kr, ki)); - mach_emit(cs, MACH_ABC(MACH_SETINDEX, obj_r, kr, val_r)); - } - } - mach_free_reg_to(cs, save); - return val_r; - } - - /* Computed property assignment: left kind="[" */ - if (lk && strcmp(lk, "[") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - int save = cs->freereg; - cJSON *obj_expr = cJSON_GetObjectItemCaseSensitive(left, "expression"); - if (!obj_expr) obj_expr = cJSON_GetObjectItemCaseSensitive(left, "left"); - cJSON *idx_expr = cJSON_GetObjectItemCaseSensitive(left, "index"); - if (!idx_expr) idx_expr = cJSON_GetObjectItemCaseSensitive(left, "right"); - - int obj_r = mach_compile_expr(cs, obj_expr, -1); - if (cs->freereg <= obj_r) cs->freereg = obj_r + 1; - int idx_r = mach_compile_expr(cs, idx_expr, -1); - if (cs->freereg <= idx_r) cs->freereg = idx_r + 1; - int val_r = mach_compile_expr(cs, right, dest); - mach_emit(cs, MACH_ABC(MACH_SETINDEX, obj_r, idx_r, val_r)); - mach_free_reg_to(cs, save); - return val_r; - } - - /* Fallback */ - if (dest < 0) dest = mach_reserve_reg(cs); - mach_compile_expr(cs, right, dest); - return dest; - } - - /* Property access: kind="." */ - if (strcmp(kind, ".") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - int save = cs->freereg; - cJSON *obj_expr = cJSON_GetObjectItemCaseSensitive(node, "expression"); - if (!obj_expr) obj_expr = cJSON_GetObjectItemCaseSensitive(node, "left"); - cJSON *prop = cJSON_GetObjectItemCaseSensitive(node, "name"); - if (!prop) prop = cJSON_GetObjectItemCaseSensitive(node, "right"); - const char *prop_name = NULL; - if (cJSON_IsString(prop)) prop_name = cJSON_GetStringValue(prop); - else if (prop) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(prop, "value")); - if (!prop_name && prop) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(prop, "name")); - if (!prop_name) prop_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(node, "value")); - - int obj_r = mach_compile_expr(cs, obj_expr, -1); - if (prop_name) { - int ki = mach_cpool_add_str(cs, prop_name); - if (ki < 256) { - mach_emit(cs, MACH_ABC(MACH_GETFIELD, dest, obj_r, ki)); - } else { - int kr = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADK, kr, ki)); - mach_emit(cs, MACH_ABC(MACH_GETINDEX, dest, obj_r, kr)); - } - } - mach_free_reg_to(cs, save); - return dest; - } - - /* Computed property access: kind="[" */ - if (strcmp(kind, "[") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - int save = cs->freereg; - cJSON *obj_expr = cJSON_GetObjectItemCaseSensitive(node, "expression"); - if (!obj_expr) obj_expr = cJSON_GetObjectItemCaseSensitive(node, "left"); - cJSON *idx_expr = cJSON_GetObjectItemCaseSensitive(node, "index"); - if (!idx_expr) idx_expr = cJSON_GetObjectItemCaseSensitive(node, "right"); - - int obj_r = mach_compile_expr(cs, obj_expr, -1); - if (cs->freereg <= obj_r) cs->freereg = obj_r + 1; - int idx_r = mach_compile_expr(cs, idx_expr, -1); - mach_emit(cs, MACH_ABC(MACH_GETINDEX, dest, obj_r, idx_r)); - mach_free_reg_to(cs, save); - return dest; - } - - /* Object literal: kind="object" or "record" */ - if (strcmp(kind, "object") == 0 || strcmp(kind, "record") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABC(MACH_NEWOBJECT, dest, 0, 0)); - cJSON *props = cJSON_GetObjectItemCaseSensitive(node, "list"); - if (props) { - int count = cJSON_GetArraySize(props); - for (int i = 0; i < count; i++) { - cJSON *prop = cJSON_GetArrayItem(props, i); - cJSON *key_node = cJSON_GetObjectItemCaseSensitive(prop, "key"); - if (!key_node) key_node = cJSON_GetObjectItemCaseSensitive(prop, "left"); - cJSON *val_node = cJSON_GetObjectItemCaseSensitive(prop, "value"); - if (!val_node) val_node = cJSON_GetObjectItemCaseSensitive(prop, "right"); - if (!val_node) val_node = cJSON_GetObjectItemCaseSensitive(prop, "expression"); - const char *key = cJSON_GetStringValue(key_node); - if (!key && key_node) key = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(key_node, "value")); - if (!key && key_node) key = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(key_node, "name")); - if (key && val_node) { - int save = cs->freereg; - int vr = mach_compile_expr(cs, val_node, -1); - int ki = mach_cpool_add_str(cs, key); - if (ki < 256) { - mach_emit(cs, MACH_ABC(MACH_SETFIELD, dest, ki, vr)); - } else { - int kr = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADK, kr, ki)); - mach_emit(cs, MACH_ABC(MACH_SETINDEX, dest, kr, vr)); - } - mach_free_reg_to(cs, save); - } - } - } - return dest; - } - - /* Array literal: kind="array" */ - if (strcmp(kind, "array") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - cJSON *elems = cJSON_GetObjectItemCaseSensitive(node, "list"); - int count = elems ? cJSON_GetArraySize(elems) : 0; - - /* Reserve consecutive regs for elements starting at arr_base+1. - If dest is below freereg, other temps occupy dest+1..freereg-1 - so we must use a fresh base to avoid clobbering them. */ - int save = cs->freereg; - int arr_base; - if (dest + 1 >= cs->freereg) { - arr_base = dest; - cs->freereg = dest + 1; - } else { - arr_base = mach_reserve_reg(cs); - } - for (int i = 0; i < count; i++) { - int er = mach_reserve_reg(cs); - cJSON *elem = cJSON_GetArrayItem(elems, i); - int r = mach_compile_expr(cs, elem, er); - if (r != er) mach_emit(cs, MACH_ABC(MACH_MOVE, er, r, 0)); - } - mach_emit(cs, MACH_ABC(MACH_NEWARRAY, arr_base, count, 0)); - if (arr_base != dest) - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, arr_base, 0)); - mach_free_reg_to(cs, save); - return dest; - } - - /* Ternary: kind="?" or "then" */ - if (strcmp(kind, "?") == 0 || strcmp(kind, "then") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - cJSON *cond = cJSON_GetObjectItemCaseSensitive(node, "expression"); - if (!cond) cond = cJSON_GetObjectItemCaseSensitive(node, "condition"); - cJSON *then_expr = cJSON_GetObjectItemCaseSensitive(node, "then"); - if (!then_expr) then_expr = cJSON_GetObjectItemCaseSensitive(node, "left"); - cJSON *else_expr = cJSON_GetObjectItemCaseSensitive(node, "else"); - if (!else_expr) else_expr = cJSON_GetObjectItemCaseSensitive(node, "right"); - - int save = cs->freereg; - int cr = mach_compile_expr(cs, cond, -1); - int jmpfalse_pc = mach_current_pc(cs); - mach_emit(cs, MACH_AsBx(MACH_JMPFALSE, cr, 0)); - mach_free_reg_to(cs, save); - - mach_compile_expr(cs, then_expr, dest); - int jmpend_pc = mach_current_pc(cs); - mach_emit(cs, MACH_sJ(MACH_JMP, 0)); - - /* Patch jmpfalse */ - int offset = mach_current_pc(cs) - (jmpfalse_pc + 1); - cs->code[jmpfalse_pc] = MACH_AsBx(MACH_JMPFALSE, cr, (int16_t)offset); - - mach_compile_expr(cs, else_expr, dest); - - /* Patch jmpend */ - offset = mach_current_pc(cs) - (jmpend_pc + 1); - cs->code[jmpend_pc] = MACH_sJ(MACH_JMP, offset); - return dest; - } - - /* Function literal */ - if (strcmp(kind, "function") == 0 || strcmp(kind, "=>") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - /* Compile nested function */ - MachCompState child = {0}; - child.parent = cs; - child.scopes = cs->scopes; - child.filename = cs->filename; - child.freereg = 1; /* slot 0 = this */ - child.pending_label = -1; - - /* Read function_nr from AST node */ - cJSON *fn_nr_node = cJSON_GetObjectItemCaseSensitive(node, "function_nr"); - child.function_nr = fn_nr_node ? (int)cJSON_GetNumberValue(fn_nr_node) : 0; - - /* Register parameters */ - cJSON *params = cJSON_GetObjectItemCaseSensitive(node, "params"); - if (!params) params = cJSON_GetObjectItemCaseSensitive(node, "parameters"); - if (!params) params = cJSON_GetObjectItemCaseSensitive(node, "list"); - int nparams = params ? cJSON_GetArraySize(params) : 0; - child.nr_args = nparams; - for (int i = 0; i < nparams; i++) { - cJSON *p = cJSON_GetArrayItem(params, i); - const char *pname = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(p, "name")); - if (!pname) pname = cJSON_GetStringValue(p); - if (pname) { - int slot = mach_reserve_reg(&child); - mach_add_var(&child, pname, slot, 1); - } - } - - /* Scan scope record for var/def declarations */ - mach_scan_scope(&child); - - /* Emit default parameter initialization */ - for (int i = 0; i < nparams; i++) { - cJSON *p = cJSON_GetArrayItem(params, i); - cJSON *default_expr = cJSON_GetObjectItemCaseSensitive(p, "expression"); - if (default_expr) { - int slot = 1 + i; /* param slots start at 1 (slot 0 = this) */ - /* If param is null, skip the JMP and fall into default code */ - mach_emit(&child, MACH_AsBx(MACH_JMPNULL, slot, 1)); - /* If param is NOT null, jump past the default code */ - int jmp_pc = mach_current_pc(&child); - mach_emit(&child, MACH_sJ(MACH_JMP, 0)); /* placeholder */ - - int save = child.freereg; - mach_compile_expr(&child, default_expr, slot); - child.freereg = save; - - /* Patch JMP offset */ - int offset = mach_current_pc(&child) - (jmp_pc + 1); - child.code[jmp_pc] = MACH_sJ(MACH_JMP, offset); - } - } - - /* Compile body */ - cJSON *body = cJSON_GetObjectItemCaseSensitive(node, "body"); - if (!body) body = node; /* statements may be directly on the function node */ - { - cJSON *stmts = cJSON_GetObjectItemCaseSensitive(body, "statements"); - if (!stmts) stmts = body; /* body might be the statements array directly */ - if (cJSON_IsArray(stmts)) { - int count = cJSON_GetArraySize(stmts); - for (int i = 0; i < count; i++) { - mach_compile_stmt(&child, cJSON_GetArrayItem(stmts, i)); - } - } - } - - /* Implicit return null */ - mach_emit(&child, MACH_ABC(MACH_RETNIL, 0, 0, 0)); - - /* Disruption clause — emitted after body, recorded as disruption_pc */ - int disruption_start = 0; - cJSON *disruption = cJSON_GetObjectItemCaseSensitive(node, "disruption"); - if (disruption && cJSON_IsArray(disruption)) { - disruption_start = mach_current_pc(&child); - int dcount = cJSON_GetArraySize(disruption); - for (int i = 0; i < dcount; i++) - mach_compile_stmt(&child, cJSON_GetArrayItem(disruption, i)); - mach_emit(&child, MACH_ABC(MACH_RETNIL, 0, 0, 0)); - } - - /* Build MachCode for the child function */ - cJSON *fn_scope = mach_find_scope_record(cs->scopes, child.function_nr); - cJSON *fn_ncs = fn_scope ? cJSON_GetObjectItemCaseSensitive(fn_scope, "nr_close_slots") : NULL; - MachCode *fn_code = sys_malloc(sizeof(MachCode)); - memset(fn_code, 0, sizeof(MachCode)); - fn_code->arity = nparams; - fn_code->nr_slots = child.maxreg; - fn_code->nr_close_slots = fn_ncs ? (int)cJSON_GetNumberValue(fn_ncs) : 0; - fn_code->entry_point = 0; - fn_code->instr_count = child.code_count; - fn_code->instructions = child.code; - fn_code->cpool_count = child.cpool_count; - fn_code->cpool = child.cpool; - fn_code->func_count = child.func_count; - fn_code->functions = child.functions; - fn_code->line_table = child.line_info; - fn_code->filename = cs->filename ? strdup(cs->filename) : NULL; - fn_code->disruption_pc = disruption_start; - - cJSON *fname = cJSON_GetObjectItemCaseSensitive(node, "name"); - if (fname && cJSON_IsString(fname)) { - const char *ns = cJSON_GetStringValue(fname); - fn_code->name = sys_malloc(strlen(ns) + 1); - strcpy(fn_code->name, ns); - } else { - fn_code->name = NULL; - } - - /* Free child var table (not code/cpool, those are owned by fn_code now) */ - for (int i = 0; i < child.var_count; i++) - sys_free(child.vars[i].name); - sys_free(child.vars); - - int fi = mach_add_function(cs, fn_code); - mach_emit(cs, MACH_ABx(MACH_CLOSURE, dest, fi)); - return dest; - } - - /* Delete operator */ - if (strcmp(kind, "delete") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - cJSON *operand = cJSON_GetObjectItemCaseSensitive(node, "expression"); - if (!operand) operand = cJSON_GetObjectItemCaseSensitive(node, "right"); - if (operand) { - const char *okind = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(operand, "kind")); - if (okind && strcmp(okind, ".") == 0) { - /* delete obj.prop */ - cJSON *obj_node = cJSON_GetObjectItemCaseSensitive(operand, "left"); - cJSON *prop_node = cJSON_GetObjectItemCaseSensitive(operand, "right"); - const char *pname = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(prop_node, "name")); - if (!pname) pname = cJSON_GetStringValue(prop_node); - int save = cs->freereg; - int objr = mach_compile_expr(cs, obj_node, -1); - int ki = mach_cpool_add_str(cs, pname); - mach_emit(cs, MACH_ABC(MACH_DELETE, dest, objr, ki)); - mach_free_reg_to(cs, save); - return dest; - } else if (okind && strcmp(okind, "[") == 0) { - /* delete obj[expr] */ - cJSON *obj_node = cJSON_GetObjectItemCaseSensitive(operand, "left"); - cJSON *idx_node = cJSON_GetObjectItemCaseSensitive(operand, "right"); - int save = cs->freereg; - int objr = mach_compile_expr(cs, obj_node, -1); - int ir = mach_compile_expr(cs, idx_node, -1); - mach_emit(cs, MACH_ABC(MACH_DELETEINDEX, dest, objr, ir)); - mach_free_reg_to(cs, save); - return dest; - } - } - mach_emit(cs, MACH_ABx(MACH_LOADTRUE, dest, 0)); - return dest; - } - - /* This reference — slot 0 is always 'this' */ - if (strcmp(kind, "this") == 0) { - if (dest >= 0 && dest != 0) { - mach_emit(cs, MACH_ABC(MACH_MOVE, dest, 0, 0)); - return dest; - } - return 0; - } - - /* Regex literal */ - if (strcmp(kind, "regexp") == 0) { - if (dest < 0) dest = mach_reserve_reg(cs); - const char *pattern = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(node, "pattern")); - const char *flags = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(node, "flags")); - if (!pattern) pattern = ""; - if (!flags) flags = ""; - int pi = mach_cpool_add_str(cs, pattern); - int fi = mach_cpool_add_str(cs, flags); - mach_emit(cs, MACH_ABC(MACH_REGEXP, dest, pi, fi)); - return dest; - } - - /* Fallback: unsupported expression kind — load null */ - if (dest < 0) dest = mach_reserve_reg(cs); - mach_emit(cs, MACH_ABx(MACH_LOADNULL, dest, 0)); - return dest; -} - -/* ---- Statement compiler ---- */ - -static void mach_compile_stmt(MachCompState *cs, cJSON *stmt) { - if (!stmt) return; - mach_set_pos(cs, stmt); - const char *kind = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(stmt, "kind")); - if (!kind) return; - - /* var / def declaration */ - if (strcmp(kind, "var") == 0 || strcmp(kind, "def") == 0) { - cJSON *left = cJSON_GetObjectItemCaseSensitive(stmt, "left"); - cJSON *right = cJSON_GetObjectItemCaseSensitive(stmt, "right"); - const char *name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(left, "name")); - if (!name) return; - int slot = mach_find_var(cs, name); - if (slot < 0) { - slot = mach_reserve_reg(cs); - mach_add_var(cs, name, slot, strcmp(kind, "def") == 0); - } - /* Pop: var x = arr[] */ - cJSON *pop_node = cJSON_GetObjectItemCaseSensitive(stmt, "pop"); - if (pop_node && cJSON_IsTrue(pop_node) && right) { - cJSON *arr_expr = cJSON_GetObjectItemCaseSensitive(right, "left"); - if (!arr_expr) arr_expr = cJSON_GetObjectItemCaseSensitive(right, "expression"); - int save = cs->freereg; - int arr_r = mach_compile_expr(cs, arr_expr, -1); - mach_emit(cs, MACH_ABC(MACH_POP, slot, arr_r, 0)); - mach_free_reg_to(cs, save); - return; - } - if (right) { - int r = mach_compile_expr(cs, right, slot); - if (r != slot) - mach_emit(cs, MACH_ABC(MACH_MOVE, slot, r, 0)); - } - return; - } - - /* var_list: multiple declarations in one statement */ - if (strcmp(kind, "var_list") == 0) { - cJSON *list = cJSON_GetObjectItemCaseSensitive(stmt, "list"); - if (list && cJSON_IsArray(list)) { - int count = cJSON_GetArraySize(list); - for (int i = 0; i < count; i++) - mach_compile_stmt(cs, cJSON_GetArrayItem(list, i)); - } - return; - } - - /* Function declaration statement */ - if (strcmp(kind, "function") == 0) { - const char *name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(stmt, "name")); - if (!name) return; - int slot = mach_find_var(cs, name); - if (slot < 0) { - slot = mach_reserve_reg(cs); - mach_add_var(cs, name, slot, 1); - } - mach_compile_expr(cs, stmt, slot); - return; - } - - /* Expression statement (call) */ - if (strcmp(kind, "call") == 0) { - cJSON *expr = cJSON_GetObjectItemCaseSensitive(stmt, "expression"); - if (expr) { - int save = cs->freereg; - mach_compile_expr(cs, expr, -1); - mach_free_reg_to(cs, save); - } - return; - } - - /* Return statement */ - if (strcmp(kind, "return") == 0) { - cJSON *expr = cJSON_GetObjectItemCaseSensitive(stmt, "expression"); - if (expr) { - int save = cs->freereg; - int r = mach_compile_expr(cs, expr, -1); - mach_emit(cs, MACH_ABC(MACH_RETURN, r, 0, 0)); - mach_free_reg_to(cs, save); - } else { - mach_emit(cs, MACH_ABC(MACH_RETNIL, 0, 0, 0)); - } - return; - } - - /* Block */ - if (strcmp(kind, "block") == 0) { - cJSON *stmts = cJSON_GetObjectItemCaseSensitive(stmt, "statements"); - if (stmts && cJSON_IsArray(stmts)) { - int count = cJSON_GetArraySize(stmts); - for (int i = 0; i < count; i++) { - mach_compile_stmt(cs, cJSON_GetArrayItem(stmts, i)); - } - } - return; - } - - /* If statement */ - if (strcmp(kind, "if") == 0) { - cJSON *cond = cJSON_GetObjectItemCaseSensitive(stmt, "expression"); - if (!cond) cond = cJSON_GetObjectItemCaseSensitive(stmt, "condition"); - cJSON *then_body = cJSON_GetObjectItemCaseSensitive(stmt, "then"); - if (!then_body) then_body = cJSON_GetObjectItemCaseSensitive(stmt, "block"); - cJSON *else_body = cJSON_GetObjectItemCaseSensitive(stmt, "else"); - - int save = cs->freereg; - int cr = mach_compile_expr(cs, cond, -1); - int jmpfalse_pc = mach_current_pc(cs); - mach_emit(cs, MACH_AsBx(MACH_JMPFALSE, cr, 0)); - mach_free_reg_to(cs, save); - - /* Compile then branch — "then" is a direct array of statements */ - if (then_body) { - if (cJSON_IsArray(then_body)) { - int count = cJSON_GetArraySize(then_body); - for (int i = 0; i < count; i++) - mach_compile_stmt(cs, cJSON_GetArrayItem(then_body, i)); - } else { - cJSON *stmts = cJSON_GetObjectItemCaseSensitive(then_body, "statements"); - if (stmts && cJSON_IsArray(stmts)) { - int count = cJSON_GetArraySize(stmts); - for (int i = 0; i < count; i++) - mach_compile_stmt(cs, cJSON_GetArrayItem(stmts, i)); - } else { - mach_compile_stmt(cs, then_body); - } - } - } - - /* Check for else-if chain ("list") or plain else */ - if (!else_body) { - cJSON *list = cJSON_GetObjectItemCaseSensitive(stmt, "list"); - if (list && cJSON_IsArray(list) && cJSON_GetArraySize(list) > 0) - else_body = cJSON_GetArrayItem(list, 0); - } - - if (else_body) { - int jmpend_pc = mach_current_pc(cs); - mach_emit(cs, MACH_sJ(MACH_JMP, 0)); - - /* Patch jmpfalse to else */ - int offset = mach_current_pc(cs) - (jmpfalse_pc + 1); - cs->code[jmpfalse_pc] = MACH_AsBx(MACH_JMPFALSE, cr, (int16_t)offset); - - /* Compile else — could be a direct array, object, or else-if stmt */ - if (cJSON_IsArray(else_body)) { - int count = cJSON_GetArraySize(else_body); - for (int i = 0; i < count; i++) - mach_compile_stmt(cs, cJSON_GetArrayItem(else_body, i)); - } else { - cJSON *stmts = cJSON_GetObjectItemCaseSensitive(else_body, "statements"); - if (stmts && cJSON_IsArray(stmts)) { - int count = cJSON_GetArraySize(stmts); - for (int i = 0; i < count; i++) - mach_compile_stmt(cs, cJSON_GetArrayItem(stmts, i)); - } else { - mach_compile_stmt(cs, else_body); - } - } - - /* Patch jmpend */ - offset = mach_current_pc(cs) - (jmpend_pc + 1); - cs->code[jmpend_pc] = MACH_sJ(MACH_JMP, offset); - } else { - /* No else — patch jmpfalse to after then */ - int offset = mach_current_pc(cs) - (jmpfalse_pc + 1); - cs->code[jmpfalse_pc] = MACH_AsBx(MACH_JMPFALSE, cr, (int16_t)offset); - } - return; - } - - /* While loop */ - if (strcmp(kind, "while") == 0) { - cJSON *cond = cJSON_GetObjectItemCaseSensitive(stmt, "expression"); - if (!cond) cond = cJSON_GetObjectItemCaseSensitive(stmt, "condition"); - - int my_label = cs->pending_label; - cs->pending_label = -1; - - int old_break = cs->loop_break; - int old_continue = cs->loop_continue; - cs->loop_break = -1; - cs->loop_continue = -1; - - int loop_top = mach_current_pc(cs); - - int save = cs->freereg; - int cr = mach_compile_expr(cs, cond, -1); - int jmpfalse_pc = mach_current_pc(cs); - mach_emit(cs, MACH_AsBx(MACH_JMPFALSE, cr, 0)); - mach_free_reg_to(cs, save); - - /* Compile body — "statements" on a child "block"/"body", or directly on the node */ - { - cJSON *body = cJSON_GetObjectItemCaseSensitive(stmt, "block"); - if (!body) body = cJSON_GetObjectItemCaseSensitive(stmt, "body"); - cJSON *stmts = body ? cJSON_GetObjectItemCaseSensitive(body, "statements") : NULL; - if (!stmts) stmts = cJSON_GetObjectItemCaseSensitive(stmt, "statements"); - if (stmts && cJSON_IsArray(stmts)) { - int count = cJSON_GetArraySize(stmts); - for (int i = 0; i < count; i++) - mach_compile_stmt(cs, cJSON_GetArrayItem(stmts, i)); - } else if (body) { - mach_compile_stmt(cs, body); - } - } - - /* Patch continue chain to loop_top */ - { - int cp = cs->loop_continue; - while (cp >= 0) { - int prev = MACH_GET_sJ(cs->code[cp]); - int off = loop_top - (cp + 1); - cs->code[cp] = MACH_sJ(MACH_JMP, off); - cp = prev; - } - /* Also patch labeled continue chain */ - if (my_label >= 0) { - cp = cs->labels[my_label].continue_chain; - while (cp >= 0) { - int prev = MACH_GET_sJ(cs->code[cp]); - int off = loop_top - (cp + 1); - cs->code[cp] = MACH_sJ(MACH_JMP, off); - cp = prev; - } - cs->labels[my_label].continue_chain = -1; - } - } - - /* Jump back to loop top */ - int offset = loop_top - (mach_current_pc(cs) + 1); - mach_emit(cs, MACH_sJ(MACH_JMP, offset)); - - /* Patch jmpfalse to after loop */ - offset = mach_current_pc(cs) - (jmpfalse_pc + 1); - cs->code[jmpfalse_pc] = MACH_AsBx(MACH_JMPFALSE, cr, (int16_t)offset); - - /* Patch break chain */ - int bp = cs->loop_break; - while (bp >= 0) { - int prev = MACH_GET_sJ(cs->code[bp]); - offset = mach_current_pc(cs) - (bp + 1); - cs->code[bp] = MACH_sJ(MACH_JMP, offset); - bp = prev; - } - cs->loop_break = old_break; - cs->loop_continue = old_continue; - return; - } - - /* Do-while loop */ - if (strcmp(kind, "do") == 0) { - cJSON *cond = cJSON_GetObjectItemCaseSensitive(stmt, "expression"); - if (!cond) cond = cJSON_GetObjectItemCaseSensitive(stmt, "condition"); - - int my_label = cs->pending_label; - cs->pending_label = -1; - - int old_break = cs->loop_break; - int old_continue = cs->loop_continue; - cs->loop_break = -1; - cs->loop_continue = -1; - - int body_top = mach_current_pc(cs); - - /* Compile body first (always executes at least once) */ - { - cJSON *body = cJSON_GetObjectItemCaseSensitive(stmt, "block"); - if (!body) body = cJSON_GetObjectItemCaseSensitive(stmt, "body"); - cJSON *stmts = body ? cJSON_GetObjectItemCaseSensitive(body, "statements") : NULL; - if (!stmts) stmts = cJSON_GetObjectItemCaseSensitive(stmt, "statements"); - if (stmts && cJSON_IsArray(stmts)) { - int count = cJSON_GetArraySize(stmts); - for (int i = 0; i < count; i++) - mach_compile_stmt(cs, cJSON_GetArrayItem(stmts, i)); - } else if (body) { - mach_compile_stmt(cs, body); - } - } - - /* Patch continue chain to condition check */ - int cond_pc = mach_current_pc(cs); - { - int cp = cs->loop_continue; - while (cp >= 0) { - int prev = MACH_GET_sJ(cs->code[cp]); - int off = cond_pc - (cp + 1); - cs->code[cp] = MACH_sJ(MACH_JMP, off); - cp = prev; - } - /* Also patch labeled continue chain */ - if (my_label >= 0) { - cp = cs->labels[my_label].continue_chain; - while (cp >= 0) { - int prev = MACH_GET_sJ(cs->code[cp]); - int off = cond_pc - (cp + 1); - cs->code[cp] = MACH_sJ(MACH_JMP, off); - cp = prev; - } - cs->labels[my_label].continue_chain = -1; - } - } - - /* Condition check — jump back to body if true */ - int save = cs->freereg; - int cr = mach_compile_expr(cs, cond, -1); - int jmpfalse_pc = mach_current_pc(cs); - mach_emit(cs, MACH_AsBx(MACH_JMPFALSE, cr, 0)); - mach_free_reg_to(cs, save); - - /* Jump back to body top */ - int offset = body_top - (mach_current_pc(cs) + 1); - mach_emit(cs, MACH_sJ(MACH_JMP, offset)); - - /* Patch jmpfalse to after loop */ - offset = mach_current_pc(cs) - (jmpfalse_pc + 1); - cs->code[jmpfalse_pc] = MACH_AsBx(MACH_JMPFALSE, cr, (int16_t)offset); - - /* Patch break chain */ - int bp = cs->loop_break; - while (bp >= 0) { - int prev = MACH_GET_sJ(cs->code[bp]); - offset = mach_current_pc(cs) - (bp + 1); - cs->code[bp] = MACH_sJ(MACH_JMP, offset); - bp = prev; - } - cs->loop_break = old_break; - cs->loop_continue = old_continue; - return; - } - - /* For loop */ - if (strcmp(kind, "for") == 0) { - cJSON *init = cJSON_GetObjectItemCaseSensitive(stmt, "init"); - cJSON *cond = cJSON_GetObjectItemCaseSensitive(stmt, "test"); - cJSON *update = cJSON_GetObjectItemCaseSensitive(stmt, "update"); - cJSON *body = cJSON_GetObjectItemCaseSensitive(stmt, "block"); - if (!body) body = cJSON_GetObjectItemCaseSensitive(stmt, "body"); - - int my_label = cs->pending_label; - cs->pending_label = -1; - - int old_break = cs->loop_break; - int old_continue = cs->loop_continue; - cs->loop_break = -1; - cs->loop_continue = -1; - - /* Init */ - if (init) mach_compile_stmt(cs, init); - - int loop_top = mach_current_pc(cs); - - /* Condition */ - int jmpfalse_pc = -1; - if (cond) { - int save = cs->freereg; - int cr = mach_compile_expr(cs, cond, -1); - jmpfalse_pc = mach_current_pc(cs); - mach_emit(cs, MACH_AsBx(MACH_JMPFALSE, cr, 0)); - mach_free_reg_to(cs, save); - } - - /* Body — "statements" on a child "block"/"body", or directly on the for node */ - { - cJSON *stmts = body ? cJSON_GetObjectItemCaseSensitive(body, "statements") : NULL; - if (!stmts) stmts = cJSON_GetObjectItemCaseSensitive(stmt, "statements"); - if (stmts && cJSON_IsArray(stmts)) { - int count = cJSON_GetArraySize(stmts); - for (int i = 0; i < count; i++) - mach_compile_stmt(cs, cJSON_GetArrayItem(stmts, i)); - } else if (body) { - mach_compile_stmt(cs, body); - } - } - - /* Patch continue chain to update (or loop_top if no update) */ - { - int continue_target = mach_current_pc(cs); - int cp = cs->loop_continue; - while (cp >= 0) { - int prev = MACH_GET_sJ(cs->code[cp]); - int off = continue_target - (cp + 1); - cs->code[cp] = MACH_sJ(MACH_JMP, off); - cp = prev; - } - /* Also patch labeled continue chain */ - if (my_label >= 0) { - cp = cs->labels[my_label].continue_chain; - while (cp >= 0) { - int prev = MACH_GET_sJ(cs->code[cp]); - int off = continue_target - (cp + 1); - cs->code[cp] = MACH_sJ(MACH_JMP, off); - cp = prev; - } - cs->labels[my_label].continue_chain = -1; - } - } - - /* Update — assignment expressions must be compiled as statements */ - if (update) { - mach_compile_stmt(cs, update); - } - - /* Jump back */ - int offset = loop_top - (mach_current_pc(cs) + 1); - mach_emit(cs, MACH_sJ(MACH_JMP, offset)); - - /* Patch condition exit */ - if (jmpfalse_pc >= 0) { - offset = mach_current_pc(cs) - (jmpfalse_pc + 1); - /* Need to recover the register used for condition - use A from the instruction */ - int cr = MACH_GET_A(cs->code[jmpfalse_pc]); - cs->code[jmpfalse_pc] = MACH_AsBx(MACH_JMPFALSE, cr, (int16_t)offset); - } - - /* Patch break chain */ - int bp = cs->loop_break; - while (bp >= 0) { - int prev = MACH_GET_sJ(cs->code[bp]); - offset = mach_current_pc(cs) - (bp + 1); - cs->code[bp] = MACH_sJ(MACH_JMP, offset); - bp = prev; - } - cs->loop_break = old_break; - cs->loop_continue = old_continue; - return; - } - - /* Label statement */ - if (strcmp(kind, "label") == 0) { - const char *name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(stmt, "name")); - cJSON *inner = cJSON_GetObjectItemCaseSensitive(stmt, "statement"); - if (inner && cs->label_count < MACH_MAX_LABELS) { - int li = cs->label_count++; - cs->labels[li].name = name; - cs->labels[li].break_chain = -1; - cs->labels[li].continue_chain = -1; - cs->pending_label = li; - mach_compile_stmt(cs, inner); - /* Patch labeled break chain to after the statement */ - int bp = cs->labels[li].break_chain; - while (bp >= 0) { - int prev = MACH_GET_sJ(cs->code[bp]); - int offset = mach_current_pc(cs) - (bp + 1); - cs->code[bp] = MACH_sJ(MACH_JMP, offset); - bp = prev; - } - cs->label_count--; - } else if (inner) { - mach_compile_stmt(cs, inner); - } - return; - } - - /* Break */ - if (strcmp(kind, "break") == 0) { - const char *name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(stmt, "name")); - if (name) { - /* Labeled break — find the label */ - for (int i = cs->label_count - 1; i >= 0; i--) { - if (cs->labels[i].name && strcmp(cs->labels[i].name, name) == 0) { - int pc = mach_current_pc(cs); - mach_emit(cs, MACH_sJ(MACH_JMP, cs->labels[i].break_chain)); - cs->labels[i].break_chain = pc; - return; - } - } - } - int pc = mach_current_pc(cs); - mach_emit(cs, MACH_sJ(MACH_JMP, cs->loop_break)); - cs->loop_break = pc; - return; - } - - /* Continue */ - if (strcmp(kind, "continue") == 0) { - const char *name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(stmt, "name")); - if (name) { - /* Labeled continue — find the label */ - for (int i = cs->label_count - 1; i >= 0; i--) { - if (cs->labels[i].name && strcmp(cs->labels[i].name, name) == 0) { - int pc = mach_current_pc(cs); - mach_emit(cs, MACH_sJ(MACH_JMP, cs->labels[i].continue_chain)); - cs->labels[i].continue_chain = pc; - return; - } - } - } - int pc = mach_current_pc(cs); - mach_emit(cs, MACH_sJ(MACH_JMP, cs->loop_continue)); - cs->loop_continue = pc; - return; - } - - /* Assignment as statement */ - if (strcmp(kind, "assign") == 0 || - strcmp(kind, "+=") == 0 || strcmp(kind, "-=") == 0 || - strcmp(kind, "*=") == 0 || strcmp(kind, "/=") == 0 || - strcmp(kind, "%=") == 0 || strcmp(kind, "**=") == 0 || - strcmp(kind, "&=") == 0 || strcmp(kind, "|=") == 0 || - strcmp(kind, "^=") == 0 || strcmp(kind, "<<=") == 0 || - strcmp(kind, ">>=") == 0 || strcmp(kind, ">>>=") == 0 || - strcmp(kind, "++") == 0 || strcmp(kind, "--") == 0) { - int save = cs->freereg; - mach_compile_expr(cs, stmt, -1); - mach_free_reg_to(cs, save); - return; - } - - /* Disrupt statement */ - if (strcmp(kind, "disrupt") == 0) { - mach_emit(cs, MACH_ABC(MACH_THROW, 0, 0, 0)); - return; - } - - /* Fallback: treat as expression statement */ - { - cJSON *expr = cJSON_GetObjectItemCaseSensitive(stmt, "expression"); - if (expr) { - int save = cs->freereg; - mach_compile_expr(cs, expr, -1); - mach_free_reg_to(cs, save); - } - } -} - /* ---- Link pass: resolve GETNAME to GETINTRINSIC or GETENV ---- */ static void mach_link_code(JSContext *ctx, JSCodeRegister *code, JSValue env) { @@ -1996,96 +105,6 @@ static void mach_link_code(JSContext *ctx, JSCodeRegister *code, JSValue env) { JS_PopGCRef(ctx, &env_ref); } -/* ---- Top-level compiler ---- */ - -static MachCode *mach_compile_program(MachCompState *cs, cJSON *ast) { - cJSON *stmts = cJSON_GetObjectItemCaseSensitive(ast, "statements"); - if (!stmts || !cJSON_IsArray(stmts)) return NULL; - - /* Read scopes array from AST */ - cs->scopes = cJSON_GetObjectItemCaseSensitive(ast, "scopes"); - cs->function_nr = 0; - - /* Extract filename for debug info */ - cs->filename = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(ast, "filename")); - - /* Scan scope record for declarations */ - mach_scan_scope(cs); - - /* Hoist function declarations */ - cJSON *functions = cJSON_GetObjectItemCaseSensitive(ast, "functions"); - if (functions && cJSON_IsArray(functions)) { - int fcount = cJSON_GetArraySize(functions); - for (int i = 0; i < fcount; i++) { - cJSON *fn_node = cJSON_GetArrayItem(functions, i); - const char *fn_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(fn_node, "name")); - if (!fn_name) continue; - int slot = mach_find_var(cs, fn_name); - if (slot < 0) continue; - mach_compile_expr(cs, fn_node, slot); - } - } - - /* Compile each statement */ - int count = cJSON_GetArraySize(stmts); - for (int i = 0; i < count; i++) { - mach_compile_stmt(cs, cJSON_GetArrayItem(stmts, i)); - } - - /* Implicit return null */ - mach_emit(cs, MACH_ABC(MACH_RETNIL, 0, 0, 0)); - - /* nr_close_slots from scope record */ - cJSON *prog_scope = mach_find_scope_record(cs->scopes, 0); - cJSON *ncs_node = prog_scope ? cJSON_GetObjectItemCaseSensitive(prog_scope, "nr_close_slots") : NULL; - - /* Build MachCode */ - MachCode *code = sys_malloc(sizeof(MachCode)); - memset(code, 0, sizeof(MachCode)); - code->arity = 0; - code->nr_slots = cs->maxreg; - code->nr_close_slots = ncs_node ? (int)cJSON_GetNumberValue(ncs_node) : 0; - code->entry_point = 0; - code->instr_count = cs->code_count; - code->instructions = cs->code; - code->cpool_count = cs->cpool_count; - code->cpool = cs->cpool; - code->func_count = cs->func_count; - code->functions = cs->functions; - code->name = NULL; - code->line_table = cs->line_info; - code->filename = cs->filename ? strdup(cs->filename) : NULL; - - return code; -} - -/* Public API: compile AST JSON to MachCode (context-free) */ -MachCode *JS_CompileMachTree(cJSON *ast) { - if (!ast) return NULL; - - MachCompState cs = {0}; - cs.freereg = 1; /* slot 0 = this */ - cs.maxreg = 1; - cs.pending_label = -1; - - MachCode *code = mach_compile_program(&cs, ast); - - /* Free var table (code/cpool/functions are owned by MachCode now) */ - for (int i = 0; i < cs.var_count; i++) - sys_free(cs.vars[i].name); - sys_free(cs.vars); - - return code; -} - -MachCode *JS_CompileMach(const char *ast_json) { - cJSON *ast = cJSON_Parse(ast_json); - if (!ast) return NULL; - MachCode *code = JS_CompileMachTree(ast); - cJSON_Delete(ast); - return code; -} - /* Free a MachCode tree (compiled but not yet loaded) */ void JS_FreeMachCode(MachCode *mc) { if (!mc) return; @@ -2691,14 +710,6 @@ void __asan_on_error(void) { pc = (uint32_t)(JS_VALUE_GET_INT(frame->address) >> 16); if (code->line_table && pc < code->instr_count) line = code->line_table[pc].line; - } else if (fn->kind == JS_FUNC_KIND_MCODE && fn->u.mcode.code) { - JSMCode *code = fn->u.mcode.code; - file = code->filename; - func_name = code->name; - if (!is_first) - pc = (uint32_t)(JS_VALUE_GET_INT(frame->address) >> 16); - if (code->line_table && pc < code->instr_count) - line = code->line_table[pc].line; } fprintf(stderr, " %s (%s:%u)\n", func_name ? func_name : "", @@ -2800,6 +811,7 @@ JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code, ctx->reg_current_frame = frame_ref.val; ctx->current_register_pc = pc > 0 ? pc - 1 : 0; int op = MACH_GET_OP(instr); + /* trace disabled */ int a = MACH_GET_A(instr); int b = MACH_GET_B(instr); int c = MACH_GET_C(instr); @@ -3059,9 +1071,22 @@ JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code, int depth = b; JSFunction *fn = JS_VALUE_GET_FUNCTION(frame->function); JSFrameRegister *target = (JSFrameRegister *)JS_VALUE_GET_PTR(fn->u.reg.outer_frame); + if (!target) { + fprintf(stderr, "GETUP: NULL outer_frame at depth 0! pc=%d a=%d depth=%d slot=%d nr_slots=%d instr=0x%08x\n", + pc-1, a, depth, c, code->nr_slots, instr); + result = JS_ThrowInternalError(ctx, "GETUP: NULL outer_frame"); + goto disrupt; + } for (int d = 1; d < depth; d++) { fn = JS_VALUE_GET_FUNCTION(target->function); - target = (JSFrameRegister *)JS_VALUE_GET_PTR(fn->u.reg.outer_frame); + JSFrameRegister *next = (JSFrameRegister *)JS_VALUE_GET_PTR(fn->u.reg.outer_frame); + if (!next) { + fprintf(stderr, "GETUP: NULL outer_frame at depth %d! pc=%d a=%d depth=%d slot=%d nr_slots=%d instr=0x%08x\n", + d, pc-1, a, depth, c, code->nr_slots, instr); + result = JS_ThrowInternalError(ctx, "GETUP: NULL outer_frame at depth %d", d); + goto disrupt; + } + target = next; } frame->slots[a] = target->slots[c]; break; @@ -4084,6 +2109,324 @@ static int ml_int(cJSON *arr, int idx) { return (int)cJSON_GetArrayItem(arr, idx)->valuedouble; } +/* ---- Register compression ---- + The mcode compiler allocates slots monotonically, producing register numbers + that can exceed 255. Since MachInstr32 uses 8-bit fields, we must compress + the register space via live-range analysis before lowering. + + For each slot we record its first and last instruction reference, then do a + greedy linear-scan allocation to pack them into the fewest physical registers. + Slots referenced by child functions via get/put (parent_slot) are in the + PARENT frame and are not remapped here — only current-frame register + operands are touched. */ + +#define MAX_REG_ITEMS 32 + +/* Return cJSON pointers to all current-frame register operands in an + instruction. out[] must have room for MAX_REG_ITEMS entries. */ +static int mcode_reg_items(cJSON *it, cJSON **out) { + int sz = cJSON_GetArraySize(it); + if (sz < 3) return 0; + const char *op = cJSON_GetArrayItem(it, 0)->valuestring; + int c = 0; + +#define ADD(pos) do { \ + cJSON *_r = cJSON_GetArrayItem(it, (pos)); \ + if (_r && cJSON_IsNumber(_r) && c < MAX_REG_ITEMS) out[c++] = _r; \ +} while (0) + + /* get/put: only [1] is current-frame (dest/src); [2]=parent_slot, [3]=level */ + if (!strcmp(op, "get") || !strcmp(op, "put")) { ADD(1); return c; } + + /* dest-only */ + if (!strcmp(op, "access") || !strcmp(op, "int") || + !strcmp(op, "function") || !strcmp(op, "regexp") || + !strcmp(op, "true") || !strcmp(op, "false") || !strcmp(op, "null")) + { ADD(1); return c; } + + /* invoke: [1]=frame, [2]=dest (result register) */ + if (!strcmp(op, "invoke")) { ADD(1); ADD(2); return c; } + /* goinvoke: [1]=frame only (no result) */ + if (!strcmp(op, "goinvoke")) { ADD(1); return c; } + + /* set_var: [1]=name(string), [2]=val */ + if (!strcmp(op, "set_var")) { ADD(2); return c; } + + /* setarg: [1]=call, [2]=arg_idx(const), [3]=val */ + if (!strcmp(op, "setarg")) { ADD(1); ADD(3); return c; } + + /* frame/goframe: [1]=call, [2]=func, [3]=nr_args(const) */ + if (!strcmp(op, "frame") || !strcmp(op, "goframe")) { ADD(1); ADD(2); return c; } + + /* no regs */ + if (!strcmp(op, "jump") || !strcmp(op, "disrupt")) return 0; + + /* cond only */ + if (!strcmp(op, "jump_true") || !strcmp(op, "jump_false") || + !strcmp(op, "jump_not_null")) + { ADD(1); return c; } + + /* single reg */ + if (!strcmp(op, "return")) { ADD(1); return c; } + + /* delete: [1]=dest, [2]=obj, [3]=key (string or reg) */ + if (!strcmp(op, "delete")) { + ADD(1); ADD(2); + cJSON *k = cJSON_GetArrayItem(it, 3); + if (k && cJSON_IsNumber(k)) out[c++] = k; + return c; + } + + /* record: [1]=dest, [2]=0(const) — no line/col suffix */ + if (!strcmp(op, "record")) { ADD(1); return c; } + + /* array: [1]=dest, [2]=count(const), [3..]=elements (no line/col suffix) */ + if (!strcmp(op, "array")) { + ADD(1); + int cnt = (int)cJSON_GetArrayItem(it, 2)->valuedouble; + for (int j = 0; j < cnt; j++) ADD(3 + j); + return c; + } + + /* load_field: [1]=dest, [2]=obj, [3]=key (string or reg) */ + if (!strcmp(op, "load_field")) { + ADD(1); ADD(2); + cJSON *key = cJSON_GetArrayItem(it, 3); + if (key && cJSON_IsNumber(key)) out[c++] = key; + return c; + } + + /* store_field: [1]=obj, [2]=val, [3]=key (string or reg) */ + if (!strcmp(op, "store_field")) { + ADD(1); ADD(2); + cJSON *key = cJSON_GetArrayItem(it, 3); + if (key && cJSON_IsNumber(key)) out[c++] = key; + return c; + } + + /* Default: every numeric operand in [1..sz-3] is a register. + Covers move, arithmetic, comparisons, type checks, push, pop, + load_dynamic, store_dynamic, in, concat, logical, bitwise, etc. */ + for (int j = 1; j < sz - 2; j++) { + cJSON *item = cJSON_GetArrayItem(it, j); + if (item && cJSON_IsNumber(item)) out[c++] = item; + } + return c; +#undef ADD +} + +/* Compress register numbers in a single function's mcode JSON so they + fit in 8 bits. Modifies the cJSON instructions and nr_slots in place. + Returns a malloc'd remap table (caller must free), or NULL if no + compression was needed. *out_old_nr_slots is set to the original count. */ +static int *mcode_compress_regs(cJSON *fobj, int *out_old_nr_slots, + int *captured_slots, int n_captured) { + cJSON *nr_slots_j = cJSON_GetObjectItemCaseSensitive(fobj, "nr_slots"); + int nr_slots = (int)cJSON_GetNumberValue(nr_slots_j); + *out_old_nr_slots = nr_slots; + return NULL; /* TEMP: disable compression to test */ + if (nr_slots <= 255) return NULL; + + int nr_args = (int)cJSON_GetNumberValue( + cJSON_GetObjectItemCaseSensitive(fobj, "nr_args")); + cJSON *instrs = cJSON_GetObjectItemCaseSensitive(fobj, "instructions"); + int n = instrs ? cJSON_GetArraySize(instrs) : 0; + + /* Step 1: build live ranges (first_ref / last_ref per slot) */ + int *first_ref = sys_malloc(nr_slots * sizeof(int)); + int *last_ref = sys_malloc(nr_slots * sizeof(int)); + for (int i = 0; i < nr_slots; i++) { first_ref[i] = -1; last_ref[i] = -1; } + + /* Args are live for the whole function */ + for (int i = 0; i < nr_args; i++) { first_ref[i] = 0; last_ref[i] = n; } + + for (int i = 0; i < n; i++) { + cJSON *it = cJSON_GetArrayItem(instrs, i); + if (!cJSON_IsArray(it)) continue; + cJSON *regs[MAX_REG_ITEMS]; + int rc = mcode_reg_items(it, regs); + for (int j = 0; j < rc; j++) { + int s = (int)regs[j]->valuedouble; + if (s < 0 || s >= nr_slots) continue; + if (first_ref[s] < 0) first_ref[s] = i; + last_ref[s] = i; + } + } + + /* Step 1a: extend live ranges for closure-captured slots. + If a child function captures a parent slot via get/put, that slot must + remain live for the entire parent function (the closure can read it at + any time while the parent frame is on the stack). */ + for (int ci = 0; ci < n_captured; ci++) { + int s = captured_slots[ci]; + if (s >= 0 && s < nr_slots) { + if (first_ref[s] < 0) first_ref[s] = 0; + last_ref[s] = n; + } + } + + /* Step 1b: extend live ranges for loops (backward jumps). + Build label→position map, then for each backward jump [target..jump], + extend all overlapping live ranges to cover the full loop body. */ + { + /* Collect label positions */ + typedef struct { const char *name; int pos; } LabelPos; + int lbl_cap = 32, lbl_n = 0; + LabelPos *lbls = sys_malloc(lbl_cap * sizeof(LabelPos)); + for (int i = 0; i < n; i++) { + cJSON *it = cJSON_GetArrayItem(instrs, i); + if (cJSON_IsString(it)) { + if (lbl_n >= lbl_cap) { + lbl_cap *= 2; + lbls = sys_realloc(lbls, lbl_cap * sizeof(LabelPos)); + } + lbls[lbl_n++] = (LabelPos){it->valuestring, i}; + } + } + /* Find backward jumps and extend live ranges */ + int changed = 1; + while (changed) { + changed = 0; + for (int i = 0; i < n; i++) { + cJSON *it = cJSON_GetArrayItem(instrs, i); + if (!cJSON_IsArray(it)) continue; + int sz = cJSON_GetArraySize(it); + if (sz < 3) continue; + const char *op = cJSON_GetArrayItem(it, 0)->valuestring; + const char *target = NULL; + if (!strcmp(op, "jump")) { + target = cJSON_GetArrayItem(it, 1)->valuestring; + } else if (!strcmp(op, "jump_true") || !strcmp(op, "jump_false") || + !strcmp(op, "jump_not_null")) { + target = cJSON_GetArrayItem(it, 2)->valuestring; + } + if (!target) continue; + /* Find label position */ + int tpos = -1; + for (int j = 0; j < lbl_n; j++) { + if (!strcmp(lbls[j].name, target)) { tpos = lbls[j].pos; break; } + } + if (tpos < 0 || tpos >= i) continue; /* forward jump or not found */ + /* Backward jump: extend registers that are live INTO the loop + (first_ref < loop start but used inside). Temporaries born + inside the loop body don't need extension — they are per-iteration. */ + for (int s = nr_args; s < nr_slots; s++) { + if (first_ref[s] < 0) continue; + if (first_ref[s] >= tpos) continue; /* born inside loop — skip */ + if (last_ref[s] < tpos) continue; /* dead before loop — skip */ + /* Register is live into the loop body — extend to loop end */ + if (last_ref[s] < i) { last_ref[s] = i; changed = 1; } + } + } + } + sys_free(lbls); + } + + /* Step 2: linear-scan register allocation */ + typedef struct { int slot, first, last; } SlotInfo; + int cnt = 0; + SlotInfo *sorted = sys_malloc(nr_slots * sizeof(SlotInfo)); + for (int s = nr_args; s < nr_slots; s++) + if (first_ref[s] >= 0) + sorted[cnt++] = (SlotInfo){s, first_ref[s], last_ref[s]}; + + /* Sort by first_ref, tie-break by original slot (keeps named vars first) */ + for (int i = 1; i < cnt; i++) { + SlotInfo key = sorted[i]; + int j = i - 1; + while (j >= 0 && (sorted[j].first > key.first || + (sorted[j].first == key.first && sorted[j].slot > key.slot))) { + sorted[j + 1] = sorted[j]; + j--; + } + sorted[j + 1] = key; + } + + int *remap = sys_malloc(nr_slots * sizeof(int)); + for (int i = 0; i < nr_slots; i++) remap[i] = i; + + /* Free-register pool (min-heap would be ideal but a flat scan is fine) */ + int *pool = sys_malloc(nr_slots * sizeof(int)); + int pool_n = 0; + int next_phys = nr_args; + + typedef struct { int phys, last; } ActiveAlloc; + ActiveAlloc *active = sys_malloc(cnt * sizeof(ActiveAlloc)); + int active_n = 0; + + for (int i = 0; i < cnt; i++) { + int first = sorted[i].first; + /* Expire intervals whose last_ref < first */ + for (int j = 0; j < active_n; ) { + if (active[j].last < first) { + pool[pool_n++] = active[j].phys; + active[j] = active[--active_n]; + } else { + j++; + } + } + /* Pick lowest available physical register */ + int phys; + if (pool_n > 0) { + int mi = 0; + for (int j = 1; j < pool_n; j++) + if (pool[j] < pool[mi]) mi = j; + phys = pool[mi]; + pool[mi] = pool[--pool_n]; + } else { + phys = next_phys++; + } + remap[sorted[i].slot] = phys; + active[active_n++] = (ActiveAlloc){phys, sorted[i].last}; + } + + /* Compute new nr_slots */ + int new_max = nr_args; + for (int s = 0; s < nr_slots; s++) + if (first_ref[s] >= 0 && remap[s] >= new_max) + new_max = remap[s] + 1; + + fprintf(stderr, " compress_regs: %d -> %d slots\n", nr_slots, new_max); + if (new_max > 255) + fprintf(stderr, " WARNING: %d live regs still exceeds 255\n", new_max); + + /* Verify: check no two registers with overlapping live ranges share phys */ + for (int a = nr_args; a < nr_slots; a++) { + if (first_ref[a] < 0) continue; + for (int b = a + 1; b < nr_slots; b++) { + if (first_ref[b] < 0) continue; + if (remap[a] != remap[b]) continue; + /* Same phys — ranges must NOT overlap */ + if (first_ref[a] <= last_ref[b] && first_ref[b] <= last_ref[a]) { + fprintf(stderr, " OVERLAP: slot %d [%d,%d] and slot %d [%d,%d] -> phys %d\n", + a, first_ref[a], last_ref[a], b, first_ref[b], last_ref[b], remap[a]); + } + } + } + + /* Step 3: apply remap to instructions */ + for (int i = 0; i < n; i++) { + cJSON *it = cJSON_GetArrayItem(instrs, i); + if (!cJSON_IsArray(it)) continue; + cJSON *regs[MAX_REG_ITEMS]; + int rc = mcode_reg_items(it, regs); + for (int j = 0; j < rc; j++) { + int old = (int)regs[j]->valuedouble; + if (old >= 0 && old < nr_slots) { + cJSON_SetNumberValue(regs[j], remap[old]); + } + } + } + + /* Update nr_slots in the JSON */ + cJSON_SetNumberValue(nr_slots_j, new_max); + + sys_free(first_ref); sys_free(last_ref); + sys_free(sorted); + sys_free(pool); sys_free(active); + return remap; /* caller must free */ +} + /* Lower one function's mcode instructions to MachInstr32 */ static MachCode *mcode_lower_func(cJSON *fobj, const char *filename) { McodeLowerState s = {0}; @@ -4242,13 +2585,25 @@ static MachCode *mcode_lower_func(cJSON *fobj, const char *filename) { /* Property access */ else if (strcmp(op, "load_field") == 0) { int dest = A1, obj = A2; - const char *key = cJSON_GetArrayItem(it, 3)->valuestring; - EM(MACH_ABC(MACH_LOAD_FIELD, dest, obj, ml_cpool_str(&s, key))); + cJSON *key_item = cJSON_GetArrayItem(it, 3); + if (cJSON_IsString(key_item)) { + EM(MACH_ABC(MACH_LOAD_FIELD, dest, obj, ml_cpool_str(&s, key_item->valuestring))); + } else { + /* key is a register — fall back to dynamic access */ + int key_reg = (int)key_item->valuedouble; + EM(MACH_ABC(MACH_LOAD_DYNAMIC, dest, obj, key_reg)); + } } else if (strcmp(op, "store_field") == 0) { int obj = A1, val = A2; - const char *key = cJSON_GetArrayItem(it, 3)->valuestring; - EM(MACH_ABC(MACH_STORE_FIELD, obj, ml_cpool_str(&s, key), val)); + cJSON *key_item = cJSON_GetArrayItem(it, 3); + if (cJSON_IsString(key_item)) { + EM(MACH_ABC(MACH_STORE_FIELD, obj, ml_cpool_str(&s, key_item->valuestring), val)); + } else { + /* key is a register — fall back to dynamic access */ + int key_reg = (int)key_item->valuedouble; + EM(MACH_ABC(MACH_STORE_DYNAMIC, obj, key_reg, val)); + } } else if (strcmp(op, "load_index") == 0) { ABC3(MACH_LOAD_INDEX); } else if (strcmp(op, "store_index") == 0) { @@ -4486,6 +2841,23 @@ static void mcode_assign_children(MachCode *mc, MachCode **compiled, int total) sys_free(refs); } +void verify_getup(MachCode *mc, const char *path) { + for (uint32_t i = 0; i < mc->instr_count; i++) { + MachInstr32 instr = mc->instructions[i]; + if (MACH_GET_OP(instr) == MACH_GETUP) { + int depth = MACH_GET_B(instr); + if (depth > 2) + fprintf(stderr, "VERIFY: bad GETUP at %s[%d]: depth=%d slot=%d dest=%d instr=0x%08x nr_slots=%d\n", + path, i, depth, MACH_GET_C(instr), MACH_GET_A(instr), instr, mc->nr_slots); + } + } + for (uint32_t i = 0; i < mc->func_count; i++) { + char child[256]; + snprintf(child, sizeof(child), "%s.func[%d]", path, i); + verify_getup(mc->functions[i], child); + } +} + /* Compile mcode JSON IR to MachCode binary. mcode_json has: functions[], main{}, filename, name */ MachCode *mach_compile_mcode(cJSON *mcode_json) { @@ -4494,6 +2866,139 @@ MachCode *mach_compile_mcode(cJSON *mcode_json) { cJSON *funcs_arr = cJSON_GetObjectItemCaseSensitive(mcode_json, "functions"); int func_count = funcs_arr ? cJSON_GetArraySize(funcs_arr) : 0; + cJSON *main_obj = cJSON_GetObjectItemCaseSensitive(mcode_json, "main"); + + /* Build parent_of[]: for each function, which function index is its parent. + parent_of[i] = parent index, or func_count for main, or -1 if unknown. + Scan each function (and main) for "function" instructions. */ + int *parent_of = sys_malloc(func_count * sizeof(int)); + for (int i = 0; i < func_count; i++) parent_of[i] = -1; + + /* Scan main's instructions */ + { + cJSON *main_instrs = cJSON_GetObjectItemCaseSensitive(main_obj, "instructions"); + int mn = main_instrs ? cJSON_GetArraySize(main_instrs) : 0; + for (int i = 0; i < mn; i++) { + cJSON *it = cJSON_GetArrayItem(main_instrs, i); + if (!cJSON_IsArray(it) || cJSON_GetArraySize(it) < 3) continue; + const char *op = cJSON_GetArrayItem(it, 0)->valuestring; + if (!strcmp(op, "function")) { + int child_idx = (int)cJSON_GetArrayItem(it, 2)->valuedouble; + if (child_idx >= 0 && child_idx < func_count) + parent_of[child_idx] = func_count; /* main */ + } + } + } + /* Scan each function's instructions */ + for (int fi = 0; fi < func_count; fi++) { + cJSON *fobj = cJSON_GetArrayItem(funcs_arr, fi); + cJSON *finstrs = cJSON_GetObjectItemCaseSensitive(fobj, "instructions"); + int fn = finstrs ? cJSON_GetArraySize(finstrs) : 0; + for (int i = 0; i < fn; i++) { + cJSON *it = cJSON_GetArrayItem(finstrs, i); + if (!cJSON_IsArray(it) || cJSON_GetArraySize(it) < 3) continue; + const char *op = cJSON_GetArrayItem(it, 0)->valuestring; + if (!strcmp(op, "function")) { + int child_idx = (int)cJSON_GetArrayItem(it, 2)->valuedouble; + if (child_idx >= 0 && child_idx < func_count) + parent_of[child_idx] = fi; + } + } + } + + /* Build per-function capture sets: for each function F, which of its slots + are captured by descendant functions via get/put. Captured slots must + have extended live ranges during register compression. */ + int **cap_slots = sys_malloc((func_count + 1) * sizeof(int *)); + int *cap_counts = sys_malloc((func_count + 1) * sizeof(int)); + memset(cap_slots, 0, (func_count + 1) * sizeof(int *)); + memset(cap_counts, 0, (func_count + 1) * sizeof(int)); + + for (int fi = 0; fi < func_count; fi++) { + cJSON *fobj = cJSON_GetArrayItem(funcs_arr, fi); + cJSON *finstrs = cJSON_GetObjectItemCaseSensitive(fobj, "instructions"); + int fn = finstrs ? cJSON_GetArraySize(finstrs) : 0; + for (int i = 0; i < fn; i++) { + cJSON *it = cJSON_GetArrayItem(finstrs, i); + if (!cJSON_IsArray(it) || cJSON_GetArraySize(it) < 4) continue; + const char *op = cJSON_GetArrayItem(it, 0)->valuestring; + if (strcmp(op, "get") && strcmp(op, "put")) continue; + int slot = (int)cJSON_GetArrayItem(it, 2)->valuedouble; + int level = (int)cJSON_GetArrayItem(it, 3)->valuedouble; + /* Walk up parent chain to find the ancestor whose slot is referenced */ + int ancestor = fi; + for (int l = 0; l < level && ancestor >= 0; l++) + ancestor = parent_of[ancestor]; + if (ancestor < 0) continue; + /* Add slot to ancestor's capture list (deduplicate) */ + int found = 0; + for (int k = 0; k < cap_counts[ancestor]; k++) + if (cap_slots[ancestor][k] == slot) { found = 1; break; } + if (!found) { + cap_slots[ancestor] = sys_realloc(cap_slots[ancestor], + (cap_counts[ancestor] + 1) * sizeof(int)); + cap_slots[ancestor][cap_counts[ancestor]++] = slot; + } + } + } + + /* Compress registers for functions that exceed 8-bit slot limits. + Save remap tables so we can fix get/put parent_slot references. */ + int **remaps = sys_malloc((func_count + 1) * sizeof(int *)); + int *remap_sizes = sys_malloc((func_count + 1) * sizeof(int)); + memset(remaps, 0, (func_count + 1) * sizeof(int *)); + + for (int i = 0; i < func_count; i++) + remaps[i] = mcode_compress_regs(cJSON_GetArrayItem(funcs_arr, i), + &remap_sizes[i], cap_slots[i], cap_counts[i]); + /* main is stored at index func_count in our arrays */ + remaps[func_count] = mcode_compress_regs(main_obj, + &remap_sizes[func_count], cap_slots[func_count], cap_counts[func_count]); + + /* Free capture lists */ + for (int i = 0; i <= func_count; i++) + if (cap_slots[i]) sys_free(cap_slots[i]); + sys_free(cap_slots); + sys_free(cap_counts); + + /* Fix up get/put parent_slot references using ancestor remap tables */ + for (int fi = 0; fi < func_count; fi++) { + cJSON *fobj = cJSON_GetArrayItem(funcs_arr, fi); + cJSON *finstrs = cJSON_GetObjectItemCaseSensitive(fobj, "instructions"); + int fn = finstrs ? cJSON_GetArraySize(finstrs) : 0; + for (int i = 0; i < fn; i++) { + cJSON *it = cJSON_GetArrayItem(finstrs, i); + if (!cJSON_IsArray(it) || cJSON_GetArraySize(it) < 4) continue; + const char *op = cJSON_GetArrayItem(it, 0)->valuestring; + if (strcmp(op, "get") && strcmp(op, "put")) continue; + int level = (int)cJSON_GetArrayItem(it, 3)->valuedouble; + /* Walk up parent chain 'level' times to find ancestor */ + int ancestor = fi; + for (int l = 0; l < level && ancestor >= 0; l++) { + ancestor = parent_of[ancestor]; + } + if (ancestor < 0) continue; /* unknown parent — leave as is */ + int *anc_remap = remaps[ancestor]; + if (!anc_remap) continue; /* ancestor wasn't compressed */ + cJSON *slot_item = cJSON_GetArrayItem(it, 2); + int old_slot = (int)slot_item->valuedouble; + if (old_slot >= 0 && old_slot < remap_sizes[ancestor]) { + int new_slot = anc_remap[old_slot]; + if (old_slot != new_slot) + fprintf(stderr, " FIXUP: func[%d] %s parent_slot %d -> %d (ancestor=%d level=%d)\n", + fi, op, old_slot, new_slot, ancestor, level); + cJSON_SetNumberValue(slot_item, new_slot); + } + } + } + + /* Free remap tables */ + for (int i = 0; i <= func_count; i++) + if (remaps[i]) sys_free(remaps[i]); + sys_free(remaps); + sys_free(remap_sizes); + sys_free(parent_of); + /* Compile all flat functions */ MachCode **compiled = NULL; if (func_count > 0) { @@ -4504,14 +3009,28 @@ MachCode *mach_compile_mcode(cJSON *mcode_json) { } /* Compile main */ - cJSON *main_obj = cJSON_GetObjectItemCaseSensitive(mcode_json, "main"); MachCode *main_code = mcode_lower_func(main_obj, filename); + /* Verify each flat function before tree assembly */ + fprintf(stderr, "COMPILE %s: %d flat functions\n", filename ? filename : "?", func_count); + for (int i = 0; i < func_count; i++) { + char name_buf[128]; + snprintf(name_buf, sizeof(name_buf), "%s:FLAT[%d]", filename ? filename : "?", i); + verify_getup(compiled[i], name_buf); + } + /* Assign nested functions to each compiled unit */ for (int i = 0; i < func_count; i++) mcode_assign_children(compiled[i], compiled, func_count); mcode_assign_children(main_code, compiled, func_count); + /* Verify after tree assembly */ + { + char post_name[128]; + snprintf(post_name, sizeof(post_name), "%s:POST", filename ? filename : "?"); + verify_getup(main_code, post_name); + } + sys_free(compiled); return main_code; } @@ -4785,70 +3304,33 @@ static void dump_register_code(JSContext *ctx, JSCodeRegister *code, int indent) } } -/* Dump MACH bytecode to stdout for debugging. Takes AST cJSON tree. */ -void JS_DumpMachTree(JSContext *ctx, cJSON *ast, JSValue env) { - MachCode *mc = JS_CompileMachTree(ast); - if (!mc) { - printf("=== MACH Bytecode ===\nFailed to compile\n=== End MACH Bytecode ===\n"); - return; - } - - JSCodeRegister *code = JS_LoadMachCode(ctx, mc, env); - printf("=== MACH Bytecode ===\n"); - dump_register_code(ctx, code, 0); - printf("=== End MACH Bytecode ===\n"); -} - -void JS_DumpMach(JSContext *ctx, const char *ast_json, JSValue env) { - cJSON *ast = cJSON_Parse(ast_json); - if (!ast) { - printf("=== MACH Bytecode ===\nFailed to parse\n=== End MACH Bytecode ===\n"); - return; - } - JS_DumpMachTree(ctx, ast, env); - cJSON_Delete(ast); -} - -/* Compile and execute MACH bytecode. Takes AST cJSON tree. */ -JSValue JS_RunMachTree(JSContext *ctx, cJSON *ast, JSValue env) { - MachCode *mc = JS_CompileMachTree(ast); - if (!mc) { - return JS_ThrowSyntaxError(ctx, "failed to compile AST to MACH bytecode"); - } - - /* Protect env from GC — JS_LoadMachCode allocates on GC heap */ - JSGCRef env_ref; - JS_PushGCRef(ctx, &env_ref); - env_ref.val = env; - - JSCodeRegister *code = JS_LoadMachCode(ctx, mc, env_ref.val); - JSValue result = JS_CallRegisterVM(ctx, code, ctx->global_obj, 0, NULL, env_ref.val, JS_NULL); - JS_PopGCRef(ctx, &env_ref); - return result; -} - JSValue JS_RunMachBin(JSContext *ctx, const uint8_t *data, size_t size, JSValue env) { MachCode *mc = JS_DeserializeMachCode(data, size); if (!mc) return JS_ThrowSyntaxError(ctx, "failed to deserialize MACH bytecode"); + fprintf(stderr, "DEBUG RunMachBin: mc=%p instr_count=%d cpool_count=%d func_count=%d nr_slots=%d\n", + (void*)mc, mc->instr_count, mc->cpool_count, mc->func_count, mc->nr_slots); + verify_getup(mc, "DESER_BOOT"); + if (mc->instr_count > 0) { + fprintf(stderr, "DEBUG first 5 instrs:"); + for (uint32_t i = 0; i < 5 && i < mc->instr_count; i++) + fprintf(stderr, " 0x%08x", mc->instructions[i]); + fprintf(stderr, "\n"); + } + JSGCRef env_ref; JS_PushGCRef(ctx, &env_ref); env_ref.val = env; JSCodeRegister *code = JS_LoadMachCode(ctx, mc, env_ref.val); JS_FreeMachCode(mc); + + fprintf(stderr, "DEBUG LoadMachCode: code=%p instr_count=%d cpool_count=%d func_count=%d\n", + (void*)code, code->instr_count, code->cpool_count, code->func_count); + JSValue result = JS_CallRegisterVM(ctx, code, ctx->global_obj, 0, NULL, env_ref.val, JS_NULL); JS_PopGCRef(ctx, &env_ref); return result; } -JSValue JS_RunMach(JSContext *ctx, const char *ast_json, JSValue env) { - cJSON *ast = cJSON_Parse(ast_json); - if (!ast) { - return JS_ThrowSyntaxError(ctx, "failed to parse AST JSON"); - } - JSValue result = JS_RunMachTree(ctx, ast, env); - cJSON_Delete(ast); - return result; -} diff --git a/source/mcode.c b/source/mcode.c deleted file mode 100644 index 96aabbb5..00000000 --- a/source/mcode.c +++ /dev/null @@ -1,2038 +0,0 @@ -/* - * QuickJS Javascript Engine - * - * Copyright (c) 2017-2025 Fabrice Bellard - * Copyright (c) 2017-2025 Charlie Gordon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#include "quickjs-internal.h" - - -/* ============================================================ - MCODE JSON Interpreter - ============================================================ */ - -/* Parse a single MCODE function from cJSON into a JSMCode struct */ -/* Parse a single function (no recursive function parsing) */ -JSMCode *jsmcode_parse_one(cJSON *func_def) { - JSMCode *code = js_mallocz_rt(sizeof(JSMCode)); - if (!code) return NULL; - - code->nr_args = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItemCaseSensitive(func_def, "nr_args")); - code->nr_slots = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItemCaseSensitive(func_def, "nr_slots")); - - /* Build instruction array from cJSON linked list */ - cJSON *instrs_arr = cJSON_GetObjectItemCaseSensitive(func_def, "instructions"); - int raw_count = cJSON_GetArraySize(instrs_arr); - code->instrs = js_mallocz_rt(raw_count * sizeof(cJSON *)); - code->instr_count = 0; - - /* First pass: count labels and build instruction array */ - uint32_t label_cap = 32; - code->labels = js_mallocz_rt(label_cap * sizeof(*code->labels)); - code->label_count = 0; - - cJSON *item; - uint32_t idx = 0; - cJSON_ArrayForEach(item, instrs_arr) { - if (cJSON_IsString(item)) { - /* Label marker — record position, don't add to instruction array */ - if (code->label_count >= label_cap) { - label_cap *= 2; - code->labels = js_realloc_rt(code->labels, label_cap * sizeof(*code->labels)); - } - code->labels[code->label_count].name = item->valuestring; - code->labels[code->label_count].index = idx; - code->label_count++; - } else { - /* Instruction (array) */ - code->instrs[idx++] = item; - } - } - code->instr_count = idx; - - /* Extract line table from trailing numbers in each instruction array */ - if (idx > 0) { - code->line_table = js_mallocz_rt(idx * sizeof(MachLineEntry)); - for (uint32_t i = 0; i < idx; i++) { - cJSON *instr = code->instrs[i]; - int n = cJSON_GetArraySize(instr); - if (n >= 2) { - cJSON *line_item = cJSON_GetArrayItem(instr, n - 2); - cJSON *col_item = cJSON_GetArrayItem(instr, n - 1); - if (cJSON_IsNumber(line_item) && cJSON_IsNumber(col_item)) { - code->line_table[i].line = (uint16_t)line_item->valuedouble; - code->line_table[i].col = (uint16_t)col_item->valuedouble; - } - } - } - } - - /* Extract name and filename from function definition */ - code->name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(func_def, "name")); - code->filename = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(func_def, "filename")); - - /* Extract disruption_pc */ - cJSON *dpc = cJSON_GetObjectItemCaseSensitive(func_def, "disruption_pc"); - code->disruption_pc = dpc ? (uint16_t)cJSON_GetNumberValue(dpc) : 0; - - return code; -} - -/* Parse MCODE: main + all functions from the global functions array. - All JSMCode structs share the same functions[] pointer. */ -JSMCode *jsmcode_parse(cJSON *func_def, cJSON *all_functions) { - /* Parse the global functions array first (flat, non-recursive) */ - uint32_t func_count = all_functions ? cJSON_GetArraySize(all_functions) : 0; - JSMCode **parsed_funcs = NULL; - if (func_count > 0) { - parsed_funcs = js_mallocz_rt(func_count * sizeof(JSMCode *)); - for (uint32_t i = 0; i < func_count; i++) { - cJSON *fn = cJSON_GetArrayItem(all_functions, i); - parsed_funcs[i] = jsmcode_parse_one(fn); - /* Each function shares the same functions array */ - parsed_funcs[i]->func_count = func_count; - parsed_funcs[i]->functions = parsed_funcs; - } - } - - /* Parse the main function */ - JSMCode *code = jsmcode_parse_one(func_def); - code->func_count = func_count; - code->functions = parsed_funcs; - - return code; -} - -/* Free a top-level JSMCode and all its shared functions. - Only call this on the main code returned by jsmcode_parse. */ -void jsmcode_free(JSMCode *code) { - if (!code) return; - /* Free all parsed functions (they share the same functions array) */ - if (code->functions) { - for (uint32_t i = 0; i < code->func_count; i++) { - if (code->functions[i]) { - /* Don't free functions[i]->functions — it's the shared pointer */ - if (code->functions[i]->instrs) js_free_rt(code->functions[i]->instrs); - if (code->functions[i]->labels) js_free_rt(code->functions[i]->labels); - if (code->functions[i]->line_table) js_free_rt(code->functions[i]->line_table); - js_free_rt(code->functions[i]); - } - } - js_free_rt(code->functions); - } - if (code->instrs) js_free_rt(code->instrs); - if (code->labels) js_free_rt(code->labels); - if (code->line_table) js_free_rt(code->line_table); - if (code->json_root) cJSON_Delete(code->json_root); - js_free_rt(code); -} - -/* Resolve label name → instruction index */ -static uint32_t mcode_resolve_label(JSMCode *code, const char *name) { - for (uint32_t i = 0; i < code->label_count; i++) { - if (strcmp(code->labels[i].name, name) == 0) - return code->labels[i].index; - } - return code->instr_count; /* past end = implicit return */ -} - -/* Create a MCODE function object. - outer_frame must be set by the caller AFTER refreshing from GC root, - since js_mallocz can trigger GC which invalidates stale JSValues. */ -JSValue js_new_mcode_function(JSContext *ctx, JSMCode *code) { - JSFunction *fn = js_mallocz(ctx, sizeof(JSFunction)); - if (!fn) return JS_EXCEPTION; - - fn->header = objhdr_make(0, OBJ_FUNCTION, 0, 0, 0, 0); - fn->kind = JS_FUNC_KIND_MCODE; - fn->length = code->nr_args; - fn->name = JS_NULL; - fn->u.mcode.code = code; - fn->u.mcode.outer_frame = JS_NULL; - fn->u.mcode.env_record = JS_NULL; - - return JS_MKPTR(fn); -} - -/* Main MCODE interpreter — executes pre-parsed JSMCode */ -JSValue mcode_exec(JSContext *ctx, JSMCode *code, JSValue this_obj, - int argc, JSValue *argv, JSValue outer_frame) { - /* Protect argv, this_obj, outer_frame from GC by pushing onto value_stack. - alloc_frame_register and js_new_mcode_function can trigger GC. */ - int vs_save = ctx->value_stack_top; - int nargs_copy = (argc < code->nr_args) ? argc : code->nr_args; - ctx->value_stack[vs_save] = this_obj; - ctx->value_stack[vs_save + 1] = outer_frame; - for (int i = 0; i < nargs_copy; i++) - ctx->value_stack[vs_save + 2 + i] = argv[i]; - ctx->value_stack_top = vs_save + 2 + nargs_copy; - - JSFrameRegister *frame = alloc_frame_register(ctx, code->nr_slots); - if (!frame) { ctx->value_stack_top = vs_save; return JS_EXCEPTION; } - - /* Protect frame from GC */ - JSGCRef frame_ref; - JS_AddGCRef(ctx, &frame_ref); - frame_ref.val = JS_MKPTR(frame); - - /* Create a function object for the main frame so return can find the code */ - JSValue main_func = js_new_mcode_function(ctx, code); - if (JS_IsException(main_func)) { - ctx->value_stack_top = vs_save; - JS_DeleteGCRef(ctx, &frame_ref); - return JS_ThrowInternalError(ctx, "failed to allocate main function for MCODE"); - } - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - /* Set outer_frame AFTER allocation so it uses the post-GC value */ - JSFunction *main_fn = JS_VALUE_GET_FUNCTION(main_func); - main_fn->u.mcode.outer_frame = ctx->value_stack[vs_save + 1]; - frame->function = main_func; - - /* Setup initial frame from GC-safe value_stack */ - frame->slots[0] = ctx->value_stack[vs_save]; /* slot 0 is this */ - for (int i = 0; i < nargs_copy; i++) { - frame->slots[1 + i] = ctx->value_stack[vs_save + 2 + i]; - } - ctx->value_stack_top = vs_save; - - uint32_t pc = 0; - JSValue result = JS_NULL; - - for (;;) { - /* Check for interrupt */ - if (reg_vm_check_interrupt(ctx)) { - result = JS_ThrowInternalError(ctx, "interrupted"); - goto done; - } - - if (pc >= code->instr_count) { - /* Implicit return null */ - result = JS_NULL; - if (JS_IsNull(frame->caller)) goto done; - - /* Pop frame — read return info from CALLER */ - JSFrameRegister *caller = (JSFrameRegister *)JS_VALUE_GET_PTR(frame->caller); - int ret_info = JS_VALUE_GET_INT(caller->address); - frame->caller = JS_NULL; - frame = caller; - frame_ref.val = JS_MKPTR(frame); - - JSFunction *fn = JS_VALUE_GET_FUNCTION(frame->function); - code = fn->u.mcode.code; - pc = ret_info >> 16; - frame->slots[ret_info & 0xFFFF] = result; - continue; - } - - cJSON *instr = code->instrs[pc++]; - cJSON *op_item = cJSON_GetArrayItem(instr, 0); - const char *op = op_item->valuestring; - - /* Operand extraction helpers — items 1,2,3 */ - cJSON *a1 = cJSON_GetArrayItem(instr, 1); - cJSON *a2 = cJSON_GetArrayItem(instr, 2); - cJSON *a3 = cJSON_GetArrayItem(instr, 3); - - /* ---- Constants ---- */ - if (strcmp(op, "access") == 0) { - int dest = (int)a1->valuedouble; - if (cJSON_IsObject(a2)) { - /* Intrinsic: {"kind":"name","name":"...","make":"intrinsic"} */ - const char *iname = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(a2, "name")); - if (iname) { - JSValue key = JS_NewString(ctx, iname); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - /* Try env (outer_frame) first, then global */ - JSFunction *cur_fn = JS_VALUE_GET_FUNCTION(frame->function); - JSValue env = (cur_fn && cur_fn->kind == JS_FUNC_KIND_MCODE) - ? cur_fn->u.mcode.outer_frame : JS_NULL; - JSValue val = JS_NULL; - if (!JS_IsNull(env)) { - val = JS_GetProperty(ctx, env, key); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - } - if (JS_IsNull(val)) { - key = JS_NewString(ctx, iname); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - val = JS_GetProperty(ctx, ctx->global_obj, key); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - } - if (JS_IsNull(val)) { - key = JS_NewString(ctx, iname); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - int has = JS_HasProperty(ctx, ctx->global_obj, key); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (has <= 0) { - JS_ThrowReferenceError(ctx, "'%s' is not defined", iname); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - goto disrupt; - } - } - frame->slots[dest] = val; - } else { - frame->slots[dest] = JS_NULL; - } - } else if (cJSON_IsString(a2)) { - JSValue str = JS_NewString(ctx, a2->valuestring); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - frame->slots[dest] = str; - } else { - frame->slots[dest] = JS_NewFloat64(ctx, a2->valuedouble); - } - } - else if (strcmp(op, "int") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewFloat64(ctx, a2->valuedouble); - } - else if (strcmp(op, "null") == 0) { - frame->slots[(int)a1->valuedouble] = JS_NULL; - } - else if (strcmp(op, "true") == 0) { - frame->slots[(int)a1->valuedouble] = JS_TRUE; - } - else if (strcmp(op, "false") == 0) { - frame->slots[(int)a1->valuedouble] = JS_FALSE; - } - - /* ---- Movement ---- */ - else if (strcmp(op, "move") == 0) { - frame->slots[(int)a1->valuedouble] = frame->slots[(int)a2->valuedouble]; - } - - /* ---- Arithmetic (inline) ---- */ - else if (strcmp(op, "add") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - int64_t r = (int64_t)JS_VALUE_GET_INT(left) + (int64_t)JS_VALUE_GET_INT(right); - frame->slots[dest] = (r >= INT32_MIN && r <= INT32_MAX) - ? JS_NewInt32(ctx, (int32_t)r) : JS_NewFloat64(ctx, (double)r); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewFloat64(ctx, a + b); - } else if (JS_IsText(left) && JS_IsText(right)) { - JSValue res = JS_ConcatString(ctx, left, right); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - frame->slots[dest] = res; - } else { goto disrupt; } - } - else if (strcmp(op, "subtract") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - int64_t r = (int64_t)JS_VALUE_GET_INT(left) - (int64_t)JS_VALUE_GET_INT(right); - frame->slots[dest] = (r >= INT32_MIN && r <= INT32_MAX) - ? JS_NewInt32(ctx, (int32_t)r) : JS_NewFloat64(ctx, (double)r); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewFloat64(ctx, a - b); - } else { goto disrupt; } - } - else if (strcmp(op, "multiply") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - int64_t r = (int64_t)JS_VALUE_GET_INT(left) * (int64_t)JS_VALUE_GET_INT(right); - frame->slots[dest] = (r >= INT32_MIN && r <= INT32_MAX) - ? JS_NewInt32(ctx, (int32_t)r) : JS_NewFloat64(ctx, (double)r); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewFloat64(ctx, a * b); - } else { goto disrupt; } - } - else if (strcmp(op, "divide") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - int32_t ia = JS_VALUE_GET_INT(left), ib = JS_VALUE_GET_INT(right); - if (ib == 0) { frame->slots[dest] = JS_NULL; } - else if (ia % ib == 0) frame->slots[dest] = JS_NewInt32(ctx, ia / ib); - else frame->slots[dest] = JS_NewFloat64(ctx, (double)ia / (double)ib); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - if (b == 0.0) { frame->slots[dest] = JS_NULL; } - else frame->slots[dest] = JS_NewFloat64(ctx, a / b); - } else { goto disrupt; } - } - else if (strcmp(op, "integer_divide") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - int32_t ib = JS_VALUE_GET_INT(right); - if (ib == 0) { frame->slots[dest] = JS_NULL; } - else frame->slots[dest] = JS_NewInt32(ctx, JS_VALUE_GET_INT(left) / ib); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - if (b == 0.0) { frame->slots[dest] = JS_NULL; } - else frame->slots[dest] = JS_NewInt32(ctx, (int32_t)(a / b)); - } else { goto disrupt; } - } - else if (strcmp(op, "modulo") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - int32_t ib = JS_VALUE_GET_INT(right); - if (ib == 0) { frame->slots[dest] = JS_NULL; } - else frame->slots[dest] = JS_NewInt32(ctx, JS_VALUE_GET_INT(left) % ib); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - if (b == 0.0) { frame->slots[dest] = JS_NULL; } - else frame->slots[dest] = JS_NewFloat64(ctx, fmod(a, b)); - } else { goto disrupt; } - } - else if (strcmp(op, "remainder") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - int32_t ib = JS_VALUE_GET_INT(right); - if (ib == 0) { frame->slots[dest] = JS_NULL; } - else frame->slots[dest] = JS_NewInt32(ctx, JS_VALUE_GET_INT(left) % ib); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - if (b == 0.0) { frame->slots[dest] = JS_NULL; } - else frame->slots[dest] = JS_NewFloat64(ctx, remainder(a, b)); - } else { goto disrupt; } - } - else if (strcmp(op, "pow") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewFloat64(ctx, pow(a, b)); - } else { goto disrupt; } - } - else if (strcmp(op, "max") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - int32_t ia = JS_VALUE_GET_INT(left), ib = JS_VALUE_GET_INT(right); - frame->slots[dest] = JS_NewInt32(ctx, ia > ib ? ia : ib); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewFloat64(ctx, a > b ? a : b); - } else { goto disrupt; } - } - else if (strcmp(op, "min") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - int32_t ia = JS_VALUE_GET_INT(left), ib = JS_VALUE_GET_INT(right); - frame->slots[dest] = JS_NewInt32(ctx, ia < ib ? ia : ib); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewFloat64(ctx, a < b ? a : b); - } else { goto disrupt; } - } - else if (strcmp(op, "neg") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (!JS_IsNumber(v)) { goto disrupt; } - if (JS_IsInt(v)) { - int32_t i = JS_VALUE_GET_INT(v); - if (i == INT32_MIN) frame->slots[dest] = JS_NewFloat64(ctx, -(double)i); - else frame->slots[dest] = JS_NewInt32(ctx, -i); - } else { - double d; - JS_ToFloat64(ctx, &d, v); - frame->slots[dest] = JS_NewFloat64(ctx, -d); - } - } - /* ---- Compiler-internal type guards ---- */ - else if (strcmp(op, "is_int") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_IsInt(frame->slots[(int)a2->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "is_num") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_IsNumber(frame->slots[(int)a2->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "is_text") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_IsText(frame->slots[(int)a2->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "is_null") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_IsNull(frame->slots[(int)a2->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "is_bool") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = (JS_VALUE_GET_TAG(frame->slots[(int)a2->valuedouble]) == JS_TAG_BOOL) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "is_identical") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = (frame->slots[(int)a2->valuedouble] == frame->slots[(int)a3->valuedouble]) ? JS_TRUE : JS_FALSE; - } - - /* ---- Specialized arithmetic (int) ---- */ - else if (strcmp(op, "add_int") == 0) { - int dest = (int)a1->valuedouble; - int64_t r = (int64_t)JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]) + (int64_t)JS_VALUE_GET_INT(frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = (r >= INT32_MIN && r <= INT32_MAX) ? JS_NewInt32(ctx, (int32_t)r) : JS_NewFloat64(ctx, (double)r); - } - else if (strcmp(op, "sub_int") == 0) { - int dest = (int)a1->valuedouble; - int64_t r = (int64_t)JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]) - (int64_t)JS_VALUE_GET_INT(frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = (r >= INT32_MIN && r <= INT32_MAX) ? JS_NewInt32(ctx, (int32_t)r) : JS_NewFloat64(ctx, (double)r); - } - else if (strcmp(op, "mul_int") == 0) { - int dest = (int)a1->valuedouble; - int64_t r = (int64_t)JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]) * (int64_t)JS_VALUE_GET_INT(frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = (r >= INT32_MIN && r <= INT32_MAX) ? JS_NewInt32(ctx, (int32_t)r) : JS_NewFloat64(ctx, (double)r); - } - else if (strcmp(op, "div_int") == 0) { - int dest = (int)a1->valuedouble; - int32_t ia = JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]); - int32_t ib = JS_VALUE_GET_INT(frame->slots[(int)a3->valuedouble]); - if (ib == 0) frame->slots[dest] = JS_NULL; - else if (ia % ib == 0) frame->slots[dest] = JS_NewInt32(ctx, ia / ib); - else frame->slots[dest] = JS_NewFloat64(ctx, (double)ia / (double)ib); - } - else if (strcmp(op, "mod_int") == 0) { - int dest = (int)a1->valuedouble; - int32_t ib = JS_VALUE_GET_INT(frame->slots[(int)a3->valuedouble]); - if (ib == 0) frame->slots[dest] = JS_NULL; - else frame->slots[dest] = JS_NewInt32(ctx, JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]) % ib); - } - else if (strcmp(op, "neg_int") == 0) { - int dest = (int)a1->valuedouble; - int32_t i = JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]); - if (i == INT32_MIN) frame->slots[dest] = JS_NewFloat64(ctx, -(double)i); - else frame->slots[dest] = JS_NewInt32(ctx, -i); - } - - /* ---- Specialized arithmetic (float) ---- */ - else if (strcmp(op, "add_float") == 0) { - int dest = (int)a1->valuedouble; - double a, b; - JS_ToFloat64(ctx, &a, frame->slots[(int)a2->valuedouble]); - JS_ToFloat64(ctx, &b, frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = JS_NewFloat64(ctx, a + b); - } - else if (strcmp(op, "sub_float") == 0) { - int dest = (int)a1->valuedouble; - double a, b; - JS_ToFloat64(ctx, &a, frame->slots[(int)a2->valuedouble]); - JS_ToFloat64(ctx, &b, frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = JS_NewFloat64(ctx, a - b); - } - else if (strcmp(op, "mul_float") == 0) { - int dest = (int)a1->valuedouble; - double a, b; - JS_ToFloat64(ctx, &a, frame->slots[(int)a2->valuedouble]); - JS_ToFloat64(ctx, &b, frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = JS_NewFloat64(ctx, a * b); - } - else if (strcmp(op, "div_float") == 0) { - int dest = (int)a1->valuedouble; - double a, b; - JS_ToFloat64(ctx, &a, frame->slots[(int)a2->valuedouble]); - JS_ToFloat64(ctx, &b, frame->slots[(int)a3->valuedouble]); - if (b == 0.0) frame->slots[dest] = JS_NULL; - else frame->slots[dest] = JS_NewFloat64(ctx, a / b); - } - else if (strcmp(op, "mod_float") == 0) { - int dest = (int)a1->valuedouble; - double a, b; - JS_ToFloat64(ctx, &a, frame->slots[(int)a2->valuedouble]); - JS_ToFloat64(ctx, &b, frame->slots[(int)a3->valuedouble]); - if (b == 0.0) frame->slots[dest] = JS_NULL; - else frame->slots[dest] = JS_NewFloat64(ctx, fmod(a, b)); - } - else if (strcmp(op, "neg_float") == 0) { - int dest = (int)a1->valuedouble; - double d; - JS_ToFloat64(ctx, &d, frame->slots[(int)a2->valuedouble]); - frame->slots[dest] = JS_NewFloat64(ctx, -d); - } - - /* ---- Specialized comparisons (int) ---- */ - else if (strcmp(op, "eq_int") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]) == JS_VALUE_GET_INT(frame->slots[(int)a3->valuedouble])); - } - else if (strcmp(op, "ne_int") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]) != JS_VALUE_GET_INT(frame->slots[(int)a3->valuedouble])); - } - else if (strcmp(op, "lt_int") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]) < JS_VALUE_GET_INT(frame->slots[(int)a3->valuedouble])); - } - else if (strcmp(op, "le_int") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]) <= JS_VALUE_GET_INT(frame->slots[(int)a3->valuedouble])); - } - else if (strcmp(op, "gt_int") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]) > JS_VALUE_GET_INT(frame->slots[(int)a3->valuedouble])); - } - else if (strcmp(op, "ge_int") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(frame->slots[(int)a2->valuedouble]) >= JS_VALUE_GET_INT(frame->slots[(int)a3->valuedouble])); - } - - /* ---- Specialized comparisons (float) ---- */ - else if (strcmp(op, "eq_float") == 0) { - int dest = (int)a1->valuedouble; - double a, b; - JS_ToFloat64(ctx, &a, frame->slots[(int)a2->valuedouble]); - JS_ToFloat64(ctx, &b, frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = JS_NewBool(ctx, a == b); - } - else if (strcmp(op, "ne_float") == 0) { - int dest = (int)a1->valuedouble; - double a, b; - JS_ToFloat64(ctx, &a, frame->slots[(int)a2->valuedouble]); - JS_ToFloat64(ctx, &b, frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = JS_NewBool(ctx, a != b); - } - else if (strcmp(op, "lt_float") == 0) { - int dest = (int)a1->valuedouble; - double a, b; - JS_ToFloat64(ctx, &a, frame->slots[(int)a2->valuedouble]); - JS_ToFloat64(ctx, &b, frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = JS_NewBool(ctx, a < b); - } - else if (strcmp(op, "le_float") == 0) { - int dest = (int)a1->valuedouble; - double a, b; - JS_ToFloat64(ctx, &a, frame->slots[(int)a2->valuedouble]); - JS_ToFloat64(ctx, &b, frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = JS_NewBool(ctx, a <= b); - } - else if (strcmp(op, "gt_float") == 0) { - int dest = (int)a1->valuedouble; - double a, b; - JS_ToFloat64(ctx, &a, frame->slots[(int)a2->valuedouble]); - JS_ToFloat64(ctx, &b, frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = JS_NewBool(ctx, a > b); - } - else if (strcmp(op, "ge_float") == 0) { - int dest = (int)a1->valuedouble; - double a, b; - JS_ToFloat64(ctx, &a, frame->slots[(int)a2->valuedouble]); - JS_ToFloat64(ctx, &b, frame->slots[(int)a3->valuedouble]); - frame->slots[dest] = JS_NewBool(ctx, a >= b); - } - - /* ---- Specialized comparisons (text) ---- */ - else if (strcmp(op, "eq_text") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, frame->slots[(int)a2->valuedouble], frame->slots[(int)a3->valuedouble], TRUE) == 0); - } - else if (strcmp(op, "ne_text") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, frame->slots[(int)a2->valuedouble], frame->slots[(int)a3->valuedouble], TRUE) != 0); - } - else if (strcmp(op, "lt_text") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, frame->slots[(int)a2->valuedouble], frame->slots[(int)a3->valuedouble], FALSE) < 0); - } - else if (strcmp(op, "le_text") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, frame->slots[(int)a2->valuedouble], frame->slots[(int)a3->valuedouble], FALSE) <= 0); - } - else if (strcmp(op, "gt_text") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, frame->slots[(int)a2->valuedouble], frame->slots[(int)a3->valuedouble], FALSE) > 0); - } - else if (strcmp(op, "ge_text") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, frame->slots[(int)a2->valuedouble], frame->slots[(int)a3->valuedouble], FALSE) >= 0); - } - - /* ---- Specialized comparisons (bool) ---- */ - else if (strcmp(op, "eq_bool") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = (frame->slots[(int)a2->valuedouble] == frame->slots[(int)a3->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "ne_bool") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = (frame->slots[(int)a2->valuedouble] != frame->slots[(int)a3->valuedouble]) ? JS_TRUE : JS_FALSE; - } - - else if (strcmp(op, "abs") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (!JS_IsNumber(v)) { goto disrupt; } - if (JS_IsInt(v)) { - int32_t i = JS_VALUE_GET_INT(v); - if (i == INT32_MIN) frame->slots[dest] = JS_NewFloat64(ctx, (double)INT32_MAX + 1.0); - else frame->slots[dest] = JS_NewInt32(ctx, i < 0 ? -i : i); - } else { - double d; - JS_ToFloat64(ctx, &d, v); - frame->slots[dest] = JS_NewFloat64(ctx, fabs(d)); - } - } - else if (strcmp(op, "sign") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (!JS_IsNumber(v)) { goto disrupt; } - if (JS_IsInt(v)) { - int32_t i = JS_VALUE_GET_INT(v); - frame->slots[dest] = JS_NewInt32(ctx, (i > 0) - (i < 0)); - } else { - double d; - JS_ToFloat64(ctx, &d, v); - frame->slots[dest] = JS_NewInt32(ctx, (d > 0) - (d < 0)); - } - } - else if (strcmp(op, "fraction") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (!JS_IsNumber(v)) { goto disrupt; } - if (JS_IsInt(v)) { - frame->slots[dest] = JS_NewInt32(ctx, 0); - } else { - double d; - JS_ToFloat64(ctx, &d, v); - frame->slots[dest] = JS_NewFloat64(ctx, d - trunc(d)); - } - } - else if (strcmp(op, "integer") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (!JS_IsNumber(v)) { goto disrupt; } - if (JS_IsInt(v)) { - frame->slots[dest] = v; - } else { - double d; - JS_ToFloat64(ctx, &d, v); - frame->slots[dest] = JS_NewFloat64(ctx, trunc(d)); - } - } - else if (strcmp(op, "ceiling") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - JSValue p = frame->slots[(int)a3->valuedouble]; - if (!JS_IsNumber(v) || !JS_IsNumber(p)) { goto disrupt; } - double d, place; - JS_ToFloat64(ctx, &d, v); - JS_ToFloat64(ctx, &place, p); - frame->slots[dest] = JS_NewFloat64(ctx, ceil(d * place) / place); - } - else if (strcmp(op, "floor") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - JSValue p = frame->slots[(int)a3->valuedouble]; - if (!JS_IsNumber(v) || !JS_IsNumber(p)) { goto disrupt; } - double d, place; - JS_ToFloat64(ctx, &d, v); - JS_ToFloat64(ctx, &place, p); - frame->slots[dest] = JS_NewFloat64(ctx, floor(d * place) / place); - } - else if (strcmp(op, "round") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - JSValue p = frame->slots[(int)a3->valuedouble]; - if (!JS_IsNumber(v) || !JS_IsNumber(p)) { goto disrupt; } - double d, place; - JS_ToFloat64(ctx, &d, v); - JS_ToFloat64(ctx, &place, p); - frame->slots[dest] = JS_NewFloat64(ctx, round(d * place) / place); - } - else if (strcmp(op, "trunc") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - JSValue p = frame->slots[(int)a3->valuedouble]; - if (!JS_IsNumber(v) || !JS_IsNumber(p)) { goto disrupt; } - double d, place; - JS_ToFloat64(ctx, &d, v); - JS_ToFloat64(ctx, &place, p); - frame->slots[dest] = JS_NewFloat64(ctx, trunc(d * place) / place); - } - - /* ---- Text ---- */ - else if (strcmp(op, "concat") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (!JS_IsText(left) || !JS_IsText(right)) { goto disrupt; } - JSValue res = JS_ConcatString(ctx, left, right); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - frame->slots[dest] = res; - } - else if (strcmp(op, "concat_space") == 0) { - int dest = (int)a1->valuedouble; - int left_slot = (int)a2->valuedouble; - int right_slot = (int)a3->valuedouble; - JSValue left = frame->slots[left_slot]; - JSValue right = frame->slots[right_slot]; - if (!JS_IsText(left) || !JS_IsText(right)) { goto disrupt; } - JSValue space_str = JS_NewString(ctx, " "); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - JSValue space = JS_ConcatString(ctx, frame->slots[left_slot], space_str); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - JSValue res = JS_ConcatString(ctx, space, frame->slots[right_slot]); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - frame->slots[dest] = res; - } - else if (strcmp(op, "length") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (!JS_IsText(v)) { goto disrupt; } - frame->slots[dest] = JS_NewInt32(ctx, js_string_value_len(v)); - } - else if (strcmp(op, "lower") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (!JS_IsText(v)) { goto disrupt; } - int vs_base = ctx->value_stack_top; - ctx->value_stack[vs_base] = v; - ctx->value_stack_top = vs_base + 1; - JSValue res = js_cell_text_lower(ctx, JS_NULL, 1, &ctx->value_stack[vs_base]); - ctx->value_stack_top = vs_base; - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - frame->slots[dest] = res; - } - else if (strcmp(op, "upper") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (!JS_IsText(v)) { goto disrupt; } - int vs_base = ctx->value_stack_top; - ctx->value_stack[vs_base] = v; - ctx->value_stack_top = vs_base + 1; - JSValue res = js_cell_text_upper(ctx, JS_NULL, 1, &ctx->value_stack[vs_base]); - ctx->value_stack_top = vs_base; - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - frame->slots[dest] = res; - } - else if (strcmp(op, "character") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (!JS_IsNumber(v)) { goto disrupt; } - int vs_base = ctx->value_stack_top; - ctx->value_stack[vs_base] = v; - ctx->value_stack_top = vs_base + 1; - JSValue res = js_cell_character(ctx, JS_NULL, 1, &ctx->value_stack[vs_base]); - ctx->value_stack_top = vs_base; - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - frame->slots[dest] = res; - } - else if (strcmp(op, "codepoint") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (!JS_IsText(v)) { goto disrupt; } - int vs_base = ctx->value_stack_top; - ctx->value_stack[vs_base] = v; - ctx->value_stack_top = vs_base + 1; - JSValue res = js_cell_text_codepoint(ctx, JS_NULL, 1, &ctx->value_stack[vs_base]); - ctx->value_stack_top = vs_base; - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - frame->slots[dest] = res; - } - - /* ---- Comparison (inline) ---- */ - else if (strcmp(op, "eq") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (left == right) { - frame->slots[dest] = JS_TRUE; - } else if (JS_VALUE_IS_BOTH_INT(left, right)) { - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(left) == JS_VALUE_GET_INT(right)); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewBool(ctx, a == b); - } else if (JS_IsText(left) && JS_IsText(right)) { - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, left, right, TRUE) == 0); - } else if (JS_IsNull(left) && JS_IsNull(right)) { - frame->slots[dest] = JS_TRUE; - } else if (JS_VALUE_GET_TAG(left) == JS_TAG_BOOL && JS_VALUE_GET_TAG(right) == JS_TAG_BOOL) { - frame->slots[dest] = JS_NewBool(ctx, left == right); - } else { - frame->slots[dest] = JS_FALSE; - } - } - else if (strcmp(op, "ne") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (left == right) { - frame->slots[dest] = JS_FALSE; - } else if (JS_VALUE_IS_BOTH_INT(left, right)) { - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(left) != JS_VALUE_GET_INT(right)); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewBool(ctx, a != b); - } else if (JS_IsText(left) && JS_IsText(right)) { - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, left, right, TRUE) != 0); - } else if (JS_IsNull(left) && JS_IsNull(right)) { - frame->slots[dest] = JS_FALSE; - } else if (JS_VALUE_GET_TAG(left) == JS_TAG_BOOL && JS_VALUE_GET_TAG(right) == JS_TAG_BOOL) { - frame->slots[dest] = JS_NewBool(ctx, left != right); - } else { - frame->slots[dest] = JS_TRUE; - } - } - else if (strcmp(op, "eq_tol") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - cJSON *a4 = cJSON_GetArrayItem(instr, 4); - JSValue tol = frame->slots[(int)a4->valuedouble]; - if (JS_IsNumber(left) && JS_IsNumber(right) && JS_IsNumber(tol)) { - double a, b, t; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - JS_ToFloat64(ctx, &t, tol); - frame->slots[dest] = JS_NewBool(ctx, fabs(a - b) <= t); - } else if (JS_IsText(left) && JS_IsText(right) && JS_VALUE_GET_TAG(tol) == JS_TAG_BOOL && JS_VALUE_GET_BOOL(tol)) { - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value_nocase(ctx, left, right) == 0); - } else { - /* Fall through to standard eq */ - if (left == right) frame->slots[dest] = JS_TRUE; - else if (JS_IsText(left) && JS_IsText(right)) - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, left, right, TRUE) == 0); - else frame->slots[dest] = JS_FALSE; - } - } - else if (strcmp(op, "ne_tol") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - cJSON *a4 = cJSON_GetArrayItem(instr, 4); - JSValue tol = frame->slots[(int)a4->valuedouble]; - if (JS_IsNumber(left) && JS_IsNumber(right) && JS_IsNumber(tol)) { - double a, b, t; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - JS_ToFloat64(ctx, &t, tol); - frame->slots[dest] = JS_NewBool(ctx, fabs(a - b) > t); - } else if (JS_IsText(left) && JS_IsText(right) && JS_VALUE_GET_TAG(tol) == JS_TAG_BOOL && JS_VALUE_GET_BOOL(tol)) { - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value_nocase(ctx, left, right) != 0); - } else { - if (left == right) frame->slots[dest] = JS_FALSE; - else if (JS_IsText(left) && JS_IsText(right)) - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, left, right, TRUE) != 0); - else frame->slots[dest] = JS_TRUE; - } - } - else if (strcmp(op, "and") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - frame->slots[dest] = JS_ToBool(ctx, left) ? right : left; - } - else if (strcmp(op, "or") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - frame->slots[dest] = JS_ToBool(ctx, left) ? left : right; - } - else if (strcmp(op, "lt") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(left) < JS_VALUE_GET_INT(right)); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewBool(ctx, a < b); - } else if (JS_IsText(left) && JS_IsText(right)) { - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, left, right, FALSE) < 0); - } else { goto disrupt; } - } - else if (strcmp(op, "le") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(left) <= JS_VALUE_GET_INT(right)); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewBool(ctx, a <= b); - } else if (JS_IsText(left) && JS_IsText(right)) { - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, left, right, FALSE) <= 0); - } else { goto disrupt; } - } - else if (strcmp(op, "gt") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(left) > JS_VALUE_GET_INT(right)); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewBool(ctx, a > b); - } else if (JS_IsText(left) && JS_IsText(right)) { - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, left, right, FALSE) > 0); - } else { goto disrupt; } - } - else if (strcmp(op, "ge") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (JS_VALUE_IS_BOTH_INT(left, right)) { - frame->slots[dest] = JS_NewBool(ctx, JS_VALUE_GET_INT(left) >= JS_VALUE_GET_INT(right)); - } else if (JS_IsNumber(left) && JS_IsNumber(right)) { - double a, b; - JS_ToFloat64(ctx, &a, left); - JS_ToFloat64(ctx, &b, right); - frame->slots[dest] = JS_NewBool(ctx, a >= b); - } else if (JS_IsText(left) && JS_IsText(right)) { - frame->slots[dest] = JS_NewBool(ctx, js_string_compare_value(ctx, left, right, FALSE) >= 0); - } else { goto disrupt; } - } - - /* ---- in operator ---- */ - else if (strcmp(op, "in") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - int ret = JS_HasPropertyKey(ctx, right, left); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (ret < 0) { goto disrupt; } - frame->slots[dest] = JS_NewBool(ctx, ret); - } - - /* ---- Sensory (type checks) ---- */ - else if (strcmp(op, "text?") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_VALUE_IS_TEXT(frame->slots[(int)a2->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "function?") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_IsFunction(frame->slots[(int)a2->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "null?") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_IsNull(frame->slots[(int)a2->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "integer?") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_IsInt(frame->slots[(int)a2->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "array?") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_IsArray(frame->slots[(int)a2->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "record?") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_IsRecord(frame->slots[(int)a2->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "logical?") == 0) { - int dest = (int)a1->valuedouble; - int tag = JS_VALUE_GET_TAG(frame->slots[(int)a2->valuedouble]); - frame->slots[dest] = (tag == JS_TAG_BOOL) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "true?") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = (frame->slots[(int)a2->valuedouble] == JS_TRUE) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "false?") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = (frame->slots[(int)a2->valuedouble] == JS_FALSE) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "blob?") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_IsBlob(frame->slots[(int)a2->valuedouble]) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "character?") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - frame->slots[dest] = (JS_IsText(v) && js_string_value_len(v) == 1) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "data?") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - frame->slots[dest] = (JS_IsRecord(v) || JS_IsArray(v)) ? JS_TRUE : JS_FALSE; - } - else if (strcmp(op, "digit?") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (JS_IsText(v) && js_string_value_len(v) == 1) { - uint32_t c = js_string_value_get(v, 0); - frame->slots[dest] = (c >= '0' && c <= '9') ? JS_TRUE : JS_FALSE; - } else { - frame->slots[dest] = JS_FALSE; - } - } - else if (strcmp(op, "fit?") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (JS_IsInt(v)) { - frame->slots[dest] = JS_TRUE; - } else if (JS_IsNumber(v)) { - double d; - JS_ToFloat64(ctx, &d, v); - frame->slots[dest] = (d == (double)(int32_t)d) ? JS_TRUE : JS_FALSE; - } else { - frame->slots[dest] = JS_FALSE; - } - } - else if (strcmp(op, "letter?") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (JS_IsText(v) && js_string_value_len(v) == 1) { - uint32_t c = js_string_value_get(v, 0); - frame->slots[dest] = ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) ? JS_TRUE : JS_FALSE; - } else { - frame->slots[dest] = JS_FALSE; - } - } - else if (strcmp(op, "pattern?") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = JS_FALSE; /* TODO: pattern type check */ - } - else if (strcmp(op, "stone?") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (JS_IsPtr(v)) { - objhdr_t hdr = *(objhdr_t *)JS_VALUE_GET_PTR(v); - frame->slots[dest] = objhdr_s(hdr) ? JS_TRUE : JS_FALSE; - } else { - /* Primitives are immutable */ - frame->slots[dest] = JS_TRUE; - } - } - else if (strcmp(op, "upper?") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (JS_IsText(v) && js_string_value_len(v) == 1) { - uint32_t c = js_string_value_get(v, 0); - frame->slots[dest] = (c >= 'A' && c <= 'Z') ? JS_TRUE : JS_FALSE; - } else { - frame->slots[dest] = JS_FALSE; - } - } - else if (strcmp(op, "whitespace?") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - if (JS_IsText(v) && js_string_value_len(v) == 1) { - uint32_t c = js_string_value_get(v, 0); - frame->slots[dest] = (c == ' ' || c == '\t' || c == '\n' || c == '\r') ? JS_TRUE : JS_FALSE; - } else { - frame->slots[dest] = JS_FALSE; - } - } - - /* ---- Logical / Bitwise ---- */ - else if (strcmp(op, "not") == 0) { - int dest = (int)a1->valuedouble; - int b = JS_ToBool(ctx, frame->slots[(int)a2->valuedouble]); - frame->slots[dest] = JS_NewBool(ctx, !b); - } - else if (strcmp(op, "bitnot") == 0) { - int dest = (int)a1->valuedouble; - int32_t i; JS_ToInt32(ctx, &i, frame->slots[(int)a2->valuedouble]); - frame->slots[dest] = JS_NewInt32(ctx, ~i); - } - else if (strcmp(op, "bitand") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (!JS_IsNumber(left) || !JS_IsNumber(right)) { goto disrupt; } - int32_t ia, ib; - JS_ToInt32(ctx, &ia, left); - JS_ToInt32(ctx, &ib, right); - frame->slots[dest] = JS_NewInt32(ctx, ia & ib); - } - else if (strcmp(op, "bitor") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (!JS_IsNumber(left) || !JS_IsNumber(right)) { goto disrupt; } - int32_t ia, ib; - JS_ToInt32(ctx, &ia, left); - JS_ToInt32(ctx, &ib, right); - frame->slots[dest] = JS_NewInt32(ctx, ia | ib); - } - else if (strcmp(op, "bitxor") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (!JS_IsNumber(left) || !JS_IsNumber(right)) { goto disrupt; } - int32_t ia, ib; - JS_ToInt32(ctx, &ia, left); - JS_ToInt32(ctx, &ib, right); - frame->slots[dest] = JS_NewInt32(ctx, ia ^ ib); - } - else if (strcmp(op, "shl") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (!JS_IsNumber(left) || !JS_IsNumber(right)) { goto disrupt; } - int32_t ia, ib; - JS_ToInt32(ctx, &ia, left); - JS_ToInt32(ctx, &ib, right); - frame->slots[dest] = JS_NewInt32(ctx, ia << (ib & 31)); - } - else if (strcmp(op, "shr") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (!JS_IsNumber(left) || !JS_IsNumber(right)) { goto disrupt; } - int32_t ia, ib; - JS_ToInt32(ctx, &ia, left); - JS_ToInt32(ctx, &ib, right); - frame->slots[dest] = JS_NewInt32(ctx, ia >> (ib & 31)); - } - else if (strcmp(op, "ushr") == 0) { - int dest = (int)a1->valuedouble; - JSValue left = frame->slots[(int)a2->valuedouble]; - JSValue right = frame->slots[(int)a3->valuedouble]; - if (!JS_IsNumber(left) || !JS_IsNumber(right)) { goto disrupt; } - int32_t ia, ib; - JS_ToInt32(ctx, &ia, left); - JS_ToInt32(ctx, &ib, right); - frame->slots[dest] = JS_NewInt32(ctx, (uint32_t)ia >> (ib & 31)); - } - - /* ---- Control flow ---- */ - else if (strcmp(op, "jump") == 0) { - const char *label = cJSON_IsString(a1) ? a1->valuestring : NULL; - if (label) pc = mcode_resolve_label(code, label); - } - else if (strcmp(op, "jump_true") == 0) { - int slot = (int)a1->valuedouble; - const char *label = cJSON_IsString(a2) ? a2->valuestring : NULL; - if (label && JS_ToBool(ctx, frame->slots[slot])) - pc = mcode_resolve_label(code, label); - } - else if (strcmp(op, "jump_false") == 0) { - int slot = (int)a1->valuedouble; - const char *label = cJSON_IsString(a2) ? a2->valuestring : NULL; - if (label && !JS_ToBool(ctx, frame->slots[slot])) - pc = mcode_resolve_label(code, label); - } - else if (strcmp(op, "jump_null") == 0) { - int slot = (int)a1->valuedouble; - const char *label = cJSON_IsString(a2) ? a2->valuestring : NULL; - if (label && JS_IsNull(frame->slots[slot])) - pc = mcode_resolve_label(code, label); - } - else if (strcmp(op, "jump_not_null") == 0) { - int slot = (int)a1->valuedouble; - const char *label = cJSON_IsString(a2) ? a2->valuestring : NULL; - if (label && !JS_IsNull(frame->slots[slot])) - pc = mcode_resolve_label(code, label); - } - else if (strcmp(op, "jump_empty") == 0) { - int slot = (int)a1->valuedouble; - const char *label = cJSON_IsString(a2) ? a2->valuestring : NULL; - if (label && JS_IsNull(frame->slots[slot])) - pc = mcode_resolve_label(code, label); - } - else if (strcmp(op, "wary_true") == 0) { - int slot = (int)a1->valuedouble; - const char *label = cJSON_IsString(a2) ? a2->valuestring : NULL; - JSValue v = frame->slots[slot]; - if (v == JS_TRUE) { - if (label) pc = mcode_resolve_label(code, label); - } else if (v != JS_FALSE) { - goto disrupt; - } - } - else if (strcmp(op, "wary_false") == 0) { - int slot = (int)a1->valuedouble; - const char *label = cJSON_IsString(a2) ? a2->valuestring : NULL; - JSValue v = frame->slots[slot]; - if (v == JS_FALSE) { - if (label) pc = mcode_resolve_label(code, label); - } else if (v != JS_TRUE) { - goto disrupt; - } - } - - /* ---- Property/element access (unified) ---- */ - else if (strcmp(op, "load") == 0) { - int dest = (int)a1->valuedouble; - int obj_reg = (int)a2->valuedouble; - JSValue obj = frame->slots[obj_reg]; - if (JS_IsFunction(obj)) { - JSFunction *fn_chk = JS_VALUE_GET_FUNCTION(obj); - if (fn_chk->length != 2) { - JS_ThrowTypeError(ctx, "cannot read property of non-proxy function"); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - goto disrupt; - } - } - JSValue val; - if (cJSON_IsString(a3)) { - JSValue key = JS_NewString(ctx, a3->valuestring); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - obj = frame->slots[obj_reg]; - val = JS_GetProperty(ctx, obj, key); - } else { - JSValue idx = frame->slots[(int)a3->valuedouble]; - if (JS_IsInt(idx)) - val = JS_GetPropertyUint32(ctx, obj, JS_VALUE_GET_INT(idx)); - else - val = JS_GetProperty(ctx, obj, idx); - } - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (JS_IsException(val)) goto disrupt; - frame->slots[dest] = val; - } - else if (strcmp(op, "store") == 0) { - int obj_reg = (int)a1->valuedouble; - int val_reg = (int)a2->valuedouble; - JSValue obj = frame->slots[obj_reg]; - JSValue val = frame->slots[val_reg]; - if (JS_IsFunction(obj)) { - JS_ThrowTypeError(ctx, "cannot set property of function"); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - goto disrupt; - } - if (cJSON_IsString(a3)) { - JSValue key = JS_NewString(ctx, a3->valuestring); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - obj = frame->slots[obj_reg]; - val = frame->slots[val_reg]; - int ret = JS_SetProperty(ctx, obj, key, val); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (ret < 0) goto disrupt; - } else { - JSValue idx = frame->slots[(int)a3->valuedouble]; - int ret; - if (JS_IsInt(idx)) { - ret = JS_SetPropertyUint32(ctx, obj, JS_VALUE_GET_INT(idx), val); - } else if (JS_IsArray(obj)) { - JS_ThrowTypeError(ctx, "array index must be a number"); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - goto disrupt; - } else if (JS_IsRecord(obj) && !JS_IsText(idx) && !JS_IsRecord(idx)) { - JS_ThrowTypeError(ctx, "object key must be a string or object"); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - goto disrupt; - } else { - ret = JS_SetProperty(ctx, obj, idx, val); - } - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (ret < 0) goto disrupt; - } - } - else if (strcmp(op, "delete") == 0) { - int dest = (int)a1->valuedouble; - int obj_reg = (int)a2->valuedouble; - JSValue obj = frame->slots[obj_reg]; - JSValue key; - if (cJSON_IsString(a3)) { - key = JS_NewString(ctx, a3->valuestring); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - obj = frame->slots[obj_reg]; - } else { - key = frame->slots[(int)a3->valuedouble]; - } - int ret = JS_DeleteProperty(ctx, obj, key); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (ret < 0) goto disrupt; - frame->slots[dest] = JS_NewBool(ctx, ret >= 0); - } - - /* ---- Closure access ---- */ - else if (strcmp(op, "get") == 0) { - int dest = (int)a1->valuedouble; - int slot = (int)a2->valuedouble; - int depth = (int)a3->valuedouble; - /* Walk outer_frame chain from the current function's outer_frame */ - JSFunction *cur_fn = JS_VALUE_GET_FUNCTION(frame->function); - JSValue of = (cur_fn && cur_fn->kind == JS_FUNC_KIND_MCODE) ? cur_fn->u.mcode.outer_frame : JS_NULL; - for (int d = 1; d < depth && !JS_IsNull(of); d++) { - JSFrameRegister *outer = (JSFrameRegister *)JS_VALUE_GET_PTR(of); - JSFunction *outer_fn = JS_VALUE_GET_FUNCTION(outer->function); - of = (outer_fn && outer_fn->kind == JS_FUNC_KIND_MCODE) ? outer_fn->u.mcode.outer_frame : JS_NULL; - } - if (!JS_IsNull(of)) { - JSFrameRegister *target = (JSFrameRegister *)JS_VALUE_GET_PTR(of); - frame->slots[dest] = target->slots[slot]; - } else { - frame->slots[dest] = JS_NULL; - } - } - else if (strcmp(op, "put") == 0) { - int src = (int)a1->valuedouble; - int slot = (int)a2->valuedouble; - int depth = (int)a3->valuedouble; - JSFunction *cur_fn = JS_VALUE_GET_FUNCTION(frame->function); - JSValue of = (cur_fn && cur_fn->kind == JS_FUNC_KIND_MCODE) ? cur_fn->u.mcode.outer_frame : JS_NULL; - for (int d = 1; d < depth && !JS_IsNull(of); d++) { - JSFrameRegister *outer = (JSFrameRegister *)JS_VALUE_GET_PTR(of); - JSFunction *outer_fn = JS_VALUE_GET_FUNCTION(outer->function); - of = (outer_fn && outer_fn->kind == JS_FUNC_KIND_MCODE) ? outer_fn->u.mcode.outer_frame : JS_NULL; - } - if (!JS_IsNull(of)) { - JSFrameRegister *target = (JSFrameRegister *)JS_VALUE_GET_PTR(of); - target->slots[slot] = frame->slots[src]; - } - } - - - - /* ---- Function calls ---- */ - else if (strcmp(op, "frame") == 0) { - int frame_reg = (int)a1->valuedouble; - JSValue func_val = frame->slots[(int)a2->valuedouble]; - int call_argc = a3 ? (int)a3->valuedouble : 0; - - if (!JS_IsFunction(func_val)) { - goto disrupt; - } - - JSFunction *fn = JS_VALUE_GET_FUNCTION(func_val); - int nr_slots; - if (fn->kind == JS_FUNC_KIND_MCODE) { - nr_slots = fn->u.mcode.code->nr_slots; - } else { - nr_slots = call_argc + 2; - } - JSFrameRegister *new_frame = alloc_frame_register(ctx, nr_slots); - if (!new_frame) { goto disrupt; } - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - func_val = frame->slots[(int)a2->valuedouble]; - new_frame->function = func_val; - frame->slots[frame_reg] = JS_MKPTR(new_frame); - } - else if (strcmp(op, "setarg") == 0) { - int frame_reg = (int)a1->valuedouble; - int arg_idx = (int)a2->valuedouble; - int val_reg = (int)a3->valuedouble; - JSValue target = frame->slots[frame_reg]; - if (!JS_IsFunction(target)) { - JSFrameRegister *call_frame = (JSFrameRegister *)JS_VALUE_GET_PTR(target); - call_frame->slots[arg_idx] = frame->slots[val_reg]; - } - } - else if (strcmp(op, "invoke") == 0) { - int frame_reg = (int)a1->valuedouble; - int ret_reg = (int)a2->valuedouble; - JSValue target = frame->slots[frame_reg]; - - JSFrameRegister *new_frame = (JSFrameRegister *)JS_VALUE_GET_PTR(target); - JSFunction *fn = JS_VALUE_GET_FUNCTION(new_frame->function); - - if (fn->kind == JS_FUNC_KIND_MCODE) { - /* Store return address: pc << 16 | ret_slot */ - frame->address = JS_NewInt32(ctx, (pc << 16) | ret_reg); - new_frame->caller = JS_MKPTR(frame); - /* Switch to new frame */ - frame = new_frame; - frame_ref.val = JS_MKPTR(frame); - code = fn->u.mcode.code; - pc = 0; - } else { - /* C or bytecode function — collect args on value stack (GC-safe) */ - int nr_slots = (int)objhdr_cap56(new_frame->hdr); - int c_argc = (nr_slots >= 2) ? nr_slots - 2 : 0; - int vs_base = ctx->value_stack_top; - for (int i = 0; i < c_argc; i++) { - ctx->value_stack[vs_base + i] = new_frame->slots[i + 1]; - } - ctx->value_stack_top = vs_base + c_argc; - ctx->reg_current_frame = frame_ref.val; - ctx->current_register_pc = pc > 0 ? pc - 1 : 0; - JSValue c_result = JS_Call(ctx, new_frame->function, new_frame->slots[0], c_argc, &ctx->value_stack[vs_base]); - ctx->value_stack_top = vs_base; - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - ctx->reg_current_frame = JS_NULL; - if (JS_IsException(c_result)) { goto disrupt; } - frame->slots[ret_reg] = c_result; - } - } - - /* ---- Method call (handles function proxies) ---- */ - else if (strcmp(op, "callmethod") == 0) { - /* ["callmethod", dest, obj_reg, "method_name", arg0_reg, arg1_reg, ...] */ - int dest = (int)a1->valuedouble; - int obj_reg = (int)a2->valuedouble; - JSValue obj = frame->slots[obj_reg]; - const char *method_name = a3->valuestring; - /* Count arg registers (items after a3, minus trailing line/col) */ - int nargs = 0; - for (cJSON *p = a3->next; p; p = p->next) - nargs++; - nargs -= 2; /* subtract line and col metadata */ - if (nargs < 0) nargs = 0; - - if (JS_IsFunction(obj)) { - /* Proxy call: obj(name, [args...]) */ - /* Store key on value stack immediately to protect from GC */ - int vs_base = ctx->value_stack_top; - ctx->value_stack[vs_base] = JS_NewString(ctx, method_name); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - ctx->value_stack_top = vs_base + 1; /* protect key from GC */ - JSValue arr = JS_NewArray(ctx); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (JS_IsException(arr)) goto disrupt; - frame->slots[dest] = arr; /* protect from GC */ - cJSON *p = a3->next; - for (int i = 0; i < nargs; i++, p = p->next) { - if (cJSON_IsString(p)) break; /* hit line/col */ - int areg = (int)p->valuedouble; - JS_SetPropertyUint32(ctx, frame->slots[dest], i, frame->slots[areg]); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - } - ctx->value_stack[vs_base + 1] = frame->slots[dest]; - ctx->value_stack_top = vs_base + 2; - ctx->reg_current_frame = frame_ref.val; - ctx->current_register_pc = pc > 0 ? pc - 1 : 0; - JSValue ret = JS_CallInternal(ctx, frame->slots[obj_reg], JS_NULL, 2, &ctx->value_stack[vs_base], 0); - ctx->value_stack_top = vs_base; - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - ctx->reg_current_frame = JS_NULL; - if (JS_IsException(ret)) goto disrupt; - frame->slots[dest] = ret; - } else { - /* Record method call: get property, call with this=obj */ - JSValue key = JS_NewString(ctx, method_name); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - JSValue method = JS_GetProperty(ctx, frame->slots[obj_reg], key); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (JS_IsException(method)) goto disrupt; - if (!JS_IsFunction(method)) { - frame->slots[dest] = JS_NULL; - } else { - JSFunction *fn = JS_VALUE_GET_FUNCTION(method); - if (fn->kind == JS_FUNC_KIND_MCODE) { - /* mcode function — set up frame and jump */ - frame->slots[dest] = method; /* protect from GC */ - JSFrameRegister *new_frame = alloc_frame_register(ctx, fn->u.mcode.code->nr_slots); - if (!new_frame) { - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - goto disrupt; - } - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - method = frame->slots[dest]; /* re-read after GC */ - fn = JS_VALUE_GET_FUNCTION(method); - new_frame->function = method; - new_frame->slots[0] = frame->slots[obj_reg]; /* this */ - cJSON *p = a3->next; - for (int i = 0; i < nargs && i < fn->u.mcode.code->nr_slots - 1; i++, p = p->next) { - if (cJSON_IsString(p)) break; - new_frame->slots[1 + i] = frame->slots[(int)p->valuedouble]; - } - frame->address = JS_NewInt32(ctx, (pc << 16) | dest); - new_frame->caller = JS_MKPTR(frame); - frame = new_frame; - frame_ref.val = JS_MKPTR(frame); - code = fn->u.mcode.code; - pc = 0; - } else { - /* C or bytecode function */ - int vs_base = ctx->value_stack_top; - cJSON *p = a3->next; - for (int i = 0; i < nargs; i++, p = p->next) { - if (cJSON_IsString(p)) break; - ctx->value_stack[vs_base + i] = frame->slots[(int)p->valuedouble]; - } - ctx->value_stack_top = vs_base + nargs; - ctx->reg_current_frame = frame_ref.val; - ctx->current_register_pc = pc > 0 ? pc - 1 : 0; - JSValue ret = JS_Call(ctx, method, frame->slots[obj_reg], nargs, &ctx->value_stack[vs_base]); - ctx->value_stack_top = vs_base; - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - ctx->reg_current_frame = JS_NULL; - if (JS_IsException(ret)) goto disrupt; - frame->slots[dest] = ret; - } - } - } - } - - else if (strcmp(op, "callmethod_dyn") == 0) { - /* ["callmethod_dyn", dest, obj_reg, key_reg, arg0_reg, ...] */ - int dest = (int)a1->valuedouble; - int obj_reg = (int)a2->valuedouble; - int key_reg = (int)a3->valuedouble; - JSValue obj = frame->slots[obj_reg]; - JSValue key = frame->slots[key_reg]; - /* Count arg registers (items after a3, minus trailing line/col) */ - int nargs = 0; - for (cJSON *p = a3->next; p; p = p->next) - nargs++; - nargs -= 2; - if (nargs < 0) nargs = 0; - - if (JS_IsFunction(obj) && JS_VALUE_IS_TEXT(key) && - JS_VALUE_GET_FUNCTION(obj)->length == 2) { - /* Proxy call (arity-2 functions only): obj(key, [args...]) */ - int vs_base = ctx->value_stack_top; - ctx->value_stack[vs_base] = key; /* protect key on value stack */ - ctx->value_stack_top = vs_base + 1; /* protect key from GC */ - JSValue arr = JS_NewArray(ctx); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (JS_IsException(arr)) goto disrupt; - frame->slots[dest] = arr; /* protect from GC */ - cJSON *p = a3->next; - for (int i = 0; i < nargs; i++, p = p->next) { - int areg = (int)p->valuedouble; - JS_SetPropertyUint32(ctx, frame->slots[dest], i, frame->slots[areg]); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - } - ctx->value_stack[vs_base + 1] = frame->slots[dest]; - ctx->value_stack_top = vs_base + 2; - ctx->reg_current_frame = frame_ref.val; - ctx->current_register_pc = pc > 0 ? pc - 1 : 0; - JSValue ret = JS_CallInternal(ctx, frame->slots[obj_reg], JS_NULL, 2, &ctx->value_stack[vs_base], 0); - ctx->value_stack_top = vs_base; - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - ctx->reg_current_frame = JS_NULL; - if (JS_IsException(ret)) goto disrupt; - frame->slots[dest] = ret; - } else if (JS_IsFunction(obj)) { - /* Non-proxy function: bracket access not allowed */ - JS_ThrowTypeError(ctx, "cannot use bracket notation on non-proxy function"); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - goto disrupt; - } else { - /* Record method call: get property, call with this=obj */ - JSValue method = JS_GetProperty(ctx, frame->slots[obj_reg], key); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (JS_IsException(method)) goto disrupt; - if (!JS_IsFunction(method)) { - frame->slots[dest] = JS_NULL; - } else { - JSFunction *fn = JS_VALUE_GET_FUNCTION(method); - if (fn->kind == JS_FUNC_KIND_MCODE) { - frame->slots[dest] = method; /* protect method from GC */ - JSFrameRegister *new_frame = alloc_frame_register(ctx, fn->u.mcode.code->nr_slots); - if (!new_frame) { - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - goto disrupt; - } - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - method = frame->slots[dest]; /* re-read after GC */ - fn = JS_VALUE_GET_FUNCTION(method); - new_frame->function = method; - new_frame->slots[0] = frame->slots[obj_reg]; /* this */ - cJSON *p = a3->next; - for (int i = 0; i < nargs && i < fn->u.mcode.code->nr_slots - 1; i++, p = p->next) { - new_frame->slots[1 + i] = frame->slots[(int)p->valuedouble]; - } - frame->address = JS_NewInt32(ctx, (pc << 16) | dest); - new_frame->caller = JS_MKPTR(frame); - frame = new_frame; - frame_ref.val = JS_MKPTR(frame); - code = fn->u.mcode.code; - pc = 0; - } else { - int vs_base = ctx->value_stack_top; - cJSON *p = a3->next; - for (int i = 0; i < nargs; i++, p = p->next) { - ctx->value_stack[vs_base + i] = frame->slots[(int)p->valuedouble]; - } - ctx->value_stack_top = vs_base + nargs; - ctx->reg_current_frame = frame_ref.val; - ctx->current_register_pc = pc > 0 ? pc - 1 : 0; - JSValue ret = JS_Call(ctx, method, frame->slots[obj_reg], nargs, &ctx->value_stack[vs_base]); - ctx->value_stack_top = vs_base; - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - ctx->reg_current_frame = JS_NULL; - if (JS_IsException(ret)) goto disrupt; - frame->slots[dest] = ret; - } - } - } - } - - /* ---- Tail calls ---- */ - else if (strcmp(op, "goframe") == 0) { - int frame_reg = (int)a1->valuedouble; - int func_reg = (int)a2->valuedouble; - int call_argc = a3 ? (int)a3->valuedouble : 0; - JSValue func_val = frame->slots[func_reg]; - - if (!JS_IsFunction(func_val)) { - goto disrupt; - } - JSFunction *fn = JS_VALUE_GET_FUNCTION(func_val); - int nr_slots; - if (fn->kind == JS_FUNC_KIND_MCODE) { - nr_slots = fn->u.mcode.code->nr_slots; - } else { - nr_slots = call_argc + 2; - } - JSFrameRegister *new_frame = alloc_frame_register(ctx, nr_slots); - if (!new_frame) { goto disrupt; } - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - func_val = frame->slots[func_reg]; - new_frame->function = func_val; - frame->slots[frame_reg] = JS_MKPTR(new_frame); - } - else if (strcmp(op, "goinvoke") == 0) { - int frame_reg = (int)a1->valuedouble; - JSValue target = frame->slots[frame_reg]; - - if (JS_IsFunction(target)) { - result = JS_ThrowInternalError(ctx, "C function tail call not supported in MCODE"); - goto disrupt; - } - - JSFrameRegister *new_frame = (JSFrameRegister *)JS_VALUE_GET_PTR(target); - JSFunction *fn = JS_VALUE_GET_FUNCTION(new_frame->function); - - if (fn->kind != JS_FUNC_KIND_MCODE) { - goto disrupt; - } - - /* Tail call — bypass current frame */ - new_frame->caller = frame->caller; - new_frame->address = frame->address; - frame = new_frame; - frame_ref.val = JS_MKPTR(frame); - code = fn->u.mcode.code; - pc = 0; - } - - /* ---- Return ---- */ - else if (strcmp(op, "return") == 0) { - result = frame->slots[(int)a1->valuedouble]; - - if (JS_IsNull(frame->caller)) goto done; - - JSFrameRegister *caller = (JSFrameRegister *)JS_VALUE_GET_PTR(frame->caller); - int ret_info = JS_VALUE_GET_INT(caller->address); - frame->caller = JS_NULL; - - frame = caller; - frame_ref.val = JS_MKPTR(frame); - - JSFunction *fn = JS_VALUE_GET_FUNCTION(frame->function); - code = fn->u.mcode.code; - pc = ret_info >> 16; - frame->slots[ret_info & 0xFFFF] = result; - } - else if (strcmp(op, "return_value") == 0) { - int dest = (int)a1->valuedouble; - frame->slots[dest] = result; - } - - /* ---- Apply ---- */ - else if (strcmp(op, "apply") == 0) { - int func_slot = (int)a1->valuedouble; - int arr_slot = (int)a2->valuedouble; - if (!JS_IsFunction(frame->slots[func_slot]) || !JS_IsArray(frame->slots[arr_slot])) { goto disrupt; } - JSValue len_val = JS_GetProperty(ctx, frame->slots[arr_slot], JS_KEY_length); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - int len = JS_IsNumber(len_val) ? (int)JS_VALUE_GET_INT(len_val) : 0; - if (len > 256) len = 256; - int vs_base = ctx->value_stack_top; - for (int i = 0; i < len; i++) { - ctx->value_stack[vs_base + i] = JS_GetPropertyUint32(ctx, frame->slots[arr_slot], i); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - } - ctx->value_stack_top = vs_base + len; - ctx->reg_current_frame = frame_ref.val; - ctx->current_register_pc = pc > 0 ? pc - 1 : 0; - result = JS_Call(ctx, frame->slots[func_slot], JS_NULL, len, &ctx->value_stack[vs_base]); - ctx->value_stack_top = vs_base; - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (JS_IsException(result)) { goto disrupt; } - } - - /* ---- Object/Array creation ---- */ - else if (strcmp(op, "record") == 0) { - int dest = (int)a1->valuedouble; - JSValue rec = JS_NewObject(ctx); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (JS_IsException(rec)) { goto disrupt; } - frame->slots[dest] = rec; - } - else if (strcmp(op, "array") == 0) { - int dest = (int)a1->valuedouble; - int nr_elems = a2 ? (int)a2->valuedouble : 0; - JSValue arr = JS_NewArray(ctx); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (JS_IsException(arr)) { goto disrupt; } - frame->slots[dest] = arr; - for (int i = 0; i < nr_elems; i++) { - cJSON *elem = cJSON_GetArrayItem(instr, 3 + i); - if (elem) { - int elem_slot = (int)elem->valuedouble; - JS_SetPropertyUint32(ctx, frame->slots[dest], i, frame->slots[elem_slot]); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - } - } - } - else if (strcmp(op, "function") == 0) { - int dest = (int)a1->valuedouble; - int func_id = (int)a2->valuedouble; - if ((uint32_t)func_id < code->func_count && code->functions[func_id]) { - JSValue fn_val = js_new_mcode_function(ctx, code->functions[func_id]); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - JSFunction *fn = JS_VALUE_GET_FUNCTION(fn_val); - fn->u.mcode.outer_frame = frame_ref.val; - frame->slots[dest] = fn_val; - } else { - frame->slots[dest] = JS_NULL; - } - } - - /* ---- Blob ---- */ - else if (strcmp(op, "blob") == 0) { - int dest = (int)a1->valuedouble; - int nr_bits = a2 ? (int)a2->valuedouble : 0; - blob *bd = blob_new((size_t)(nr_bits < 0 ? 0 : nr_bits)); - if (!bd) { goto disrupt; } - JSValue bv = js_new_blob(ctx, bd); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (JS_IsException(bv)) { goto disrupt; } - frame->slots[dest] = bv; - } - - /* ---- Pretext ---- */ - else if (strcmp(op, "pretext") == 0) { - int dest = (int)a1->valuedouble; - int nr_chars = a2 ? (int)a2->valuedouble : 16; - JSText *s = pretext_init(ctx, nr_chars); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (!s) { goto disrupt; } - frame->slots[dest] = JS_MKPTR(s); - } - - /* ---- Append (to pretext) ---- */ - else if (strcmp(op, "append") == 0) { - int pt_slot = (int)a1->valuedouble; - int right_slot = (int)a2->valuedouble; - if (!JS_IsText(frame->slots[pt_slot]) || !JS_IsText(frame->slots[right_slot])) { goto disrupt; } - int vs_base = ctx->value_stack_top; - ctx->value_stack[vs_base] = frame->slots[pt_slot]; - ctx->value_stack[vs_base + 1] = frame->slots[right_slot]; - ctx->value_stack_top = vs_base + 2; - JSText *s = JS_VALUE_GET_PTR(ctx->value_stack[vs_base]); - s = pretext_concat_value(ctx, s, ctx->value_stack[vs_base + 1]); - ctx->value_stack_top = vs_base; - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (!s) { goto disrupt; } - frame->slots[pt_slot] = JS_MKPTR(s); - } - - /* ---- Stone ---- */ - else if (strcmp(op, "stone") == 0) { - int dest = (int)a1->valuedouble; - JSValue v = frame->slots[(int)a2->valuedouble]; - JSValue stoned = JS_Stone(ctx, v); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - frame->slots[dest] = stoned; - } - - /* ---- Regexp literal ---- */ - else if (strcmp(op, "regexp") == 0) { - int dest = (int)a1->valuedouble; - const char *pattern = a2 ? a2->valuestring : ""; - cJSON *a3 = cJSON_GetArrayItem(instr, 3); - const char *flags_str = a3 ? a3->valuestring : ""; - if (!pattern) pattern = ""; - if (!flags_str) flags_str = ""; - int vs_base = ctx->value_stack_top; - ctx->value_stack[vs_base] = JS_NewString(ctx, pattern); /* pat_val */ - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - ctx->value_stack_top = vs_base + 1; /* protect pattern from GC */ - ctx->value_stack[vs_base + 1] = *flags_str ? JS_NewString(ctx, flags_str) : JS_NULL; /* flags_val */ - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - ctx->value_stack_top = vs_base + 2; - JSValue bc = js_compile_regexp(ctx, ctx->value_stack[vs_base], ctx->value_stack[vs_base + 1]); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - if (JS_IsException(bc)) { ctx->value_stack_top = vs_base; goto disrupt; } - JSValue re_obj = js_regexp_constructor_internal(ctx, ctx->value_stack[vs_base], bc); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - ctx->value_stack_top = vs_base; - if (JS_IsException(re_obj)) { goto disrupt; } - frame->slots[dest] = re_obj; - } - - /* ---- Push (append to array) ---- */ - else if (strcmp(op, "push") == 0) { - int arr_slot = (int)a1->valuedouble; - int val_slot = (int)a2->valuedouble; - if (!JS_IsArray(frame->slots[arr_slot])) { goto disrupt; } - JSGCRef arr_gc; - JS_PushGCRef(ctx, &arr_gc); - arr_gc.val = frame->slots[arr_slot]; - JSGCRef val_gc; - JS_PushGCRef(ctx, &val_gc); - val_gc.val = frame->slots[val_slot]; - int rc = JS_ArrayPush(ctx, &arr_gc.val, val_gc.val); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - JS_PopGCRef(ctx, &val_gc); - JS_PopGCRef(ctx, &arr_gc); - if (rc < 0) goto disrupt; - frame->slots[arr_slot] = arr_gc.val; - } - - /* ---- Pop (remove last from array) ---- */ - else if (strcmp(op, "pop") == 0) { - int dest = (int)a1->valuedouble; - JSValue arr = frame->slots[(int)a2->valuedouble]; - if (!JS_IsArray(arr)) { goto disrupt; } - JSValue popped = JS_ArrayPop(ctx, arr); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - frame->slots[dest] = popped; - } - - /* ---- Disruption ---- */ - else if (strcmp(op, "disrupt") == 0) { - goto disrupt; - } - - /* ---- Unknown opcode ---- */ - else { - result = JS_ThrowInternalError(ctx, "unknown MCODE opcode: %s", op); - goto done; - } - continue; - - disrupt: - /* Search frame chain for a disruption handler. - Use frame_pc to track each frame's execution point: - - For the faulting frame, it's the current pc. - - For unwound caller frames, read from frame->address. */ - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); /* re-chase after GC */ - { - uint32_t frame_pc = pc; - for (;;) { - JSFunction *fn = JS_VALUE_GET_FUNCTION(frame->function); - JSMCode *fn_code = fn->u.mcode.code; - /* Only enter handler if we're not already inside it */ - if (fn_code->disruption_pc > 0 && frame_pc < fn_code->disruption_pc) { - code = fn_code; - pc = fn_code->disruption_pc; - break; - } - if (JS_IsNull(frame->caller)) { - fprintf(stderr, "unhandled disruption\n"); - result = JS_Throw(ctx, JS_NULL); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - goto done; - } - /* Unwind one frame — read caller's saved pc from its address field */ - JSFrameRegister *caller = (JSFrameRegister *)JS_VALUE_GET_PTR(frame->caller); - frame->caller = JS_NULL; - frame = caller; - frame_ref.val = JS_MKPTR(frame); - frame_pc = (uint32_t)(JS_VALUE_GET_INT(frame->address) >> 16); - } - } - } - -done: - if (JS_IsException(result)) { - ctx->reg_current_frame = frame_ref.val; - ctx->current_register_pc = pc > 0 ? pc - 1 : 0; - } - JS_DeleteGCRef(ctx, &frame_ref); - return result; -} - -JSValue JS_CallMcodeTree(JSContext *ctx, cJSON *root) { - if (!root) return JS_ThrowSyntaxError(ctx, "invalid MCODE tree"); - - cJSON *main_obj = cJSON_GetObjectItemCaseSensitive(root, "main"); - if (!main_obj) { - cJSON_Delete(root); - return JS_ThrowSyntaxError(ctx, "MCODE tree missing 'main' section"); - } - - cJSON *functions = cJSON_GetObjectItemCaseSensitive(root, "functions"); - - /* Parse main code */ - JSMCode *code = jsmcode_parse(main_obj, functions); - if (!code) { - cJSON_Delete(root); - return JS_ThrowInternalError(ctx, "failed to parse MCODE"); - } - code->json_root = root; /* Keep tree alive — instrs point into it */ - - /* Execute with global_obj as this */ - JSValue result = mcode_exec(ctx, code, ctx->global_obj, 0, NULL, JS_NULL); - - /* Clear frame ref before freeing mcode — stack trace data is inside code */ - ctx->reg_current_frame = JS_NULL; - jsmcode_free(code); - return result; -} - -JSValue JS_CallMcodeTreeEnv(JSContext *ctx, cJSON *root, JSValue env) { - if (!root) return JS_ThrowSyntaxError(ctx, "invalid MCODE tree"); - - cJSON *main_obj = cJSON_GetObjectItemCaseSensitive(root, "main"); - if (!main_obj) { - cJSON_Delete(root); - return JS_ThrowSyntaxError(ctx, "MCODE tree missing 'main' section"); - } - - cJSON *functions = cJSON_GetObjectItemCaseSensitive(root, "functions"); - - /* Parse main code */ - JSMCode *code = jsmcode_parse(main_obj, functions); - if (!code) { - cJSON_Delete(root); - return JS_ThrowInternalError(ctx, "failed to parse MCODE"); - } - code->json_root = root; /* Keep tree alive — instrs point into it */ - - /* Execute with global_obj as this, passing env as outer_frame */ - JSValue result = mcode_exec(ctx, code, ctx->global_obj, 0, NULL, env); - - /* Clear frame ref before freeing mcode — stack trace data is inside code */ - ctx->reg_current_frame = JS_NULL; - jsmcode_free(code); - return result; -} - -JSValue JS_CallMcode(JSContext *ctx, const char *mcode_json) { - cJSON *root = cJSON_Parse(mcode_json); - if (!root) return JS_ThrowSyntaxError(ctx, "invalid MCODE JSON"); - return JS_CallMcodeTree(ctx, root); -} diff --git a/source/quickjs-internal.h b/source/quickjs-internal.h index 4cc3dd98..88a960a4 100644 --- a/source/quickjs-internal.h +++ b/source/quickjs-internal.h @@ -812,28 +812,6 @@ typedef struct JSCodeRegister { uint16_t disruption_pc; /* start of disruption handler (0 = none) */ } JSCodeRegister; -/* Pre-parsed MCODE for a single function (off-heap, never GC'd). - Created by jsmcode_parse from cJSON MCODE output. - Instructions remain as cJSON pointers for string-based dispatch. */ -typedef struct JSMCode { - uint16_t nr_args; - uint16_t nr_slots; - /* Pre-flattened instruction array (cJSON array items → C array for O(1) access) */ - cJSON **instrs; - uint32_t instr_count; - /* Label map: label string → instruction index */ - struct { const char *name; uint32_t index; } *labels; - uint32_t label_count; - /* Nested function definitions (indexes into top-level functions array) */ - struct JSMCode **functions; - uint32_t func_count; - /* Keep root cJSON alive (owns all the cJSON nodes instrs[] point into) */ - cJSON *json_root; - MachLineEntry *line_table; /* [instr_count], parallel to instrs[] */ - const char *name; /* function name (points into cJSON tree) */ - const char *filename; /* source filename (points into cJSON tree) */ - uint16_t disruption_pc; /* start of disruption handler (0 = none) */ -} JSMCode; /* Frame for closures - used by link-time relocation model where closures reference outer frames via (depth, slot) addressing. @@ -1306,7 +1284,6 @@ typedef enum { JS_FUNC_KIND_BYTECODE, JS_FUNC_KIND_C_DATA, JS_FUNC_KIND_REGISTER, /* register-based VM function */ - JS_FUNC_KIND_MCODE, /* MCODE JSON interpreter */ } JSFunctionKind; typedef struct JSFunction { @@ -1330,11 +1307,6 @@ typedef struct JSFunction { JSValue env_record; /* stone record, module environment */ JSValue outer_frame; /* JSFrame JSValue, for closures */ } reg; - struct { - JSMCode *code; /* pre-parsed MCODE (off-heap) */ - JSValue outer_frame; /* lexical parent frame for closures */ - JSValue env_record; /* module env or JS_NULL */ - } mcode; } u; } JSFunction; @@ -1527,8 +1499,6 @@ JSValue js_call_c_function (JSContext *ctx, JSValue func_obj, JSValue this_obj, JSValue js_call_bound_function (JSContext *ctx, JSValue func_obj, JSValue this_obj, int argc, JSValue *argv); JSValue JS_CallInternal (JSContext *ctx, JSValue func_obj, JSValue this_obj, int argc, JSValue *argv, int flags); JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code, JSValue this_obj, int argc, JSValue *argv, JSValue env, JSValue outer_frame); -JSValue mcode_exec(JSContext *ctx, JSMCode *code, JSValue this_obj, - int argc, JSValue *argv, JSValue outer_frame); int JS_DeleteProperty (JSContext *ctx, JSValue obj, JSValue prop); JSValue __attribute__ ((format (printf, 2, 3))) JS_ThrowInternalError (JSContext *ctx, const char *fmt, ...); @@ -1860,13 +1830,6 @@ typedef struct { } GetLineColCache; -/* === MachVarInfo (shared by mach.c and mcode.c) === */ -typedef struct MachVarInfo { - char *name; - int slot; - int is_const; /* 1 for def, function args; 0 for var */ - int is_closure; /* 1 if captured by a nested function */ -} MachVarInfo; /* === PPretext (parser pretext, system-malloc, used by cell_js.c parser) === */ typedef struct PPretext { @@ -2057,8 +2020,5 @@ JSFrameRegister *alloc_frame_register(JSContext *ctx, int slot_count); cJSON *mach_find_scope_record(cJSON *scopes, int function_nr); int reg_vm_check_interrupt(JSContext *ctx); -/* mcode.c exports */ -JSValue mcode_exec(JSContext *ctx, JSMCode *code, JSValue this_obj, int argc, JSValue *argv, JSValue outer_frame); - #endif /* QUICKJS_INTERNAL_H */ diff --git a/source/quickjs.h b/source/quickjs.h index 8c773150..b03993b0 100644 --- a/source/quickjs.h +++ b/source/quickjs.h @@ -1091,34 +1091,12 @@ MachCode *JS_DeserializeMachCode(const uint8_t *data, size_t size); /* Load compiled MachCode into a JSContext, materializing JSValues. */ struct JSCodeRegister *JS_LoadMachCode(JSContext *ctx, MachCode *mc, JSValue env); -/* Dump MACH bytecode to stdout. Takes AST cJSON tree. */ -void JS_DumpMachTree (JSContext *ctx, struct cJSON *ast, JSValue env); - -/* Dump MACH bytecode to stdout. Takes AST JSON string. */ -void JS_DumpMach (JSContext *ctx, const char *ast_json, JSValue env); - -/* Compile and execute MACH bytecode from AST cJSON tree. */ -JSValue JS_RunMachTree (JSContext *ctx, struct cJSON *ast, JSValue env); - -/* Compile and execute MACH bytecode from AST JSON string. */ -JSValue JS_RunMach (JSContext *ctx, const char *ast_json, JSValue env); - /* Deserialize and execute pre-compiled MACH binary bytecode. */ JSValue JS_RunMachBin(JSContext *ctx, const uint8_t *data, size_t size, JSValue env); /* Compile mcode JSON IR to MachCode binary. */ MachCode *mach_compile_mcode(struct cJSON *mcode_json); -/* Execute MCODE from cJSON tree. Takes ownership of root. */ -JSValue JS_CallMcodeTree (JSContext *ctx, struct cJSON *root); - -/* Execute MCODE from cJSON tree with hidden env. Takes ownership of root. */ -JSValue JS_CallMcodeTreeEnv (JSContext *ctx, struct cJSON *root, JSValue env); - -/* Parse and execute MCODE JSON string. - Returns result of execution, or JS_EXCEPTION on error. */ -JSValue JS_CallMcode (JSContext *ctx, const char *mcode_json); - /* Get stack trace as cJSON array of frame objects. Returns NULL if no register VM frame is active. Caller must call cJSON_Delete() on the result. */ diff --git a/source/runtime.c b/source/runtime.c index 0e026a06..637b436d 100644 --- a/source/runtime.c +++ b/source/runtime.c @@ -1139,10 +1139,6 @@ void gc_scan_object (JSContext *ctx, void *ptr, uint8_t *from_base, uint8_t *fro nested->name = gc_copy_value (ctx, nested->name, from_base, from_end, to_base, to_free, to_end); } } - } else if (fn->kind == JS_FUNC_KIND_MCODE) { - /* MCODE function - scan outer_frame and env_record */ - fn->u.mcode.outer_frame = gc_copy_value (ctx, fn->u.mcode.outer_frame, from_base, from_end, to_base, to_free, to_end); - fn->u.mcode.env_record = gc_copy_value (ctx, fn->u.mcode.env_record, from_base, from_end, to_base, to_free, to_end); } break; } @@ -4630,8 +4626,6 @@ JSValue JS_CallInternal (JSContext *ctx, JSValue func_obj, JSValue this_obj, case JS_FUNC_KIND_REGISTER: return JS_CallRegisterVM (ctx, f->u.reg.code, this_obj, argc, argv, f->u.reg.env_record, f->u.reg.outer_frame); - case JS_FUNC_KIND_MCODE: - return mcode_exec (ctx, f->u.mcode.code, this_obj, argc, argv, f->u.mcode.outer_frame); default: return JS_ThrowTypeError (ctx, "not a function"); } @@ -4653,8 +4647,6 @@ JSValue JS_Call (JSContext *ctx, JSValue func_obj, JSValue this_obj, int argc, J case JS_FUNC_KIND_REGISTER: return JS_CallRegisterVM (ctx, f->u.reg.code, this_obj, argc, argv, f->u.reg.env_record, f->u.reg.outer_frame); - case JS_FUNC_KIND_MCODE: - return mcode_exec (ctx, f->u.mcode.code, this_obj, argc, argv, f->u.mcode.outer_frame); default: return JS_ThrowTypeError (ctx, "not a function"); } @@ -10117,83 +10109,6 @@ int js_is_blob (JSContext *js, JSValue v) { * ============================================================================ */ -/* mach_eval_ast(name, ast_json, env?) - compile pre-parsed AST and run */ -static JSValue js_mach_eval_ast (JSContext *ctx, JSValue this_val, int argc, JSValue *argv) { - if (argc < 2 || !JS_IsText (argv[0]) || !JS_IsText (argv[1])) - return JS_ThrowTypeError (ctx, "mach_eval_ast requires (name, ast_json) text arguments"); - - const char *name = JS_ToCString (ctx, argv[0]); - if (!name) return JS_EXCEPTION; - - const char *json_str = JS_ToCString (ctx, argv[1]); - if (!json_str) { - JS_FreeCString (ctx, name); - return JS_EXCEPTION; - } - - cJSON *ast = cJSON_Parse (json_str); - JS_FreeCString (ctx, json_str); - - if (!ast) { - JS_FreeCString (ctx, name); - return JS_ThrowSyntaxError (ctx, "mach_eval_ast: failed to parse AST JSON"); - } - - /* Set the filename on the AST root */ - cJSON_DeleteItemFromObjectCaseSensitive (ast, "filename"); - cJSON_AddStringToObject (ast, "filename", name); - - JSValue env = (argc >= 3 && JS_IsObject (argv[2])) ? argv[2] : JS_NULL; - JSValue result = JS_RunMachTree (ctx, ast, env); - cJSON_Delete (ast); - JS_FreeCString (ctx, name); - return result; -} - -/* mach_compile_ast(name, ast_json) - compile pre-parsed AST to binary blob */ -static JSValue js_mach_compile_ast (JSContext *ctx, JSValue this_val, int argc, JSValue *argv) { - if (argc < 2 || !JS_IsText (argv[0]) || !JS_IsText (argv[1])) - return JS_ThrowTypeError (ctx, "mach_compile_ast requires (name, ast_json) text arguments"); - - const char *name = JS_ToCString (ctx, argv[0]); - if (!name) return JS_EXCEPTION; - - const char *json_str = JS_ToCString (ctx, argv[1]); - if (!json_str) { - JS_FreeCString (ctx, name); - return JS_EXCEPTION; - } - - cJSON *ast = cJSON_Parse (json_str); - JS_FreeCString (ctx, json_str); - - if (!ast) { - JS_FreeCString (ctx, name); - return JS_ThrowSyntaxError (ctx, "mach_compile_ast: failed to parse AST JSON"); - } - - cJSON_DeleteItemFromObjectCaseSensitive (ast, "filename"); - cJSON_AddStringToObject (ast, "filename", name); - - MachCode *mc = JS_CompileMachTree (ast); - cJSON_Delete (ast); - JS_FreeCString (ctx, name); - - if (!mc) - return JS_ThrowSyntaxError (ctx, "mach_compile_ast: failed to compile AST"); - - size_t blob_size; - uint8_t *buf = JS_SerializeMachCode (mc, &blob_size); - JS_FreeMachCode (mc); - - if (!buf) - return JS_ThrowInternalError (ctx, "mach_compile_ast: serialization failed"); - - JSValue result = js_new_blob_stoned_copy (ctx, buf, blob_size); - sys_free (buf); - return result; -} - /* mach_load(blob, env?) - deserialize and execute binary blob */ static JSValue js_mach_load (JSContext *ctx, JSValue this_val, int argc, JSValue *argv) { if (argc < 1) @@ -10207,6 +10122,11 @@ static JSValue js_mach_load (JSContext *ctx, JSValue this_val, int argc, JSValue if (!mc) return JS_ThrowSyntaxError (ctx, "mach_load: failed to deserialize bytecode"); + { + extern void verify_getup(MachCode *mc, const char *path); + verify_getup(mc, "MACH_LOAD"); + } + JSValue env = (argc >= 2 && JS_IsObject (argv[1])) ? argv[1] : JS_NULL; JSGCRef env_ref; @@ -10220,35 +10140,6 @@ static JSValue js_mach_load (JSContext *ctx, JSValue this_val, int argc, JSValue return result; } -/* mcode_run(name, mcode_json, env?) - run pre-compiled mcode JSON */ -static JSValue js_mcode_run (JSContext *ctx, JSValue this_val, int argc, JSValue *argv) { - if (argc < 2 || !JS_IsText (argv[0]) || !JS_IsText (argv[1])) - return JS_ThrowTypeError (ctx, "mcode_run requires (name, mcode_json) text arguments"); - - const char *name = JS_ToCString (ctx, argv[0]); - if (!name) return JS_EXCEPTION; - - const char *json_str = JS_ToCString (ctx, argv[1]); - if (!json_str) { - JS_FreeCString (ctx, name); - return JS_EXCEPTION; - } - - cJSON *mcode = cJSON_Parse (json_str); - JS_FreeCString (ctx, json_str); - - if (!mcode) { - JS_FreeCString (ctx, name); - return JS_ThrowSyntaxError (ctx, "mcode_run: failed to parse mcode JSON"); - } - - JSValue env = (argc >= 3 && JS_IsObject (argv[2])) ? argv[2] : JS_NULL; - JSValue result = JS_CallMcodeTreeEnv (ctx, mcode, env); - /* mcode tree ownership transferred to JS_CallMcodeTreeEnv — do not free */ - JS_FreeCString (ctx, name); - return result; -} - /* mach_eval_mcode(name, mcode_json, env?) - compile mcode IR and run via register VM */ static JSValue js_mach_eval_mcode (JSContext *ctx, JSValue this_val, int argc, JSValue *argv) { if (argc < 2 || !JS_IsText (argv[0]) || !JS_IsText (argv[1])) @@ -10298,6 +10189,61 @@ static JSValue js_mach_eval_mcode (JSContext *ctx, JSValue this_val, int argc, J return result; } +/* mach_compile_mcode_bin(name, mcode_json) - compile mcode IR to serialized binary blob */ +static JSValue js_mach_compile_mcode_bin (JSContext *ctx, JSValue this_val, int argc, JSValue *argv) { + if (argc < 2 || !JS_IsText (argv[0]) || !JS_IsText (argv[1])) + return JS_ThrowTypeError (ctx, "mach_compile_mcode_bin requires (name, mcode_json) text arguments"); + + const char *name = JS_ToCString (ctx, argv[0]); + if (!name) return JS_EXCEPTION; + + const char *json_str = JS_ToCString (ctx, argv[1]); + if (!json_str) { + JS_FreeCString (ctx, name); + return JS_EXCEPTION; + } + + cJSON *mcode = cJSON_Parse (json_str); + JS_FreeCString (ctx, json_str); + + if (!mcode) { + JS_FreeCString (ctx, name); + return JS_ThrowSyntaxError (ctx, "mach_compile_mcode_bin: failed to parse mcode JSON"); + } + + if (!cJSON_GetObjectItemCaseSensitive (mcode, "filename")) + cJSON_AddStringToObject (mcode, "filename", name); + + MachCode *mc = mach_compile_mcode (mcode); + cJSON_Delete (mcode); + JS_FreeCString (ctx, name); + + if (!mc) + return JS_ThrowInternalError (ctx, "mach_compile_mcode_bin: compilation failed"); + + size_t size = 0; + uint8_t *data = JS_SerializeMachCode (mc, &size); + + /* DEBUG: verify round-trip */ + { + MachCode *mc2 = JS_DeserializeMachCode (data, size); + if (mc2) { + extern void verify_getup(MachCode *mc, const char *path); + verify_getup(mc2, "ROUNDTRIP"); + JS_FreeMachCode (mc2); + } + } + + JS_FreeMachCode (mc); + + if (!data) + return JS_ThrowInternalError (ctx, "mach_compile_mcode_bin: serialization failed"); + + JSValue blob = js_new_blob_stoned_copy (ctx, data, size); + sys_free (data); + return blob; +} + /* ============================================================================ * stone() function - deep freeze with blob support * ============================================================================ @@ -11398,11 +11344,9 @@ static void JS_AddIntrinsicBaseObjects (JSContext *ctx) { } /* Core functions - using GC-safe helper */ - js_set_global_cfunc(ctx, "mach_eval_ast", js_mach_eval_ast, 3); - js_set_global_cfunc(ctx, "mcode_run", js_mcode_run, 3); - js_set_global_cfunc(ctx, "mach_compile_ast", js_mach_compile_ast, 2); js_set_global_cfunc(ctx, "mach_load", js_mach_load, 2); js_set_global_cfunc(ctx, "mach_eval_mcode", js_mach_eval_mcode, 3); + js_set_global_cfunc(ctx, "mach_compile_mcode_bin", js_mach_compile_mcode_bin, 2); js_set_global_cfunc(ctx, "stone", js_cell_stone, 1); js_set_global_cfunc(ctx, "length", js_cell_length, 1); js_set_global_cfunc(ctx, "call", js_cell_call, 3); @@ -13150,17 +13094,6 @@ cJSON *JS_GetStack(JSContext *ctx) { line = code->line_table[pc].line; col = code->line_table[pc].col; } - } else if (fn->kind == JS_FUNC_KIND_MCODE && fn->u.mcode.code) { - JSMCode *code = fn->u.mcode.code; - file = code->filename; - func_name = code->name; - if (!is_first) { - pc = (uint32_t)(JS_VALUE_GET_INT(frame->address) >> 16); - } - if (code->line_table && pc < code->instr_count) { - line = code->line_table[pc].line; - col = code->line_table[pc].col; - } } cJSON *entry = cJSON_CreateObject(); diff --git a/streamline.mach b/streamline.mach index 3ccf6a767cc0efd1a36f02d46d845d06711d5ccf..699b76cf993051e38712a5d5589a4e236997dd40 100644 GIT binary patch literal 32631 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 bi+IwsS$6O_D4KonUMyepyTH3r#()0>tXX*J literal 19226 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 Mj@jHajCeN*zhhZ_Pyhe` diff --git a/meson.build b/meson.build index fbc7f88d..f7ceed8a 100644 --- a/meson.build +++ b/meson.build @@ -46,7 +46,6 @@ src += [ # core 'miniz.c', 'runtime.c', 'mach.c', - 'mcode.c', 'libregexp.c', 'libunicode.c', 'cutils.c', 'dtoa.c' ] diff --git a/parse.cm b/parse.cm index 00bb5bf8..037d0b0f 100644 --- a/parse.cm +++ b/parse.cm @@ -65,7 +65,7 @@ var parse = function(tokens, src, filename, tokenizer) { var errors = [] var error_count = 0 - var function_nr = 1 + var fn_counter = 1 var ast_node = function(kind, token) { return { @@ -422,8 +422,8 @@ var parse = function(tokens, src, filename, tokenizer) { _control_depth = meth_old_cd _control_type = meth_old_ct _expecting_body = meth_old_eb - fn.function_nr = function_nr - function_nr = function_nr + 1 + fn.function_nr = fn_counter + fn_counter = fn_counter + 1 ast_node_end(fn) pair.right = fn } else if (is_ident && (tok.kind == "," || tok.kind == "}")) { @@ -918,8 +918,8 @@ var parse = function(tokens, src, filename, tokenizer) { _control_depth = old_cd _control_type = old_ct _expecting_body = old_eb - node.function_nr = function_nr - function_nr = function_nr + 1 + node.function_nr = fn_counter + fn_counter = fn_counter + 1 ast_node_end(node) return node } @@ -1008,8 +1008,8 @@ var parse = function(tokens, src, filename, tokenizer) { _control_depth = old_cd _control_type = old_ct _expecting_body = old_eb - node.function_nr = function_nr - function_nr = function_nr + 1 + node.function_nr = fn_counter + fn_counter = fn_counter + 1 ast_node_end(node) return node } diff --git a/parse.mach b/parse.mach index 1da26295fd5ad145bbd97c274dee561b65566c8a..8474151cc903658746e01deec15d77b3ad8d1d77 100644 GIT binary patch literal 202524 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