From 2a46c72bb24b78a368b118e4b7f1923491d4ee46 Mon Sep 17 00:00:00 2001 From: Mike Welsh Date: Fri, 30 Apr 2021 09:47:55 -0700 Subject: [PATCH] avm1: Fix Array.splice Clamp the index parameters to the length of the array. This fixes `[].splice(1, 0, 'obj');` to add the object at the proper position (0, because the start index 1 is larger than the length). --- core/src/avm1/globals/array.rs | 13 +++++----- core/tests/swfs/avm1/array_splice/output.txt | 26 +++++++++++++++++++ core/tests/swfs/avm1/array_splice/test.fla | Bin 4778 -> 4872 bytes core/tests/swfs/avm1/array_splice/test.swf | Bin 872 -> 949 bytes 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/core/src/avm1/globals/array.rs b/core/src/avm1/globals/array.rs index 99d8e2b0f..a4ba5c9f1 100644 --- a/core/src/avm1/globals/array.rs +++ b/core/src/avm1/globals/array.rs @@ -285,14 +285,14 @@ pub fn join<'gc>( .into()) } -fn make_index_absolute(mut index: i32, length: usize) -> usize { +/// Handles an index parameter that may be positive (starting from beginning) or negaitve (starting from end). +/// The returned index will be positive and clamped from [0, length]. +fn make_index_absolute(index: i32, length: usize) -> usize { if index < 0 { - index += length as i32; - } - if index < 0 { - 0 + let offset = index as isize; + length.saturating_sub((-offset) as usize) } else { - index as usize + (index as usize).min(length) } } @@ -365,7 +365,6 @@ pub fn splice<'gc>( let to_add = if args.len() > 2 { &args[2..] } else { &[] }; let offset = to_remove as i32 - to_add.len() as i32; let new_length = old_length + to_add.len() - to_remove; - for i in start..start + to_remove { removed.set_array_element( i - start, diff --git a/core/tests/swfs/avm1/array_splice/output.txt b/core/tests/swfs/avm1/array_splice/output.txt index 071eb5e0f..b59e3fd3f 100644 --- a/core/tests/swfs/avm1/array_splice/output.txt +++ b/core/tests/swfs/avm1/array_splice/output.txt @@ -124,4 +124,30 @@ undefined // splice.length undefined +// splice = original.splice(1, 0, 'a') +// original +a + +// original.length +1 + +// splice + + +// splice.length +0 + +// splice = original.splice(-9, 0, 'c') +// original +c,a,b + +// original.length +3 + +// splice + + +// splice.length +0 + diff --git a/core/tests/swfs/avm1/array_splice/test.fla b/core/tests/swfs/avm1/array_splice/test.fla index 0f67962875905ef539a07754c7ef2347c2e50531..7f4febc18b8e4d91deb21744338743019f1d65bf 100644 GIT binary patch delta 1802 zcmV+l2le=>C5R@Fihl@WOvy?E008I}000jF002Z!O+;^Fb!}yCbS`*pZ0%T0Z`wc* zy+_J_*lrI=Bw%eriAn89Q6khxNrObxRss(GSYTV*i*}a)`SsoP+I)x@lZu`K2iwfd zdo%OKvaNCMo*wULFpY5{z≀el_RBg<~NmR|w5!v)Zg)qkn9KEWbx7{WLlgJZ8%3>G(BuPkT9D*0krO{pQ1&6?2 zfOVQI6qr`c0Du0JL?LL{vXI#OP1&*(Q&y5XzfWTyGZ&^Y37(5?fD?Ql%09@DD36sE zvUr*ZiR2x5`9SH!g+njmc+1!EMwk~l+supcO_2W2W3Eq6fciNila1#VZI;8!1qF$O z%eGa8z=RudI#}kA9d0|8R1Yd3K=21I9%(2mYh7CQ&Ma#@nVbP56R{se<1&QvsdsyK z^L*12%nR^2LRPxG~IT!DN37j)5-#25v&&BWF*FKpfk@d5?#_7 zRvXG8+gUg4g#-r|+bU7pI?8=Wxtk?&H;-~3^zN>J(i>cb97R8@=ytj2_EGdhif&dw zJ$*6DFBSQr(uXAz(D8YAp{mDW{NpezHH^9bN`G4D)9XG%kvKS4$rkGHdK}C_2V+!# zp++%N6X~rFXt3XeGy$9`cs{4WaZvx`9a7!n&0YPVukLlB_kSkIJNL{xD}M%MaUV@t zh2NA`svxEC&-RqK+S1wuWg4#qengR1Y=gnIgWj{caM1hL9gh6QQL8_W%9k=I-^%P< z@qeJ5JD!vz-7USbph9nKs8T?_<65r6(AGZ8=`fNA%(_?zl8jdUIFqR#5kCG#xS(vY zN#4=Edx2w+#dXQ6S~4|SFt@1eE;O5F%Qg(7S%+v(5__BE%VpEF4f|arb^%G)WZ0%UfZks?9-TNy>WZA;ZV88|$A{%Tq3)(2L)NaQxj!}4(8OJ!k)&6?c>BN;S%{b33 z2p5ZmvS=$=aR;$!niY(y$|6H%%YT%UQcl^$3S@)hQ5F066PzRl?yUi2 zFqubj2(&Kl!NbZ^pwtr|M@VJLSQW=uMV79-rL!2y(rpsSKdCJ^q4-druQ&YlV>q$N@;@bK!fHbBFO*s?3;C)}h zz?x=7LbyZnJdOfVvA~BkTpK!#Ne@0Hz4q@Fa`^u9%P2|UsY=F&5B&K`HeTiw-cXj! zi+~OvgaQ|bi_-V4tCVq)27mO*b3{OiqR>(Yt~O9T-9vqIIKbHKtHXggH2bdJaZRmL z`?z0v1nXtNyb^s48w%Kd2fOWoKEhq>4f_~(&Gu-7wGK9rsvF4I!0wbD!G0Xk)U2bLH&G& zJ-8P=Ultvk_VVpBu4??su$B7d+^2r~lGcQL(!c8#}n&*`1o>>yL({A!$e&l7^%q zX-M7_NvpSgH$>CWmIW5lrSlWBqy`uX1S`U`50k(TBMs#T1ONp99smgdF90sH@DDrz z3J7CN$w~tN0O%EyHW4!$l@v^!+yVdqFA@L%6#xJL0000000000008rogb_jl0tb`8 s1{IUt5h?-PlL!(e1S`U`50fzx76J?qlSvXk0hp7C5*r5B5C8xG0CUbW=>Px# delta 1711 zcmV;g22lBkCaNWnihmJgg`W}w0089@000jF002Z!O+;^Fb!}yCbS`*pZ0%TEZ`v>v zey`O3;GMm+62(biH0_c~)he_~?TSRTO#&W5;()g#Mz$%?Uq3r0TtowOVo!qyJDhXA z@7y9e$KKu3;~fjfDaj<7rb#BQr-J%0lyY>9@nkZoPHI)g2Y=YHEF1rPd}xP5k_Hzv z6Ees`0tU4}WTF~GtWT;TOYt;LG|t6dC z+4Q<5FC{p5v7H^&c8=vfWVstV%H24Y`=D=k1?_ynwaKyQhb_9hyXfw*=!Y!2T|u?{ zU{+r$>O-XqJ33(O3-i*d9-Hx(&2V%xrsgYYW`DNVeVU?hFxAdxdU-uI=AezSD#+5U znCOmlRvXmYuS13aCK_J!sdsGDzc@oK_BgpO{`;f5*SqoXdxk#`zkgu#)G47aPXyjQ z*5YEW-8v-Wty6MNl27MvjQIGC89xUUw*-p|1-x;i;I%l-B;jo$CCvuQe7w=PpHMOU zN>7Dke6~*BGP-+7QZ%<~(^oa7yY(w5B-* zgh>`|GYK>8R>&fFVq2~yg2}IS(NF3xR5p)b9!VcrWIAXJV_)BU4mw9yc-%eDQ_3E= z0%Lw3CNBK>{RaeL;KDDqZ~AGUPs6LHjNd(d8nLGb)(PObSL@~^kJFed3i3EgB*|S! z12N`ApMMu&1VNdi9$eTfZh)`;4d{!E1KViSnTauQ90NCP$H55>Q;zv6v|r!W!5bt9ixghA5FnIe$lki5TTHMc6RW2Dt#&*`%Lwszf#t zBJ!3qA4XJ8!A&M6TuRMJBhbHdKpl){VHAL78+Xxev4r)v04kA0x{ow)Mfp z#5A`MmT5ZxzV;-bidG>SBitrtlUNm$O71R>2*SzYw@{ul*V>~U@&DG8fNeZUXIWHQ zAAc~!BOdcaN$m@+`VufQ5m`)?N7FP487)}QV-lT8|jVLVLPH852p}Y&%(!;%iqNa3^P*$!VR`zGmMV09B zvT)zD*QdW%dK`Z~<;l?vWh>=4f)o=qry1|vYl;70zdKaDr#D&({yvR(y?g$1BRrPT zYNM>1Z>O;i@1)D9{!`b_6KL~5acGWjKTaekk`u{^GaMO(pL@0f005>C000#L000000000000000y91LC1Q(O~5h?0=NIQ33z}c@O{q F003w40I~o8 diff --git a/core/tests/swfs/avm1/array_splice/test.swf b/core/tests/swfs/avm1/array_splice/test.swf index b8edc5e4ba20cc85c5a4c82a7e933f8b64bedbf7..830d52f5e052657a53a6c3ab0ca84346567505fa 100644 GIT binary patch literal 949 zcmV;m14{fuS5prX4gdgnoXu5FZ`(E;rJW{L+of%qc5BykAXLC@ut*f;f02-Qv#l8D z!P}7LRuls*(TPx55+u2{d)alLz~_CbeU{ypk+LMaiD!2mki?LGqR9829v>-b1lE5A z;Qk)~JjnrL>j41Zx9!b!01g7Hrym<_IO;oYsI#j>@hpmb9iicHC=W}r7n~xjX&O>g zq^c4_Na5Ix$VhU-7h)a83I+|$!1g2Cb0NPbU2hN_iee%=>ie0j8_LA;x>Pp3J{l1p zVOc?3hk^7~KuP2UC!Xij8yp4O4hhfTFM-#iVaVi(16yyZP=eio?O3q9j}OpA=A0Ha z*uSnSSd*~IjuTbUE9&jPuZ4xes zMpAg@neT_>1C@F_=L0kYeyJrkvrcFEYWMpnMTgNb?JY-#Cu5(YV;Xvcz@!ZRBH1mS zj{e#WBjTF$wNYmsvTa+s+G>@Xs!=hNhIZ7%SZk<9P3=f)v?{fhR<6a_e@ac&49^_! z+!8hGKd8-7Q?;K1`_yLpb%AQ5hFhg(rH%Koan!(gUn{lSxLm_kMXgkoYO1hM2gNQgCNCB*RD1_g5TL*UCg=jf zsUd&RC?lrB^0epGE|@mv^}+mw>`?bKIs?fm)0(y9i$e=;qwX#pt}Y)|_uvWvhS*<@ zz5tbe#mNssV zrLE#*J4-1m*YE3L;!C(;zP5{#$BZOADy*f87`Lw9+2i8mDR=g@@Qv_fw(DcW^}BmI zeLu{(Yfhd4;oIzmku`3J;b+MP{F{A4uXF?6W%MkJsh6E(X*XseUFF8(j^cFknWN{4 XqgyjafAOHM@=*XkvYY(_7;PEW%k$4x literal 872 zcmV-u1DE_mS5pt43;+OloXu6yZre5#y-t>xYnQfZ)~#JrfKUNrL1R&rW5*T}w@Ew$ zd2m}~c`J&7mgq#NED4fa+kM$gN8cjUtI&Nr)r(NYVihP5Re!s8wOR5)~5L&C%h^7-= zFA7949J&!36y5NtQpd4EgNJ5d`;qOrSU$71*Nb))C6OI;{Y=&kRc3i@u9{w#446-- zsu8IpK*mA9S>y%Bp6Ar}Bnmej7M|kQf!E<-DCC)g5B{v+B5wC=$HH4xxsZ%}vi?k?hNevs$FMQ4#Up01h@EGaj%n4C+O&fpgQCh8)noYX3O)HvSu4t7w`}5RPt>KwHnOmY}{R_1z zYO3}suup8UUuUT9ZPSC&ez{4j^Hpa^WL|k-f8bU#@VfCT_$&yyOlnt2qmnVj`5N|& zn95g8>=HFqv%Y6Sm#C?l_g`ZAsszp!W|GtFElrXWu#Vwi;q2_}`C>Z{@aao#9SFgx zG~UH;6sBxqr7epoizN$J-a-lj4i=cu1}3SY{G)L}Oo!ER&+i*BZcOXL^n>bf_ar)n z