ary/hash/firsthashelem should be set only once
authorRuslan Zakirov <ruz@bestpractical.com>
Sat, 13 Oct 2012 17:28:10 +0000 (21:28 +0400)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 11 Dec 2012 16:59:41 +0000 (08:59 -0800)
Only once for first hash or array, otherwise
(%h,@a) = ... assignment returns wrong results
for duplicates and/or number of elements on RHS.

pp_hot.c

index 14b2878..7886a80 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1045,6 +1045,14 @@ PP(pp_aassign)
        sv = *lelem++;
        switch (SvTYPE(sv)) {
        case SVt_PVAV:
+            if (relem > lastrelem) {
+               av_clear(MUTABLE_AV(sv));
+                if (PL_delaymagic & DM_ARRAY_ISA)
+                    SvSETMAGIC(sv);
+                if (gimme == G_ARRAY && !hash && !ary)
+                    ary = MUTABLE_AV(sv);
+                break;
+            }
            ary = MUTABLE_AV(sv);
            magic = SvMAGICAL(ary) != 0;
            ENTER;
@@ -1075,6 +1083,14 @@ PP(pp_aassign)
        case SVt_PVHV: {                                /* normal hash */
                SV *tmpstr;
                SV** topelem = relem;
+               if (relem > lastrelem) {
+                   hv_clear(MUTABLE_HV(sv));
+                   if (gimme == G_ARRAY && !hash && !ary) {
+                        hash = MUTABLE_HV(sv);
+                        firsthashrelem = relem;
+                    }
+                    break;
+                }
 
                hash = MUTABLE_HV(sv);
                magic = SvMAGICAL(hash) != 0;