# New Ticket Created by  Bob Rogers 
# Please include the string:  [perl #38284]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/rt3/Ticket/Display.html?id=38284 >


   This fixes Closure:mark, which incorrectly assumed that
sub->outer_ctx existed if sub->outer_sub did.

                                        -- Bob Rogers
                                           http://rgrjr.dyndns.org/

Index: src/pmc/closure.pmc
===================================================================
--- src/pmc/closure.pmc (revision 11268)
+++ src/pmc/closure.pmc (working copy)
@@ -58,10 +58,10 @@
     void mark () {
         struct Parrot_sub * sub = PMC_sub(SELF);
         SUPER();
-        if (sub->outer_sub) {
+        if (sub->outer_sub)
             pobject_lives(INTERP, (PObj*)sub->outer_sub);
+        if (sub->outer_ctx)
             mark_context(INTERP, sub->outer_ctx);
-        }
     }
 
 
Index: t/pmc/closure.t
===================================================================
--- t/pmc/closure.t     (revision 11268)
+++ t/pmc/closure.t     (working copy)
@@ -33,6 +33,25 @@
 ok 1
 OUT
 
+pir_output_is(<<'CODE', <<'OUTPUT', 'Make sure we can sweep closures.');
+## This is a regression test for a bug in which Closure:mark expected
+## sub->outer_ctx to be initialized, regardless of whether the closure
+## had ever been called.
+.sub _test_1 :main
+       .lex "X", $P40
+       $P40 = new Integer
+       $P40 = 22
+       .const .Sub $P43 = "___internal_test_1_0_"
+       newclosure $P44, $P43
+       sweep 1
+        print "We lived.\n"
+.end
+.sub ___internal_test_1_0_ :outer('_test_1')
+       print "This is never actually run.\n"
+.end
+CODE
+We lived.
+OUTPUT
 
 # remember to change the number of tests :-)
-BEGIN { plan tests => 1; }
+BEGIN { plan tests => 2; }

Reply via email to