I wrote:
>       FOREACH [0, 1];
>               cols.$curcol = 1;
>               curcol = curcol + 1;
>       Dumper.dump([cols, curcol]);
>       END;

>       $VAR1 = [
>                 [
>                   1
>                 ],
>                 1
>               ];
>       $VAR1 = [
>                 [
>                   1,
>                   ${\$VAR1->[0][0]}
>                 ],
>                 2
>               ];
>
>I expect that last reference to be "1", not a reference.  If I use
>Template::Stash instead of Template::Stash::XS, then I get the expected
>result.

Upon further review, this workaround "fixes" it:

[%
        USE Dumper;
        curcol  = 0;
        cols    = [];

        Dumper.dump([cols, curcol]);
        FOREACH [0, 1];
                temp = 1;
                cols.$curcol = temp;
                curcol = curcol + 1;
        Dumper.dump([cols, curcol]);
        END;
%]

Yes, just putting it in a temp value fixes the problem.  Ouch!  So armed
with this new information, I delved into Stash.xs and came up with this
patch:

--- xs/Stash.xs.orig    Thu Feb 20 16:29:13 2003
+++ xs/Stash.xs Thu Feb 20 16:29:17 2003
@@ -681,11 +681,12 @@
                    return &PL_sv_undef;
            }

+           newsv = newSVsv(value);
            if (looks_like_number(key_sv)) {
-               if (av_store(rootav, SvIV(key_sv), value))
-                   SvREFCNT_inc(value);
+               if (av_store(rootav, SvIV(key_sv), newsv))
+                   SvREFCNT_inc(newsv);
                else
-                   SvSETMAGIC(value);
+                   SvSETMAGIC(newsv);

                return value;
            }


I am not 100% sure that it is the right thing to do, but it mirrors what
happens immediately above it in case SVt_PVHV, and it seems to fix the
problem.  In Slash, we are going to stick with the temp-var workaround for
now, since we don't want to deal with a possibly incorrect patch, and many
other sites using our code might not have this patch anyway.  :)

Thanks to Jamie McCarthy who did most of the legwork identifying the
problem and Chip Salzenberg for helping me sanity-check the patch.

-- 
Chris Nandor                      [EMAIL PROTECTED]    http://pudge.net/
Open Source Development Network    [EMAIL PROTECTED]     http://osdn.com/

_______________________________________________
templates mailing list
[EMAIL PROTECTED]
http://lists.template-toolkit.org/mailman/listinfo/templates

Reply via email to