This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
pp_leaveloop: use SVs_PADTMP|SVs_TEMP
authorDavid Mitchell <davem@iabyn.com>
Wed, 26 Aug 2015 10:34:59 +0000 (11:34 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Feb 2016 08:59:38 +0000 (08:59 +0000)
When calling leave_common(), most callers specify the "safe" return SVs
that don't need copying as being those with SVs_PADTMP or SVs_TEMP
set (leaveeval is a correct exception to this this).

pp_leaveloop() specified no flags, meaning that it always copies. This
appears to be just be an oversight rather than being for any good reason.

pp_ctl.c

index d3c35c8..64d4e59 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -1998,7 +1998,10 @@ PP(pp_dbstate)
    Process the return args on the stack in the range (mark..sp) based on
    context, with any final args starting at newsp.
    Args are mortal copied (or mortalied if lvalue) unless its safe to use
-   as-is, based on whether it the specified flags
+   as-is, based on whether it has the specified flags. Note that most
+   callers specify flags as (SVs_PADTMP|SVs_TEMP), while leaveeval skips
+   SVs_PADTMP since its optree gets immediately freed, freeing its padtmps
+   at the same time.
 
    Also, taintedness is cleared.
 */
@@ -2252,7 +2255,7 @@ PP(pp_leaveloop)
 
     SP = (gimme == G_VOID)
         ? newsp
-        : leave_common(newsp, SP, MARK, gimme, 0,
+        : leave_common(newsp, SP, MARK, gimme, SVs_PADTMP|SVs_TEMP,
                               PL_op->op_private & OPpLVALUE);
     PUTBACK;