From d45b7c97d3f789035999ab172bf36b31ae7efff4 Mon Sep 17 00:00:00 2001 From: "yu.dongliang" <18588496441@163.com> Date: Thu, 9 Oct 2025 20:42:00 +0800 Subject: [PATCH] js: Boolean(), Date(), other js construct() written by user --- examples/js.html | 9 +- js/abc_libjs.c | 41 ++++ js/abc_libjs.so | Bin 55000 -> 56688 bytes js/core/scf_function.h | 1 + js/core/scf_node.h | 1 + js/core/scf_optimizer.c | 3 + js/core/scf_optimizer_js_array.c | 69 ++++++- js/doc.c | 103 ++++++++++ js/lib/scf_capi.c | 1 + js/native/x64/scf_x64_reg.c | 6 +- js/parse/scf_dfa_call.c | 17 +- js/parse/scf_dfa_create.c | 231 ++++++++++++++++++++++- js/parse/scf_dfa_expr.c | 49 +++-- js/parse/scf_operator_handler_semantic.c | 4 +- js/parse/scf_parse.c | 4 +- 15 files changed, 491 insertions(+), 48 deletions(-) diff --git a/examples/js.html b/examples/js.html index e6b57d1..f2d33ad 100644 --- a/examples/js.html +++ b/examples/js.html @@ -7,12 +7,15 @@

含有js的页面

diff --git a/js/abc_libjs.c b/js/abc_libjs.c index a606910..a063ccd 100644 --- a/js/abc_libjs.c +++ b/js/abc_libjs.c @@ -1,5 +1,46 @@ #include"abc_html.h" +static char* js_days[] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" +}; + +static char* js_mons[] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; + +int64_t abc_js_date() +{ + struct timespec ts; + + clock_gettime(CLOCK_REALTIME, &ts); + + return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; +} + +void abc_js_date_toString(char* s, int max, int64_t msec) +{ + struct tm tm; + + msec /= 1000; + + localtime_r(&msec, &tm); + + int t0 = msec % (24 * 3600); + int t1 = tm.tm_hour * 3600 + tm.tm_min * 60 + tm.tm_sec; + + snprintf(s, max, "%s, %s %02d %d %02d:%02d:%02d GMT+%02d00", + js_days[tm.tm_wday], + js_mons[tm.tm_mon], + tm.tm_mday, + tm.tm_year + 1900, + tm.tm_hour, + tm.tm_min, + tm.tm_sec, + (t1 - t0) / 3600); +// strftime(s, max, "%A, %Y-%m-%d %T GMT%z", &tm); +} + int abc_html_write(abc_html_t* html, const char* s) { abc_char_t* c; diff --git a/js/abc_libjs.so b/js/abc_libjs.so index 60fb561ab41edae56d980c62122a562bf3a17cdd..f025fb377efc12adefbb1e285cd18bc0b1af7a8a 100755 GIT binary patch delta 23923 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

