From fbca1bf49b3ec1c4b2c1b4defb5c533a00a6db0e Mon Sep 17 00:00:00 2001 From: Tacodiva <27910867+Tacodiva@users.noreply.github.com> Date: Mon, 8 Sep 2025 11:48:55 +1000 Subject: [PATCH] Fixed `NaN = 0` wrongly reporting true, and add a test --- src/compiler/jsgen.js | 4 +- test/fixtures/execute/tw-NaN.sb3 | Bin 2773 -> 2869 bytes .../__snapshots__/tw-NaN.sb3.tw-snapshot | 77 +++++++++--------- .../__snapshots__/tw-tangent.sb3.tw-snapshot | 14 ++-- .../warp-timer/tw-NaN.sb3.tw-snapshot | 77 +++++++++--------- .../warp-timer/tw-tangent.sb3.tw-snapshot | 14 ++-- 6 files changed, 96 insertions(+), 90 deletions(-) diff --git a/src/compiler/jsgen.js b/src/compiler/jsgen.js index 10e41eaa..82f6caf8 100644 --- a/src/compiler/jsgen.js +++ b/src/compiler/jsgen.js @@ -57,8 +57,8 @@ const isSafeInputForEqualsOptimization = (input, other) => { if (input.opcode !== InputOpcode.CONSTANT) return false; // Only optimize when the constant can always be thought of as a number if (input.isAlwaysType(InputType.NUMBER) || input.isAlwaysType(InputType.STRING_NUM)) { - if (other.isSometimesType(InputType.STRING_NAN) || other.isSometimesType(InputType.BOOLEAN_INTERPRETABLE)) { - // Never optimize 0 if the other input can be '' or a boolean. + if (other.isSometimesType(InputType.NUMBER_NAN | InputType.STRING_NAN | InputType.BOOLEAN_INTERPRETABLE)) { + // Never optimize 0 if the other input can be NaN, '' or a boolean. // eg. if '< 0 = "" >' was optimized it would turn into `0 === +""`, // which would be true even though Scratch would return false. return (+input.inputs.value) !== 0; diff --git a/test/fixtures/execute/tw-NaN.sb3 b/test/fixtures/execute/tw-NaN.sb3 index 17ddc26bdb14c47bb00600accae4b19495d903eb..411b0c6670dc97141a3da3f88a42f25a25e06e48 100644 GIT binary patch delta 2305 zcmV+c3I6ug6}1+BP)h>@3IG5A2mouh$WTllbhT~>002ls000aC003}uZ)#;@bS`Rh zZ*IMud2^dM7{3YIZO~l z8puB$5JEh>@9%v8+u|Bf7+8pgpnrS~a5$pSLZDBB2sMCz2VJ%dlC}nz!T>|fL9Flf zO#?VMr0Jp-5NPP|e%&GZBwf~t>mu)Viyj35TiYZdjpD&uafkVGq98q_2K9*%5MO17 zH6VpMByb^R8^Wo@nqU|rx@)j?-Ds;lwQIC`9n~~UQ){=|tuAUIy@!m|E@YiuqlYf& z6Z$rj!2?2nA;rYoWI9ps6ZG5NR<`vQ=&P%(o0A3zN#q%^cD6hv&itg*7Tdvrmnawp z1`6h9Ns;Rl&|hYYQ*0nI4xktMkOf1(1pVG^GmABi13)|w?{h)NWaJ~H+k4QnqIqt- z$Z>8O50YgU%Jv4gNNy?H2O2@Nn;9|ty$ zGWPsvJ{%Z++dfzyY^f|Jod&o7jboLa9XMeDN;kFHCN*hpv34fF#K;MSDf@tt4wcmK^xoV z(bJiYJkx=e?qGd_j5~c`1Ki6?#NO$9>TwevX2AEMRhwEk)PK1V)tQ;AUY#YAYuB9LcDX!sz1hstIiDhU*=$DHhXCiXDBl+gE4EJj8x ziP|U;0nh_Z8R5km9Ox-+nbOf0Waz}B0dY>Td9TBKr~@tN*c=YFcE`KJ0aMa$umrLs zjSe?P0USug%`AaenZ zWYF4`M=Qi4kJ6`NXxX)(g-g*o16&aqw7xt>>slPGFEVK10<^wX@26ko{PYXQPyemb zPydyH{_Ar=e=P<*t_AwDQs^guDrCEwKBg zu%832hz#t9Ij~Q}VLz0C-7oS_rxyQoI7k&Q(Bao(%Ly&jP(G2K{+0&v#2r`diLWfAI`8sMJsc8R~yO5B29_)Q7cDPfMwf09QnY`WHFWhvL+~kfELyQ2(-e z>R-xH|AIsPt16*?CByv79OmP4q)++JzSwWBkmd_4{u$#H|AA3|t>|ZrP^=(nEd?2s z79<2*5t)K~ol}sJctO6FDafdxAm3D9kZkGnm4u-c5kk0Q*k~SWutygKQRN^?Z{EC5^@_~9^6;Yh| zebU0J(sdz5ddXxlNzzd%>H0&`H;PDqmqYrxIOz?UTZMN;--c{df3E=7#j=NL$=8Z9biUJDwh&h>53KgJ%|tSg6gXpfyFYSr0{2I0D3~fU>^MqDK#n zn7YtEKp}CW_{{>Kua>;*pwsEB!S-6O13Q|z+}5;z)fVb?O|!SsGc~l`gIEQK^|-{tto~9(?4*$wvfk;si|G7DG(_$+76v-aRT<1PTBE z00;nUx5!YFMhMXaYq!WylN$-r4r{l_P)r|mwQdLi07yfV`w1)rYq!WylPd}u0hp6U b3Nr+2x5!YFeF_=@ZIhS^HwHlp00000jP_Al delta 2208 zcmV;R2w(TL7S$DhP)h>@3IG5A2mpKxh*jg$Dqju=001>W000aC003}uZ)#;@bS`Rh zZ*IL?3v-(`0RAgXz1{8MdVuZP@ou-Jd9-O0yN#Vbmt_J3CkYv1h(ZT}K8>cR0RrfMv)3RUYk(PyFf=^Gj=i~U z01wABduc=jS|(g=d&Hb%uTA3nD7f2WPNRrz?U9&HlgZWOfaU8HL3T+4niDG`p~fz2 zK?)B^W?Qyx=(?`9k&4U?vU+XE4)(1Mx~7jf zwwX>I5eg}PCcz%ViK0)Suea6w=x5N^dg|?Y1H@z+SP6FadPcnEO=&7S!GjAF4I>Lh z%e$n=4+-eMU@vFbLS!7lAPylT!(4!V=WdvBO%no00FraA>6nZ{giQAs2F`S;O)&Mm z+r|U2Z0N-g)Cwa^ktU}XP?KLIG>NrD5uylE5?!Ewt0}t(n=@EanLucOCHjO|%68x& zoGzyW!*>U#yMuj=anfo42IQ;8?hc$Yg0fvY+oh$$DjR12Y>YfB0~5Q@BJ=y(q9i;< zGvs9hx5<=SG5S-F;?P_0P^xPv2WKZ4LY*OOX8_q~2Cki4M;x2Z!3L>ILLM?Lk1PcS zFH>ZH&+|Z19>>E|b{xwuvr01I`D5_4Wb`!)^lewKZ(B~^7DwM{mHKwpu(5psy_mZw zus!IQ9yTY)y2l4*U~mV zXtew4V5L#W>QsV?t{4cj7z7F|2@E|stIW55StT`vy6Kanz{UZl3kiHXVjNku2sJAK zvGm71hE53v4+e@Z6Kl8z!z2NXhzF^7U1fd<886Y+cR}GCxkml=RE_#ftWk|x8ugnTNej*s%8yk( zq5L581bV&Y2{ePyR0|(JA^Y=9;Q14khSCPy(#VB!cQcefiHCAmCX}cklrO6f<w`uxc#7(~^V|u&5^uN~e4*rXn zvFuum<&=u&0xpQ0c>9~;HN?f+ml4k?5bvP+#yXIT<31;j&#R1ML(EoAEw=hqrqcK1 zD?P>{9}_*7L3i*}=-kpsV!#zJ7s{fOJ|#otiGR}mFx_am7&UKYghk2<>avb4q~fNT0(jU8>)*q`Dx z_NQ13FKdb6q?8s9a6#l~d9z7>%U|NOypgffq`*#Zt8e$Wa_#h06?l~-zcA8-lES^jv_^5^1~KbEn)S77;n>S)k&F=KhP7|SmeF92K+Iq^<5 z#k&v}??gsCzd*b}^?fyv>#Gw^U;SHUUtNgV%CE&%|8NK*77xcU|Cw)plNSj@{|X}- z)Ql)7jUEA9p>ok1Zbt7$JbFW!=miDQ`(8(H-iR4IsKwxRtaq&h=*;*MF?i^dDtB|6z;glQ`Os`M-RzuQVZl5;J~Oi}9hoou=Zi zD?al7P}HjVx*{$OBn4b@a)JD`C6JDIAV0|jGA;<@=jsFbSuT*DID!09Wgx%E1oAT{ zknUpwDfUlo(3Oe8m)fHM9kHT_Ybgp^8b}jxLF59dZV4n74`PDD5>Uho{54BJ#ik>x_rlsGp5W z*~gc$^|XFldlln)UJ0<mE^kei3#VwVLBHMYH9J~w^^-2H>vWrHtGoJP z5a!sT?5&{H)tcgTI5Zivq=1D0lDGIB?j}$WO+!hB8Nr z2?K@Ym`&%W^RV4)zz?y9B4rYgd3-+}r-vITnZBuP76Pt8CEgeq{(L|t7uy@AzL8VaV$9DAM;)8uz{ZLn16af`sSv1E0ufvFF} zQxp?#nykWRT9qseZ?#%GP~YjaV9T&y=!Vf#QKxO&oo>f6%;hT0`-S0U$MP12Z(A1r z_(kDbvgA9)hKC+3^K89XI#KVjNtl7M(<~ezGrjLton$kDjsuq`X7;*+F`|oPl%>;C zV3eQ$2_ByWn1wS##BLe|F*`cj_7Pov*c2mwmH-2-rrJzaOV3#M0JW(vH=vV7m?`)_ zP)h>@3IG5A2mpKxh*guO2+;(542V^edkNAGd<=+HSC42V^e iiwYV6IFqIdGX#7Lh*gu_3K{_ollTfZ2H^<+0000tjU3