In rev 10317, parrot segfaults if the sub named in ":outer" is not
defined in the current compilation unit.  The patch fixes the symptom,
and adds a test.  (But the error message could be improved.)

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


Index: imcc/pbc.c
===================================================================
--- imcc/pbc.c  (revision 10317)
+++ imcc/pbc.c  (working copy)
@@ -594,6 +594,10 @@
      * could be eval too - look, if :outer is the currentsub
      */
     current = CONTEXT(interpreter->ctx)->current_sub;
+    if (! current)
+        IMCC_fatal(interpreter, 1,
+                   "Undefined :outer sub '%s'.\n",
+                   unit->outer->name);
     cur_name = PMC_sub(current)->name;
     if (cur_name->strlen == len &&
             !memcmp((char*)cur_name->strstart, unit->outer->name, len)) {
Index: t/op/lexicals.t
===================================================================
--- t/op/lexicals.t     (revision 10317)
+++ t/op/lexicals.t     (working copy)
@@ -328,6 +328,16 @@
 ok
 OUTPUT
 
+pir_output_is(<<'CODE', <<'OUTPUT', ':outer parsing - missing :outer');
+.sub main
+    print "ok\n"
+.end
+.sub foo :outer(oops)
+.end
+CODE
+Undefined :outer sub 'oops'.
+OUTPUT
+
 pir_output_is(<<'CODE', <<'OUTPUT', 'get_lexinfo from pad');
 .sub main
     .lex '$a', P0
@@ -866,4 +876,4 @@
 
 
 ## remember to change the number of tests :-)
-BEGIN { plan tests => 35; }
+BEGIN { plan tests => 36; }

Reply via email to