Xlyp}uwek;OQ&Oo~>Xbi9suUO|G`46m z%gI8hyHi98t8M&X$8DbO3xaO{2KC6^(p2*xkURkIl%{8G!F)o_#*K4nX4WMTxJjL| zO5Is(&=$3POLJ0q`7TxKtu)WUUS5aARGP2iYqQ)j6vGP@eXBeGHVaBm zv1-{N@hx^ll$I#;s2m0Ur2*GR=(kI){?ecVdxVjl1*r|+hmf<(f%U5BxK)!^ z{(w{)@F-9$tD$WmM}eUHBMy*(Tm>qWrh$AlXGm!pC{UW#N?Rhjd9zrZIyoM36!2$# z3J{iK85F58<05hv^avCyb`#YrDgnzNla#Fj0oCtHISl(nAgH=ck(1%dKsNy*`TNHfmy6#g2-K*lT0E{g zghHT)LTw&bDf92C&{B^p0X_)yQs_F5YZ^{wf!4o5d!9FVXtg%Iqo zKn6lDI8cS2M=h%0VAlw6@d{%gRstpZ?qS9?s5b>uBIf(pY^?EC=n574!8A3CU*q=2dH zU6zdP3-h~_rOI4tGs}>=1N~AJ@W|`2v6iJNkSB~&NNeQsT@K#%{st0Yw*>QMo``d2 zH`{r+vzz_A+}X`(bnbL${s*HOp)@0KjRUR;!tkOIG26P?HN|~Wx30p z8CLdv7_KW%RA8wJ$MWP1PQ@!_2F|VJt_*hLW*NX*FHcoqtK19+m#3?TzT0IRBBVS+ zfd}QE`Td{rOoevH7KCNFTY*PqYdt`=;;>78kKLd=M}a-^(hPt+HS1pa47QN+d^P5v zG;mZcFI3%*%D#9AQSMXSK9K<=)AAzKa$F|CMdif`oOVS9L;Lblg<#u@SigWmCb?!J z$jZwyu0S-p$fdJ<-7=;Cd8ix@Cd(@_W^&V1IH|lcV>aqRa;266RVk4|S-LNupE*FkgmWa zVLXe?gED<{FsI`&)QuyENXqi@mr;%vQ8zxuU~>C5G2u*0czpL%WBoaf0T`bl zK~t`OCwKV}>&zI07^Xb`UM9@Kreib}fspS%#Dq*7GL5N-Dk|`Q%7l{$^4y={IrTW5 z{5^q*k5ht1!J$N_u;EEcM^tLG5F>QjgRn6ov=eqqpnI`z+GrkP+obDZZ97G=rX92g zesI$7QBS0&kbRSA3>JPeT{?iDs-MK89v6*=1ygAP(rp^e7>37}Gy)q+2F*fN%p@!% zeBJg(!eNXuFv>%>;Q*0M8_*|*BEw*xTv`FU=h3UsFrQk`wSay~;BTYa1`%jjNk=tf)6vz#8r3a+4!AZT~` z2K_7P8O&HkB@twy5Pbz1t7!((QVrb<)Ak?(hU!TpQ1+tzFko+b458JBUO-t(zd`@L z)C>>xqaCnWf4ZWSU+kJXf?w>)2;jvox(V73rl(-bI(iw_t*1-+^Lt%Q4Fd0Vy$2+8A2PH3|-gN?RbiG=St&Ntz5|4?ZHNWv^v(#O#LD!LGhe=?1OzZ>Z))TdAZEHRaCM#N1c7Z&w&8k^6rbp0R9IFs&# zG3 z=GPEETDyj}rt`~Ne}@1|XhRM62)UNpy74PqKG3hD3Y5#K56TsEDW;21 z2ytoR?K&|8>1n%4deb3#w1^S)4a|`r8cjp!u5WjN^ z42<8o1qP`*w+L?C0)ykXZh<3XuQ#Cd0e{+vnHQH!T;3V%^9IR zfHj?*2p{slIB_?K+7=WAX3!&tpe6Mh{IzH>J3~p1gIZ3;!vVx#&Rg(iFgKOE2#s$o zG~S9eJ_u=lhw2*d(pn4iTgAnTTyT~(s?eo-VeYSRv6r9-bq|<)qbDCgAapOw;<}KJ zcmcX8V9Kqj02Q$_U8xWAckgbU9p#;fmF`t48++tmz`uJamYQcGJi6CpeF1hsq4D`f zdxz)$D*~o6qxeVA?eC*rTiMSXiJe&TVX<<68ZBf`=ukOO0aH4$peyUMo<_L18vNG!{j1guthJ>B9y7@qX3?P8%?Z3R`Ihu&*i9lE5qi0 z&dxI`>l2B2cb<9{m8+Uo?-`@>>a4PDoah4 zPTiST2D5geZk@O)%d&R!JGiDWGLWJwb5fX}HWY=rmF5MNpbEB*&^UD(*JB}9=B6}p z&w25lH=OOsCotNF0K`E9Cvi!Rk?44w&E>JS(fQ*OIv-TVI7R ze!GLst)6?a+DaCDyNs%FKb%;V;NfR<#tYcWLU}!Y1l?VR;A#q8N9Oa$1NwB3LMzDf zlztjYhE|dl26{bGVQ3X)MOb8){v6g;XtmYo(U&kF zjxEVi@EVk`zk_;Rb(UF=tSxi7!IP;Tui#HLUIf?pX#DaH~Q5IBOO6r?JO9BS?v!a z`VUkOHJQ1*4@LDbw|etjUWDXbJ>0GGryMl|V1#XJ_)UaLpC^U&KP?Fj$sQEtvV zUO61$Uwwg_p9%%#u*e9YF=|jq_GthZt3XfLD-U3tn;)Ij%D-~Uc-2xTbFqU|Pf#4f z@@BZTdZGg3B>$y%^(AgjJCo#ImS>Wi)7TXG0vuI+xdKhH7I9O3r2>%_`Dq={Rq8qQ zQu!f*vbs?z z=P}g_71$$n4>+_c@T_#PB5exn71{zALE{k8zCloEpQ13HOvI5VV$16eAK3@spy8>> zFy{fNTv3yiwh@~qKOU@ctAt=Z9<0e$zkL$+IS;9(jA^PNeUeY6XI3^8!)RBaN9^4*_d> zsfU157&40b9Sq!>6?aEj6{pA2b@^bUp=|ptJyZfaWw-J+J{@| z06zn&vFBBxtGxjAP))wcddn-YQfdm*RF=m+0pL}s$W&jM)cDgLMlYB8%A}?!?P&my zT$zk+C26k%cx8XAjhfQ5F9EP;`Cu3&+=IXgs!)kNqOrxb&7cODiE0ws2^X=U61DhrQZi5H(JF$t<#gRiUzIf~Z)MhnACQwreX9>ikiC%D7JiF(I6yg5P|w zWrJeZ_SSJ19C%x?M0=LYq;ViyS-m7J69?oOl(+)zO-yDbx{H#nZgkC)$-GrWn2!90 z^SO(=Uu$*0kI5{XYKsl5jogHhz3xqa7Ong*;WaMyp%B`g21H|`)_~RId)0hgDDsF%0;*#lbp(G?Nj3~_4}f3>Q$ zA6((#_w;VJaYwEFlNHwMqho=TEhD1a0C3;L+`Inh6>YogEcZ=kx%-;MrVu~CKg;~) zbIiNdRKQpj%&qHBYtgp)y11+rUQ57p`OMQZyLPm`#M)yMVa zuNdVTT7@lzKmEpHt&gu`$9myo{&-qi#II5=sYAc^$fW)-i0~|$*(Um`KM$1cqdm=H zYOD^2CZ9$J=Aev_ED~8Zji(;4711Lz6T1Fl7;QU?jqag zip)}EupVke@qdk&79Y@qyk`e|!Dl)(;D>aJH`1B<(6(rNK;?M@4xzCO10wjVgV>03 zLUqPRlu`NFDTW~Oi`5kTr$ziZH{fJ^Krxk_9dKm<-$gUr@LvN;hs3mw6jI6A5fgjx zZ8^isVk2BQpJ~1-A3TFiu{v15HpR>O+-X#?T zGfu$fl}UkY9uu9`+8FA|Z9ZxBmL5C;%Cd&584z^mbHg*C=$~7&3i9y1-PtL4P=2hJ z8Wb&Q>w5uu{F1Lfot#cf3Kq8rJ8yCx-((i68dNE%q`}#WFW9h%1G2eiX>?^@*Z>pUISN(NEe6qOQdm5onieY3EBGna+}S$3Ib-N+rqZ zPOUJvFqP75E(A$cig3bsp<-MHIW-gOCT0lO5yu5gVxBL551j@%op8cAm3p2P1oE>S zz0#Cw*un4zTyPio^oh1ZtlG1hg84a3`#R2=HI=YGu=FF-duFrT{hf3%#2oO;kt}_k z=Q?GWf#)}kOh3PAP$f)c3Cgo&SZ&wxKJ+u<*}$FVtmv1EFVE_Y=;J3~h(T4m7&Un$ zdc`$)5&c%wb$*Ro$D7FbK@l!Kl{tL*23NHF`!LMuD#&9u- zi^*Kf;9?#ZE4bLeMU;y>xws#N`4|fOGu+Y9iGuhqC7d5|?HCuQxZp39iGLM<^0}zs zqLzyxC=y4bNSK5oX$Hd<6pmk^NajCpO1_B;gM?lF&{4nSWr`eLUipk6KR29ahLJwX zC}=YRql_H$TZ0CgSD0;v?Q=uQvJAszhKvMRlV&6hG_nR5zF9`u03&~ZQB!Fo3@}X1 zG0BkH(pl(Jl4ZzRBYC?a`x(jR1%~Wzkmiu1$-K`TU?l(DFxD83#|+zjM#8&BNB**x z4QFGc`eDxI8I5hx&sMC6uDrD{IyZ8st!-Z8wF~CY>_}XBz1FdPbutx97&^Rh*zo$s z@P!v%&^Yd*2GKUJrEzXE?mFkS&YT{7a?L~ogXT4Nm}}Q+30z$;zvJ$8t;D>V7A#&A zP1!I6ui(s^+1fI5ddIj8C8}lFjH$~y+BQC_C;j3VLOTjKUqorG(`Pl}Ru;n-%xP>} z)-tm-+R|R=JnwfwqrYySmoR@?9<2?%MWS&BbFb z9M{;RerV%_hKZvmb~J4F=?)fpdehWJjcpw>A52tA&SNE8ev>IpOyAs!mv}qYJhV(R z8ynTHo3?di{C1*|3^5@Z?Ao|&=F~;et9R9^8O|ELVeGKzJ-Z%ZdoE#yBc2#1qbGJ{ zW(;W%^_MhGs2?+KbVK9tF%ugn^r(s6)-f^TJc-Z#s%pm<9nb4_@VI(j+k#oMIv(1S zq^08bSeLay9k($(+=e4fiYX5z*eq+kI6#VX$7r#@hM=Lt>QtMK=@!Tgly0Ft7ZRs>~ zc6Dj#gHD7u>%H~SEuEEgJi4!Q#K^8Y*KTx@_@Uaao8TKUde_bL>lpp===c}i*!ga5#iP2OdDA(S;ZfnrI;f9Nt#uK(G5X#*i!dcdFH&@u zh}}I%krMTF7G_r}a+(+rKR3j>i|7*&asXPUp#ysL|N6b;e}m8e`n_a+#FK`2PB+TW*2?0w>_J?E`Mcg5O^CK1a2wO&{i+wo z`gOepToa>rz0tf?jo*n@KjzNp*modJro?iYi07-ruin%Dyfj&N{x2i{BGI00!Oth3 zOBd1kuMPd**<;shr80W-_3cy}UG_#*YWxTP;@7Rwr{Abb+l$?vKk+Mm2Jpu>D$o9= zU;MZI{L#K|R;8ZCnT$X2Yh85Nn^kG?9|w$I@#BEcyjhtV{|&+T6~8R_W`s6J>$UV~ z_k+&p?FUosyJGI%6@B7hpVYlE6u+)K+t+<4H7%Zi;@7A>+V4=MBObN*nZreghRZ67 zK69utH6DZU>yhXWhpN&{za@YCTB~*RJ3NSJQgqo{Rryoutkx+Z>$=yvSY>oP#6J3# zD>WX)-q@Xr8NClJiARdvpk>2(_i!JW&M1MHa z$MNfBu^EkMzqflke$BT4_$(U{z4qfnO=4F7xTCc^K0|KHD(s(NcVb?R(YxB8}! zKBgVHUt3=;H@&!_qPJ^nhESia85_<`xptd2+HG#QE#+#_ZPcP~cq`?qlQwFURt|k1 z-yXB!@AEx&wb)~Ikq_3b&cA!6!`W-nUmhAYXv{B7BgVaCea;;;{JHQ)_){D(@!$|u zhmvsP@BS}u{Mw3XF`8@DYt__>G(a0wdX4o8YGzubkLY(3y5@*1(KW~eg;--}Vj^;` zPvzMaOL$IvF2Nty-xaX_s{hfNZv?DrBj3~9Hm_yM1qH=7q&l}=A)UB@s7YTfPiB?nEb)w%H+ z@5Y92j+dNWEkt&-L5Od&BR>Pr`yHP3JN*0p6Rn-z^8StM2989>#&yOJ&iek?mfyJ6 z*qcK6(p_!N;~!*4S73JWOh=CX1*(6q9P1)qh_1CZ`63mE(O)d?I|q~43-+)zs?;&;pFd&P zsy*J$p^yJ$X$70VVOnQE@o-Sype*ju~D$QiB=ooeAM~qr`Z7Xre}LQs-J{53$emvwKVFMGg?tk7@yM4TKNtBXd{)WO%RD6v52y*AQAb`9l@*q6z z4CJ-Qmm{Bq{QK`g0Qp5ffPh8CWyYGXjvsHes)`fzvNf(aP_PepDwfju38B!2zvrz> zilg+Bbt}@>tldcWTOT6bZBZghJFPg6k^XFbi1fHc z$!Jlw+g@7o4|efG1=~9UM`r+m0@Y`m z)g={`JA&4z)H%hII-+<-pcgTo93Kw9{5c@3{izhKw|+`Ri-R4#IF|6I)v$9G5r4J{ zt6z15>Z~)WqnXK$MtIQzVSW8h08GuirlwIMa20kN>Uy+;y`M9zdg)Ies29Qzq)1ii z5h22zVe>>sdlpWO_1FWnR|5S|&NCgw$n$hZ8M2g_N9LpiuypK?BBP8mfs8A%h0sd_ zqj-QczNU>sv@4& zXoRKcn^d#$d~cL*DB`Z#i`<_wreRhOmz~a`LL4!=nNy)4`3CIA=;7c=g)A!o=zd;OxBR*1jIm^lA^lRK>zB z*#K)WrkmT)ZI3XfmEzdoD0ma(YQ77irE8XJFXExrhIWmseXJLrJcl)j$`+Je$6_cU zehF6trqymkNp*apvtzE%4smZNGA)cVVLpz++=Zwyt{Z}KQSJsVuf?j(VD1zyUj%b9 z3-j1zjX|&-vncNll=Do3tv_x$Lt2#vL+B5dosk?iJ0bs$9nTq6Ko=3yS>POtJ_WB} z3C^N&RsJ*$RXbyb6AkPDVXVX0QHi>^BIs-x3?p*&@LtK(s~`kduLPHcY{ew5-U^sP zn~pkTcNVJpsIqfuUm?ofe$$7*Am4|Y+`$fGZAt(Xc$r6Cre|P`yHGWm^6!wpJEWRC z@`r%{G1cOgCLG#b?3~MN%5K8}5(@ZbAGn}9nRhi92ny#Wkgai@V_wM9US9`(rWTy8 z_`Myb>zby3DbIv?xu$zB)YI%EYr(5)1`tTdto{Hq6%R3aISx^-Sqda&6T+5jw(3?c ze9Zrq7@<^8!k7VeJw?i;Bjui<&OK-=_%?~kVWFGAL4n=_<>98Pf2s)O5uTf&{|@6g z)Jdug;R{RhG-}tODpKP)#hHZ=Xp3R(mpJ(dnk*F&fiy;|}Xb@ThipF{p_?q|6&3##!Po{?L$#tJ2RC<2kI!@fg%6SD5z~kmsa^lYC zy3JUNC(3o4xVv!O3Ir=p53Wmd>K@3I-@@!YBe;?i_c*Tm4wm6Li|aUX&qCt-4-`E= zJ8WJLAn(DlvZEaW@j(aKG1mZiJp{6VhjHTGjKtLkZs)m+>o{?5=h7Mj`gcFZ#cjNZ zJzUzwrI)yLh)YMf^cj~v;?l2N`hrVdB<}CIl;o1&SX0X-7neqJDUVB2xfJ0NbL=kX z(tTX&j#65wY&1$rWphQ`>&7m7uc?48k0k+|sux_J?Z!w!C|;Mw zgyKP8hVyTo6nqZ1+M~>tS@VU@bf?hUR1|zp_dd3NuQ1#M+i_`s!XV?D67Z5y^aje# zzoYEUG0o#lts2oM$LZ&?kPG2{IW7gj0(UO_IuoOLuH5GaAzBo_Vv2h5&T>v=H+fB09s1Lnx2Tr!99JYUoG2BtlxPTS{n0*c;Dcs$T`^5 z^GEo2uM)Bmev&^X_n&AmW#3@{6GAI7i&tIaa;eVAp1L0<|+)v~D%X$j6h~|_HTwTR=KlBXDQbo1D7ev> z6E828*Vw`9@*q!B2Cmz1#_^2fNR(4;+sB*6ac_5Vs&4cf@!EahV6xpz(ljs^av)+rXb>imo{SpA6Y`jIDH2S#dJT+AVKL7ahN9k8_gv&1uj)e*@*dNbe_)6bPky7LT@7yR?st8 zaaYnHs7jg+-m7RvF`S8B&BD2#CPOMUbTjslZd8TV?z9A>deA?L@W@9wDEA`pEPB(q zSXdwW1oPHXX&PFrrB;xrr8c-;Uur>^>qq_JEB&btqRRmK9IXTCQ?w4EGjRADOfL+A z=@Va0)YCUOCJvz|(K?iF!Po}65B-Oc7p=o-PB$S&&}uAi1bK(R&nXJK8%f(Bp;2^t zFWBEH^ddscXbND(W9TcSr_#F!m1F6pgb+>iXJ~F5xiIl*V+xKqFGSWWNLxKoK3gjIB^bLgHcmxf(P+$D%HRQ zr_pn8$LaJwhRvYkXr4(gLr=5lM@%`JZp37Nq=(=S&2%n|aSr98|G6{}GM!7yU{EbI zvqFe@^l}Q@GZl6hVgW4!omTn=HgO)k04rHYeIWcrv=zSIMtuL5UQAD*`FyHE^99rs zcDsZYpk^r@%@g86+KOo|qJtQ4FK=X1cgj&~74%B)DEyBXCOjBjK5Nl~7h+ai2pp|v>ElB@~ zenHLEbZcKc%g{Ag@dlEx=WA#v)@so|G1*44!0xpaBm^A#8s+P$JIb5r53q?FXevzg zMj8UIxrrvi4mMLBYHp@6nEn9G*n7HWskZl&4K+->BCzHg`3!1Wy@QFA9< z02c3}VY0)t1{1$d30V6Z)Lr5+oz8&uyh+D{LcB%yVB)vwbV%qOdJpyQ($!Gk zdz4cF`+uKU1|QHa=>9``9XkGqZbQxg(2d~wW8vY4(&({a@O6R6*HsROrP3Dyz zLNpPIk>mrj8a)n4>U2B&#Gnme1Sb@e1M+4BAd|j_(4BMyle_351a}vuSHiO0bS+X3 z#UW@v-HxgJbS2af5YeMpn3}gizRmNV-IeFv0NW%wh6+iSgG-G*BcAtXqz3iEj2Sc% z^$yyD<(d?S>pST+)VnAfmguHiLBT^m)VZyPGGNj^T7!l8 zs17>Hp|fMy6hw3t7*$+NlQW@UYQm}o-2?Fx{R=CVq#n_!864{LAE?Nnkyv5|{R7xI@Hr-SU@q6fMC-deQz`Tuw{btj%n7~UPAobBk7+j8s zZpSJWCu`+8=473c&+X6%5wj*qmO(xuItWatj=SYc+;J?}6m(S@;gINT7?-5w(7i^d zLu)#PVT=a-1V%DwH70b3!efwt+L(jY2QX{#V5pJaS1Vr%DHHVveM!5pHjRoAigg-* zMHw_5@g#%xLgEg(7XmctEM*7%;W=p+?Z-;oG#b=A^iQymNhJ_c7Tp0IWK#|nku8$wNSLAcQKPj%OMh71P;THV!>SU_P_+Wb7qQQ9_6vu%_T2DCc`iRhs|cP;h1?=E z9vkQf3k?SQkoQR-eH?TW96$xEH=#cc!wS~h=g734yI2J0lA{UzOq-Qfn-#AJDk|rZ zwgioZmtv(#{{?+g`4II3NN6ZLOHeCBNmL2Ck}gpCKbtX7 zlN=3f@@SH3dEgtH$9;nma!*GL#7f#U{P+=^GtrVRTz6oU)%4wmk;(mj{ zOW}hUs5BhvwgBAHwQ6xQ*v{$8?!353Fc6Ja!E+N^Fq2E&lYHvD4-@25 z9KP(QM?gA2zB0&xE;snpd88N|QyP;M(Uk~YA({xChecoqL|7hjl6Mc*pq@5DE{fa> z!b0aK=a8FhdFhZ>T7*1gOH6+O{X?0Q%j1H%(-+Scp)AVTf`KuiU5zZrq(j-Hv2?oM z2PN*L(52*^3<=q!Z=@^+LVpha6#6SUTY&2HT!?gjvpGSjyJ zwn(*jFJ+e?J_&PL6Yc_U=;AL(JIY^BUN zxHxX3C6xJ}qBN>C)wqH(7s3h2Mr$bZJ{@kMDWdBs^C0Bp*YY`>ZKBL17%kEi+uKR_ z*!|hkRLFDygDTrv2iCaV$A-*O@2q63rEfxw_B>lW+jA(SX|Drl{OGB%g=tJn+k#$& zf2!yR5B^`q!)56Th?1zE3JgvjME`(Pb*g|e5cS}<8T1~c=Aa@Nu1S+2B`3`XQ5UU; z(Ywi?!1_J(0Vd0&Q(?hbbP&-kn?_=QmnPM5V7L=DoJ0H3noHM!XkL%kF(szv0}?(# z|620i2!?WJ&YCU!*HD4FJkiIa&A*8X>XDoJ)yVvtZRE*aG^HJt;PGdW-NsOI~$5v8ZjK@b9I3o-KBs@b9BMzJ7{L zTZsCXDbB-j+ln-BDxy@4{}V(C@Sm#&ern%bVECo?XNBPfoHtw!0i2uXk|Hie%j z^HB`Y(;H!B;r*0%C)6VJ-q>ry2PnU1jAh1mI^mZH*M!W=LlK~tDX%Zuf_goe3BN*l zgMecCAV#l}x|A>1M|J}`WcRGm?_v%P+dXUb+ZnxX_pH=Mw$ADA3O~l@WQL#SU5nhwI7l?3Qd+zewW)bdZmn&7A5BImDca6@mEj-i?ZnZkc#BhTh z6bGmv93EkhtJ67tgd3#_AdPAd2#*65z6qVGkLi!bb7WCHR?w`QFq7~M8?6_{Vy1dZ zY&Vwb;q|(>!f=(Nc697juHdrKlUW&4_CH*~W#^xZ5t_pbynR4a4#`7no1e=<9%gkd z4KPTXGR3yDJTd^tEB_2<2(ME8f>MA&c(npCq3s1_?F}RbQx0FIeTH&rco^M*k)gK` zSi^HDdnbb(tjO~z`x6EOa{(@=#Qlh2p&>By@HLeDD}xJC*#E=VQJ5d`LS7zpBZc`0 zX5SdHLNk)fD{x4Fa#LMeCQ3pT}=_9RNqda&3We%|{5%uXtIda>hb z_fxj6L%uXe4^t{{dN;`3yiz&LrwRn+9=LP(sB+Jkg$|j>m1HQ-$^f)?LCBJH+=1FKjua#JyFWegFDI z8q8<^g|~S>K~Zi69RnZ4orW z{!dmCY0INVZ&&L&fWJ=%#9Mny78iT0{1ZCe6 zbepa~xm*S%MP?{aEB)}k$gBWwl8tiLV1U^H-VB?}B_h(S2v0JXipU&QoGkeW961*t zjqoG+1RR;Gnr2EkrHHfy*d?1~5qvT-PmyYoe8i2+SD;OP1$9Ois4*8ycHPK%0ruP# zk`JGeg{s?X`4pZiB8ybFt7JXI5NT6jz5JvWU~yV)w43DXj4lYUEb)Q@uV#q?TjgY! zS>!@BXuBMQC!)wj3haj~0scmMmmI;=mIn?2?2|6oLnIyGuZ53x zUC_EnL@o&ohf!qd*!$9vl>ydjIljSOhC^K>Cte8sIOn5W9@%WpVP)|*CXrhL>R2O( z@FKPZ=A+J(PiF$$8dwS7H5V?1u5MExDDTqIa=QXCVZ2oWl74v!JUY5dI1%mRiJ^)uK`NZT0OkkY?M^7V32hG}%JEUI}%QE!0g)s8emB z-k^lKMrdr(+DaI#a+*0Z04vaxdju2amAg|hPj zly^nXF~5MIWM7z8bZQQJgOCrw=%UjV@XE2=GDCrw>{$;mD~E^F$fuduA9Gl*wXz3} zRMF;~uhCMcJSaLRhnZ_sYE4Jy=CIo}sn{MpFXta%c>=s9x=7Wt*F@V?ak6=Vh%Q#e zsb;f?p0A2C<;8fqi!M>1SvC{EQbnaj&c!J@dQna{1CJhZHJ+WL7w3ErK9|8V2$Eumm##v(NSZY*7yr*!;^*iV~)53Vbu9=*m6zmIkOc&^7qTJ z=X38s*|z`K{#=%m{nd5suzn9(ylNe>H@v*4pjt-kO$B0V8L_wQtx_!`_O=3*!dMBh z#LW1`JZbtC*s>XW#N?SI&k%dm>&iB7EEtn$Lu*QErS!O(vGMDaUhiFi6Oagl>r(7KSMc;mq-* zn$s))i47xOn!|A-XwGgG@$#JAARSXGh*v0em&-?RD2R7e?9?cI#H&Xbg>)eO?2L1-*eA2Z5KsK-;73NPFE2f{b$@dWCf@1wk{*k`@~Ag_dSigW$yx>pXu zUQwLyAJ>bw3_fKQ2mCD0R^`3Lh1u-AOO(GAhg_`WHSne4Fw6_`UoX!cf+11Wuu0yX z0Z{CJ4eQ;aZq$mCs%5L>ud$0u6xb&32mRtQ?-6v{uDrjvT!EckM9n^s5%I|-k%c2mw7h8x^mKeOqT6^I^*JO%RPrLfgRzW*i6 z8I%^nb0VNxV)7|Gcqf7iB&F8`C{&}_V015j{%KW=moqbxgV>+H@|gIjPog!%agrLb_-?u$v(>VZPQEkRf6y; zM@aTpAe{%(OAb_~7gS!A9PAweGBII<;0ff3-@uf8C^sjw&BNGi?D1YTUMSm7=BP2I zyb5AV=5|bTHG@3w2v7^kd$C(4{r>R~cC4q5`IM6(opdsy=B|!gv%>jlA)RAnhzN5CBUv z%qw{wj-90rJ9eg3@GNzn6g*4acJKt-uu1a8ufw3So+vj`S;kv1cSWJhk#{2cmO1n6 z=*w)Ex%2Gkdowgw=22jYGRLy4JPySx8_vHvsv7a5E(jL&Igc>e6?M z>k@)g)BAA~H+0t#%CBkBMO6oKt>zZ;-Xft@mx2M|)T?vnRGSY=@~ z=4II*yIWZ_t@<62%W*SP7FYc~kYD%!5~}5>dHz?$B2_pd?qTKkW5Tr9O0Q-M)xzprVu$6(7yE@_( z@8acdbt>{ALX~HBM5uS+p5@uf|6}rJ7)-fWjVPCogWGbS0=04*{I5JmfkydLK0vMl zlZ2sxGUdl-V@lU|6|g^}9s4Eu;}>wv9Vi>WU^E5dYq;VIl#M4~5EP8xz!mqSY-~k* zrlR6|x#AZ1nIVRuB2@f1SL}omjTeeh5iUN!72UCK8>QHyDN@Yek-GXp`GvnibB;88 zQBZL;jGjJWUD7BG2@OC6zHWn6YV#+!{eS3nf!uiFw3PZ50xRzg$-Lk?3bdPe9iI7yUtVX_!Kk7dMZ8Op_U zIm!uo9|}m)LtaEDa>5)+=_va(Iik>iIelBlUq>$oi3%EthOV>>E?h~EgVQQXVnB+* zCH#`t!&pHLeE}A`(T#{o-Dw*{+k-|yPCe-=q`l~A$gel8g_-rCTanh%o#@|}x(?&_ zy5>P<{pl%C8$gNS*nbAn>{5QQON;S~U27rCI=U0$t*4$?{Sc~X;1|2z#3~!;Opq8x z+fYB8E=4dJL0cfkMj8WlM^Xxp6{DyMTTE`gvX(rFlcI=Ke(D_yrhHk0UFNa7575LR<0#bJhjjl?5 z3AUO34SSwLSApEQ^fMf3EVQ`&!;Cr<9s?B zgD;@2nDYYid$7^a9q@pq^iVOsz_qsvzrb}2V!4>`4L4rkawA<%ZI~=gW3ZYPbPhy% z3B3O^6`^P6z0 zgCyQZ=2MEn|MZw}Y3y1NGf^w~0D%X$MBft+Zi#*;9^4ZBPdvCK26R5SB?fjrxFrUu z2e&ky+!BNFWw(k%y}BS28b6+Byw7R@E=|I$KK^==|J1Y1aiQ@`cs>VI z$bX%c528|Aha_SqgK{8Rvd^EkP$UcT6z4dm73Qf2mV(KAVkz=*7oqW!g~mIv#^)gI zLo8k6O$r}X#VuuJfr;fHQhTB zy+#KgR1+P9?N*El_Ei%Nf)iGp8XRjNxC&$SP@rJaK$CMZ%HE1nletsR>1p%xw9wJw0rWA ztK&UoUV_HD@NqNCR2inkKP#Y8z1qx+NvnZE+k&!j8+6k(Bgj$BC%zs4}9-M zP^r9_%nfjFeFds2my@jk{dEM_$`xd5SI@5ly2M6a-HTXJxynXC{dxFLdH;qs%e>Tw)%vX0NxPnlP+?I<;L24a)D5avJ`6Lg z8X5QsLxS>DSasE?0Ed&9bi=BvP6_Z;Pr1w(4lqWIsgXay469C6pr_o6-M^|S@EXR{ z%DWn1e^ujDQ=NR5CmOFPG|G8UYt;k=n&bi4Mb+s6jwX}jO71o(z|m={dTGVC*rC(3JoGAFQetDe#266*g7Xrob+tam>|np-pWUj6&Oi z#JJLf1CAqf94c~p-Oy7i&m0WxstAzs=bQ~^=R3btz`iiEFa1&l>MqT`^h*`mmwpJa z=$tY`r(nEu8kVvm)x|u<#P}XN)wSaudo0cbsVYU;E8{paq*4k5Wd#f_Rio~)WAZx$ zMRUG1g%D9~b_yGW$^=J0iRtHTE^ zruwV<$X%La%n+af3hl-Natq8WZut}(B^Axt2N4KFf5e|uOkJ#- z>Wh$6an42P=2c&Wq!KxN>RCQbN8sx;?G0Bl9yLdq&yo)4U%5*4pC zmbf+@l_g9=wFqqmimEr0vg^{?`p!xwd4fcSy1~`%K&8fEul#Txj;t4wXE|8^oV)TO zG7xa=uOuo(uV>+VHC<)quiV;*22uV751MHY%7aU(Z!aoEc})OaLo%xo`=98_4NORM z5s+#N&+z*n#-Pnh(5vVu3`({X^Fp-^N0wL26fM>KwWPM;<>g_1#cjTW`)M0KSZ=?0 zxduoD{

)2;wuD_+6NtKbJ!Osz93$|3-c03F>pi%o@J^{*C(V6V$t$2h&n-6aD_T zI%xAnFhQGDEoQU2GhMMrXx&*i+J^1v@C;#ODT7FFm>O;t88+C^)O&IW3p|Uab#T~c zE?jCY$T_twF~zC~x3-GYve%022fjn7WdceF zS;E7-X*_lQ#s4=P}kq4 zaOCsD7{dksHQ>t50ZHoe+kj8P{A|Z?6b2~$pIF7?og<=D^4o|Ty7RLl!-9?}5J=RA zHhXNDRuuVa8(1h1bqZ|@wDaniEq7V(oi6X2&K{+y80 zhjksRAhim$h-7iG5WjN&ZXNwQj2IK}n^Z+?PW0<IHq%x#V`+Y%z&qY#dpkI8=`>qENz0k||8qFHRU0_b|^s%5l^MFD&5x zCAl9lV$qD4_=#S2qPWeYdLe{~YsAh%{>2k8(XW%`tfNcvhWB>;CRHEdss%#K8kyU(fCXIZriqxouM&|` z_Q?VQuS;Q;2A*TaSl2H-Gu;g~#J4N3BvqP-lDr>@b`BDK7AGwX`F~!uD>(TxCl7J5 zhm+Shd5@F7BQd@}lJOHK8IVqf4~e6YlM+t4a?*{Hew>`bZy-7Tz{ylj`2S)Z3y_!> zB60EsmW%(9hgj0?d%5%wCwn+K$O(UONqo+vpExm~JjzDmDL|4@f+VvW!+}U#jYzVZ zI59{#C7h<+yy#ido?n(~@3-tt!-}q2=2|pk_LLdT(-ux?vmRS@Q^x%1Q(9UVwNGBX zQp*}&Kc;E)uqngGOqephNB8!(F3%yeZC>k?mN|>sEY}qiT(~m$cm#SKp_%Z`wGHtY5E< zSf$sswBK;u9Q^**4YylQ-mui#yeeu9ym4Q9=1q&W_Kml^N7gfIa;&SiyxiV=>%Cfg z;?9`fe(F7LYM*v*o@`&fZHZ>(uJ&bgZ|c^2$guYRJUGFyrajchy62&L+RuD=th8R+ zIljIBqfhDW+EX5_J-&NEhV{sEr?hA7yOjKJ2xS>;5&A>MVV8cld#l^}%kzT?zdiGO zz*o}|n79Lf;uh@>ST*}i*;Hrs+n=KC)|~w#=uzu0`vV2Pk76%jfW(i2Y1W5m{e2Ae zz+$+yo8@~UQ1JT@-mjx|o>l)sVC3)jkQp7Vzu$}&chvuWTU*mnUtryexp-gYPiN?4 z<7ZA5Sg)Y<_xt*X9j%XAbRbahUk3}=Adhug-45jIUa=)+U3j3>6=BoFKTI_zt$PoY zcB@pqvc(P#9VdOdt8PKjSa(t-ii0hBF)*?bt%%HGdyMlFpR+nfHPxM{;}ZK4@k`pj zt6yeKdoe((tldaAS{q&r6l_P&|Ly19cB?+`sq`JBMb^d_^I!_`mjb;wO8##@{Z`yj zf6}2@ZEE9hT`O@cq2IcUFL?d$xdrOtdSW(-)(uLpgd zzsb~@ueUb5p2pAN`QE5@u2*ppZz@`a{5#qH>XAW2jh64NYG0>SG}hR? zOq<$UURS5)n`*2p-x?&5?MJq(#&W$q$aQ~5_m}If)86jwT(;02Jnode.define_flag) continue; + if (strcmp(f->node.w->text->data, "P")) + continue; + printf("\n"); scf_logi("------- %s() ------\n", f->node.w->text->data); diff --git a/js/core/scf_optimizer_js_array.c b/js/core/scf_optimizer_js_array.c index e5899cf..3940541 100644 --- a/js/core/scf_optimizer_js_array.c +++ b/js/core/scf_optimizer_js_array.c @@ -40,7 +40,46 @@ static int __js_array_realloc(scf_ast_t* ast, scf_3ac_code_t** pc, scf_node_t* a return 0; } -static int _optimize_js_array_bb(scf_ast_t* ast, scf_basic_block_t* bb, scf_list_t* bb_list_head) +static int __js_ref_obj(scf_ast_t* ast, scf_3ac_code_t** pc, scf_node_t* obj) +{ + scf_3ac_code_t* c; + scf_variable_t* v; + scf_function_t* f = NULL; + scf_type_t* t = NULL; + scf_node_t* pf; + + int ret = scf_ast_find_global_function(&f, ast, "scf__auto_ref"); + if (ret < 0) + return ret; + + ret = scf_ast_find_type_type(&t, ast, SCF_FUNCTION_PTR); + if (ret < 0) + return ret; + + v = SCF_VAR_ALLOC_BY_TYPE(f->node.w, t, 1, 1, f); + if (!v) + return -ENOMEM; + v->const_literal_flag = 1; + + pf = scf_node_alloc(NULL, v->type, v); + scf_variable_free(v); + v = NULL; + if (!pf) + return -ENOMEM; + + scf_node_t* srcs[2] = {pf, obj}; + + c = scf_3ac_code_NN(SCF_OP_CALL, NULL, 0, srcs, 2); + if (!c) { + scf_node_free(pf); + return -ENOMEM; + } + + *pc = c; + return 0; +} + +static int _optimize_js_array_bb(scf_ast_t* ast, scf_function_t* f, scf_basic_block_t* bb, scf_list_t* bb_list_head) { scf_3ac_operand_t* base; scf_3ac_operand_t* index; @@ -48,6 +87,7 @@ static int _optimize_js_array_bb(scf_ast_t* ast, scf_basic_block_t* bb, scf_list scf_3ac_code_t* c2; scf_variable_t* v; scf_node_t* array; + scf_node_t* node; scf_type_t* Object = NULL; scf_list_t* l; @@ -76,11 +116,34 @@ static int _optimize_js_array_bb(scf_ast_t* ast, scf_basic_block_t* bb, scf_list if (ret < 0) return ret; - c2->basic_block = c->basic_block; + c2->basic_block = c->basic_block; + c2->basic_block->call_flag = 1; assert(scf_list_prev(&c->list) != scf_list_sentinel(&bb->code_list_head)); scf_list_add_tail(scf_list_prev(&c->list), &c2->list); + + if (f->js_flag && scf_type_is_assign_array_index(c->op->type)) { + base = c->srcs->data[3]; + node = base->node; + + while (SCF_OP_EXPR == node->type) + node = node->nodes[0]; + + v = _scf_operand_get(node); + + if (v->arg_flag) { + c2 = NULL; + ret = __js_ref_obj(ast, &c2, node); + if (ret < 0) + return ret; + + c2->basic_block = c->basic_block; + c2->basic_block->call_flag = 1; + + scf_list_add_tail(scf_list_prev(&c->list), &c2->list); + } + } } } } @@ -108,7 +171,7 @@ static int _optimize_js_array(scf_ast_t* ast, scf_function_t* f, scf_vector_t* f if (bb->jmp_flag || bb->end_flag || bb->cmp_flag) continue; - int ret = _optimize_js_array_bb(ast, bb, bb_list_head); + int ret = _optimize_js_array_bb(ast, f, bb, bb_list_head); if (ret < 0) return ret; } diff --git a/js/doc.c b/js/doc.c index c1aa9c2..79361bc 100644 --- a/js/doc.c +++ b/js/doc.c @@ -6,11 +6,16 @@ int abc_html_write (Object* html, const char* s); int abc_html_write_i(Object* html, int64_t i); int abc_html_write_d(Object* html, double d); +int64_t abc_js_date(); +void abc_js_date_toString(char* s, int max, int64_t msec); + enum { JS_Undef, JS_Number, JS_String, JS_Object, + JS_Date, + JS_Boolean, }; struct Object @@ -22,6 +27,13 @@ struct Object // p.x --> p.members[x] char* str; double d; + int64_t i64; + + int __init(Object* this) + { + this->type = JS_Object; + return 0; + } int __init(Object* this, double d) { @@ -104,6 +116,79 @@ struct Object return 0; } + Object* Boolean(Object* this) + { + Object* res = create Object(); + if (!res) + return NULL; + + res->i64 = 0; + res->type = JS_Boolean; + return res; + } + + Object* Boolean(Object* this, int64_t i) + { + Object* res = create Object(); + if (!res) + return NULL; + + res->i64 = i; + res->type = JS_Boolean; + return res; + } + + Object* Boolean(Object* this, Object* that) + { + Object* res = create Object(); + if (!res) + return NULL; + + switch (that->type) { + case JS_Number: + if (0.0 == that->d) + res->i64 = 0; + else + res->i64 = 1; + break; + + case JS_String: + if ('\0' == that->str[0]) + res->i64 = 0; + else + res->i64 = 1; + break; + + case JS_Boolean: + res->i64 = that->i64; + break; + + case JS_Object: + if (that) + res->i64 = 0; + else + res->i64 = 1; + break; + default: + res->i64 = 0; + break; + }; + + res->type = JS_Boolean; + return res; + } + + Object* Date(Object* this) + { + Object* res = create Object(0); + if (!res) + return NULL; + + res->i64 = abc_js_date(); + res->type = JS_Date; + return res; + } + const char* toString(Object* this) { char* p; @@ -115,6 +200,17 @@ struct Object type = this->type; switch (type) { + case JS_Boolean: + s = scf__auto_malloc(8); + if (!s) + return NULL; + + if (this->i64) + sprintf(s, "true"); + else + sprintf(s, "false"); + break; + case JS_Number: s = scf__auto_malloc(128); if (!s) @@ -144,6 +240,13 @@ struct Object memcpy(s, p, len + 1); break; + case JS_Date: + s = scf__auto_malloc(128); + if (!s) + return NULL; + + abc_js_date_toString(s, 127, this->i64); + break; default: p = "undefined"; len = strlen(p); diff --git a/js/lib/scf_capi.c b/js/lib/scf_capi.c index 759b34d..101a0c7 100644 --- a/js/lib/scf_capi.c +++ b/js/lib/scf_capi.c @@ -1,6 +1,7 @@ int printf(const char* fmt, ...); int snprintf(char* buf, uintptr_t size, const char* fmt, ...); +int sprintf (char* buf, const char* fmt, ...); int rand(); void srand(uint32_t seed); diff --git a/js/native/x64/scf_x64_reg.c b/js/native/x64/scf_x64_reg.c index b21cb3a..ae6033b 100644 --- a/js/native/x64/scf_x64_reg.c +++ b/js/native/x64/scf_x64_reg.c @@ -251,9 +251,9 @@ int x64_caller_save_regs(scf_3ac_code_t* c, const char* regs[], int nb_regs, int scf_variable_t* v = dn->var; if (v && v->w) - scf_logw("dn: %#lx, v_%d/%s/%#lx\n", 0xffff & (uintptr_t)dn, v->w->line, v->w->text->data, 0xffff & (uintptr_t)v); + scf_logd("dn: %#lx, v_%d/%s/%#lx\n", 0xffff & (uintptr_t)dn, v->w->line, v->w->text->data, 0xffff & (uintptr_t)v); else - scf_logw("dn: %#lx, v_%#lx\n", 0xffff & (uintptr_t)dn, 0xffff & (uintptr_t)v); + scf_logd("dn: %#lx, v_%#lx\n", 0xffff & (uintptr_t)dn, 0xffff & (uintptr_t)v); break; } } @@ -742,7 +742,7 @@ scf_register_t* x64_select_overflowed_reg(scf_dag_node_t* dn, scf_3ac_code_t* c) int i; int j; - scf_logi("bytes: %d\n", bytes); + scf_logd("bytes: %d\n", bytes); assert(c->rcg); diff --git a/js/parse/scf_dfa_call.c b/js/parse/scf_dfa_call.c index d90ac76..15e433a 100644 --- a/js/parse/scf_dfa_call.c +++ b/js/parse/scf_dfa_call.c @@ -58,17 +58,24 @@ static int _call_action_lp(scf_dfa_t* dfa, scf_vector_t* words, void* data) if (scf_ast_find_type_type(&pt, ast, SCF_FUNCTION_PTR) < 0) return SCF_DFA_ERROR; + int ret = scf_ast_find_type(&Object, ast, "Object"); + if (ret < 0) + return SCF_DFA_ERROR; + assert(pt); assert(op); dfa_identity_t* id = scf_stack_top(d->current_identities); if (id && id->identity) { - scf_logi("ast->current_block: %p, js_type: %d\n", ast->current_block, ast->current_block->node.type); - int ret = scf_ast_find_function(&f, ast, id->identity->text->data); + scf_logd("ast->current_block: %p, js_type: %d\n", ast->current_block, ast->current_block->node.type); + ret = scf_ast_find_function(&f, ast, id->identity->text->data); if (ret < 0) return SCF_DFA_ERROR; + if (!f) + f = scf_scope_find_function(Object->scope, id->identity->text->data); + if (f) { scf_logd("f: %p, %s\n", f, f->node.w->text->data); @@ -101,10 +108,6 @@ static int _call_action_lp(scf_dfa_t* dfa, scf_vector_t* words, void* data) return SCF_DFA_ERROR; } } else { - ret = scf_ast_find_type(&Object, ast, "Object"); - if (ret < 0) - return SCF_DFA_ERROR; - if (Object->type != var_pf->type) { scf_loge("invalid function ptr\n"); return SCF_DFA_ERROR; @@ -294,7 +297,7 @@ static int _call_add_arguments(scf_ast_t* ast, scf_lex_word_t* w, int n_members, return 0; } -static int _call_add_obj(scf_ast_t* ast, scf_lex_word_t* w, scf_node_t* call, scf_expr_t* e, scf_type_t* Object) +int _call_add_obj(scf_ast_t* ast, scf_lex_word_t* w, scf_node_t* call, scf_expr_t* e, scf_type_t* Object) { scf_variable_t* v = NULL; scf_expr_t* e2; diff --git a/js/parse/scf_dfa_create.c b/js/parse/scf_dfa_create.c index 6496de4..1e689c1 100644 --- a/js/parse/scf_dfa_create.c +++ b/js/parse/scf_dfa_create.c @@ -16,6 +16,8 @@ typedef struct { } create_module_data_t; +int _call_add_obj(scf_ast_t* ast, scf_lex_word_t* w, scf_node_t* call, scf_expr_t* e, scf_type_t* Object); + static int _create_is_create(scf_dfa_t* dfa, void* word) { scf_lex_word_t* w = word; @@ -23,6 +25,170 @@ static int _create_is_create(scf_dfa_t* dfa, void* word) return SCF_LEX_WORD_KEY_CREATE == w->type; } +static int __js_init_func(scf_ast_t* ast, scf_function_t* f) +{ + scf_variable_t* this = scf_scope_find_variable(f->scope, "this"); + scf_variable_t* that = NULL; + scf_variable_t* pf = NULL; + scf_type_t* Object = NULL; + scf_type_t* pt = NULL; + scf_node_t* node; + scf_node_t* assign; + scf_node_t* create; + scf_node_t* _return; + scf_expr_t* e; + scf_block_t* b; + + if (scf_ast_find_type_type(&pt, ast, SCF_FUNCTION_PTR) < 0) + return SCF_DFA_ERROR; + + if (scf_ast_find_type(&Object, ast, "Object") < 0) + return SCF_DFA_ERROR; + + that = SCF_VAR_ALLOC_BY_TYPE(this->w, Object, 1, 1, NULL); + if (!that) + return -ENOMEM; + that->member_flag = 1; + that->arg_flag = 1; + this->arg_flag = 0; + + memcpy(that->w->text->data, "that", 4); + f->argv->data[0] = that; + scf_scope_push_var(f->scope, that); + + // this = create Object() + // add 'this' + node = scf_node_alloc(NULL, this->type, this); + if (!node) + return -ENOMEM; + + b = scf_block_alloc_cstr("multi_rets"); + if (!b) { + scf_node_free(node); + return -ENOMEM; + } + + int ret = scf_node_add_child((scf_node_t*)b, node); + if (ret < 0) { + scf_node_free(node); + scf_block_free(b); + return ret; + } + + // add '=' + assign = scf_node_alloc(this->w, SCF_OP_ASSIGN, NULL); + if (!assign) { + scf_block_free(b); + return -ENOMEM; + } + + ret = scf_node_add_child(assign, (scf_node_t*)b); + if (ret < 0) { + scf_node_free(assign); + scf_block_free(b); + return ret; + } + + // add 'create' + create = scf_node_alloc(this->w, SCF_OP_CREATE, NULL); + if (!create) { + scf_node_free(assign); + return -ENOMEM; + } + + ret = scf_node_add_child(assign, create); + if (ret < 0) { + scf_node_free(create); + scf_node_free(assign); + return ret; + } + + // add 'Object()' + pf = SCF_VAR_ALLOC_BY_TYPE(Object->w, pt, 1, 1, NULL); + if (!pf) { + scf_node_free(assign); + return -ENOMEM; + } + pf->const_literal_flag = 1; + + node = scf_node_alloc(NULL, pf->type, pf); + scf_variable_free(pf); + pf = NULL; + if (!node) { + scf_node_free(assign); + return -ENOMEM; + } + + ret = scf_node_add_child(create, node); + if (ret < 0) { + scf_node_free(node); + scf_node_free(assign); + return ret; + } + + e = scf_expr_alloc(); + if (!e) + return -ENOMEM; + + ret = scf_node_add_child(e, assign); + if (ret < 0) { + scf_node_free(assign); + scf_expr_free(e); + return ret; + } + + ret = scf_node_add_child((scf_node_t*)f, e); + if (ret < 0) { + scf_expr_free(e); + return ret; + } + + int i; + for (i = f->node.nb_nodes - 2; i >= 0; i--) + f->node.nodes[i + 1] = f->node.nodes[i]; + f->node.nodes[0] = e; + e = NULL; + + // return this + e = scf_expr_alloc(); + if (!e) + return -ENOMEM; + + node = scf_node_alloc(NULL, this->type, this); + if (!node) { + scf_expr_free(e); + return -ENOMEM; + } + + ret = scf_node_add_child(e, node); + if (ret < 0) { + scf_node_free(node); + scf_expr_free(e); + return ret; + } + + _return = scf_node_alloc(this->w, SCF_OP_RETURN, NULL); + if (!_return) { + scf_expr_free(e); + return -ENOMEM; + } + + ret = scf_node_add_child(_return, e); + if (ret < 0) { + scf_expr_free(e); + scf_node_free(_return); + return ret; + } + + ret = scf_node_add_child((scf_node_t*)f, _return); + if (ret < 0) { + scf_node_free(_return); + return ret; + } + + return 0; +} + static int _create_action_lp_stat(scf_dfa_t* dfa, scf_vector_t* words, void* data) { dfa_data_t* d = data; @@ -61,6 +227,7 @@ static int _create_action_identity(scf_dfa_t* dfa, scf_vector_t* words, void* da scf_parse_t* parse = dfa->priv; dfa_data_t* d = data; scf_lex_word_t* w = words->data[words->size - 1]; + scf_function_t* f = NULL; create_module_data_t* md = d->module_datas[dfa_module_create.index]; scf_type_t* t = NULL; @@ -74,6 +241,12 @@ static int _create_action_identity(scf_dfa_t* dfa, scf_vector_t* words, void* da return SCF_DFA_ERROR; } + if (d->current_var && strcmp(t->name->data, "Object")) { + d->current_var->js_type = t->type; + scf_logw("type '%s', t->type: %d, d->current_var: %s, type: %d, js_type: %d\n", + t->name->data, t->type, d->current_var->w->text->data, d->current_var->type, d->current_var->js_type); + } + if (scf_ast_find_type_type(&pt, parse->ast, SCF_FUNCTION_PTR) < 0) return SCF_DFA_ERROR; assert(pt); @@ -82,6 +255,23 @@ static int _create_action_identity(scf_dfa_t* dfa, scf_vector_t* words, void* da SCF_CHECK_ERROR(!var, SCF_DFA_ERROR, "var '%s' alloc failed\n", w->text->data); var->const_literal_flag = 1; + if (scf_ast_find_function(&f, parse->ast, w->text->data) < 0) + return SCF_DFA_ERROR; + + if (f && f->js_flag) { + t->node.js_flag = 1; + md->create->js_flag = 1; + + if (!f->init_flag) { + if (__js_init_func(parse->ast, f) < 0) + return SCF_DFA_ERROR; + + f->init_flag = 1; + } + + var->func_ptr = f; + } + scf_node_t* node = scf_node_alloc(NULL, var->type, var); SCF_CHECK_ERROR(!node, SCF_DFA_ERROR, "node alloc failed\n"); @@ -125,10 +315,11 @@ static int _create_action_lp(scf_dfa_t* dfa, scf_vector_t* words, void* data) static int _create_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) { - scf_parse_t* parse = dfa->priv; - dfa_data_t* d = data; - scf_lex_word_t* w = words->data[words->size - 1]; - create_module_data_t* md = d->module_datas[dfa_module_create.index]; + scf_parse_t* parse = dfa->priv; + dfa_data_t* d = data; + scf_lex_word_t* w = words->data[words->size - 1]; + create_module_data_t* md = d->module_datas[dfa_module_create.index]; + scf_type_t* Object = NULL; md->nb_rps++; @@ -145,6 +336,16 @@ static int _create_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) assert(md->nb_rps == md->nb_lps); if (d->expr) { + if (md->create->js_flag) { + int ret = scf_ast_find_type(&Object, parse->ast, "Object"); + if (ret < 0) + return ret; + + ret = _call_add_obj(parse->ast, w, md->create, d->expr, Object); + if (ret < 0) + return ret; + } + int ret = scf_node_add_child(md->create, d->expr); d->expr = NULL; SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "node add child failed\n"); @@ -153,6 +354,9 @@ static int _create_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) d->expr = md->parent_expr; d->expr_local_flag--; + if (md->create->js_flag) + md->create->type = SCF_OP_CALL; + if (d->expr) { int ret = scf_expr_add_node(d->expr, md->create); SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "expr add child failed\n"); @@ -168,13 +372,24 @@ static int _create_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) static int _create_action_comma(scf_dfa_t* dfa, scf_vector_t* words, void* data) { - scf_parse_t* parse = dfa->priv; - dfa_data_t* d = data; - scf_lex_word_t* w = words->data[words->size - 1]; - create_module_data_t* md = d->module_datas[dfa_module_create.index]; + scf_parse_t* parse = dfa->priv; + dfa_data_t* d = data; + scf_lex_word_t* w = words->data[words->size - 1]; + create_module_data_t* md = d->module_datas[dfa_module_create.index]; + scf_type_t* Object = NULL; SCF_CHECK_ERROR(!d->expr, SCF_DFA_ERROR, "\n"); + if (md->create->js_flag) { + int ret = scf_ast_find_type(&Object, parse->ast, "Object"); + if (ret < 0) + return ret; + + ret = _call_add_obj(parse->ast, w, md->create, d->expr, Object); + if (ret < 0) + return ret; + } + int ret = scf_node_add_child(md->create, d->expr); d->expr = NULL; SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "node add child failed\n"); diff --git a/js/parse/scf_dfa_expr.c b/js/parse/scf_dfa_expr.c index 42bb81e..6ff8d56 100644 --- a/js/parse/scf_dfa_expr.c +++ b/js/parse/scf_dfa_expr.c @@ -89,6 +89,7 @@ int _expr_add_var(scf_parse_t* parse, dfa_data_t* d) scf_type_t* t = NULL; scf_type_t* t2 = NULL; scf_function_t* f = NULL; + scf_block_t* b = NULL; dfa_identity_t* id = scf_stack_pop(d->current_identities); scf_lex_word_t* w; @@ -126,6 +127,33 @@ int _expr_add_var(scf_parse_t* parse, dfa_data_t* d) if (scf_ast_find_type_type(&t, parse->ast, md->current_var->js_type) < 0) return SCF_DFA_ERROR; + if (!strcmp(t->name->data, "Object")) { + if (strcmp(md->current_var->w->text->data, "this") || !d->current_function) + return SCF_DFA_ERROR; + + f = d->current_function; + + b = (scf_block_t*)f->node.parent; + assert(b->node.file_flag); + + t = scf_type_alloc(f->node.w, f->node.w->text->data, SCF_STRUCT + parse->ast->nb_structs, 0); + if (!t) { + scf_loge("\n"); + return SCF_DFA_ERROR; + } + + t->scope = scf_scope_alloc(f->node.w, "class"); + + parse->ast->nb_structs++; + t->node.class_flag = 1; + scf_scope_push_type(b->scope, t); + scf_node_add_child((scf_node_t*)b, (scf_node_t*)t); + + md->current_var->js_type = t->type; + + scf_logi("md->current_var->js_type: %d, %s\n", t->type, t->name->data); + } + t2 = NULL; if (scf_ast_find_type_type(&t2, parse->ast, SCF_VAR_VAR) < 0) return SCF_DFA_ERROR; @@ -561,25 +589,6 @@ static int _expr_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) dfa_identity_t* id = scf_stack_top(d->current_identities); if (id && id->identity) { - - scf_variable_t* v = NULL; - scf_function_t* f = NULL; - - if (scf_ast_find_variable(&v, parse->ast, id->identity->text->data) < 0) - return SCF_DFA_ERROR; - - if (!v) { - scf_logw("'%s' not var\n", id->identity->text->data); - - if (scf_ast_find_function(&f, parse->ast, id->identity->text->data) < 0) - return SCF_DFA_ERROR; - - if (!f) { - scf_logw("'%s' not function\n", id->identity->text->data); - return SCF_DFA_NEXT_SYNTAX; - } - } - if (_expr_add_var(parse, d) < 0) { scf_loge("expr add var error\n"); return SCF_DFA_ERROR; @@ -810,7 +819,7 @@ int _expr_multi_rets(scf_expr_t* e) for (i = parent->nb_nodes - 2; i >= 0; i--) { ret = parent->nodes[i]; - if (ret->semi_flag) + if (ret->semi_flag || SCF_OP_EXPR != ret->type) break; if (b->node.nb_nodes >= nb_rets - 1) diff --git a/js/parse/scf_operator_handler_semantic.c b/js/parse/scf_operator_handler_semantic.c index 91aecdf..66deb83 100644 --- a/js/parse/scf_operator_handler_semantic.c +++ b/js/parse/scf_operator_handler_semantic.c @@ -3276,11 +3276,11 @@ static int _scf_op_semantic_eq(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes, scf_variable_t* v0 = _scf_operand_get(nodes[0]); \ scf_variable_t* v1 = _scf_operand_get(nodes[1]); \ \ - if (scf_variable_float(v0) || scf_variable_float(v1)) { \ + } while (0) +// if (scf_variable_float(v0) || scf_variable_float(v1)) { \ scf_loge("float type can't cmp equal\n"); \ return -EINVAL; \ } \ - } while (0) CMPEQ_CHECK_FLOAT(); diff --git a/js/parse/scf_parse.c b/js/parse/scf_parse.c index 436312d..948e649 100644 --- a/js/parse/scf_parse.c +++ b/js/parse/scf_parse.c @@ -1121,7 +1121,7 @@ static int _debug_add_subprogram(scf_dwarf_info_entry_t** pie, scf_parse_t* pars scf_variable_t* v = f->rets->data[0]; scf_type_t* t = NULL; - scf_logi("v: %p, f->rets->size: %d\n", v, f->rets->size); + scf_logd("v: %p, f->rets->size: %d\n", v, f->rets->size); ret = scf_ast_find_type_type(&t, parse->ast, v->type); if (ret < 0) @@ -1902,7 +1902,7 @@ int scf_parse_compile_functions(scf_parse_t* parse, scf_vector_t* functions) } assert(scf_list_empty(&h)); - scf_basic_block_print_list(&f->basic_block_list_head); +// scf_basic_block_print_list(&f->basic_block_list_head); } int ret = scf_optimize(parse->ast, functions); -- 2.25.1