As I noted online and in the Perl 6 design meeting earlier today,
the attached patch (applied to r28973) causes imcc to hang 
while building rakudo at the step

    ../../parrot -o perl6.pbc perl6.pir 

This step never completes -- in fact, I inadvertently left 
it running for four hours and it hadn't completed.

I'm reporting this because it's extremely odd; the patch itself
does nothing more than add a function to src/builtins/guts.pir;
in fact, Rakudo doesn't even use that function yet.  Within the
function, simply changing the placement of the push_eh opcode
seems to be enough to get things to compile again.

Can anyone reproduce the problem on their systems?

Thanks,

Pm
Index: languages/perl6/src/builtins/guts.pir
===================================================================
--- languages/perl6/src/builtins/guts.pir       (revision 28973)
+++ languages/perl6/src/builtins/guts.pir       (working copy)
@@ -58,6 +58,54 @@
 .end
 
 
+=item !OUTER(name [,'max'=>max])
+
+Helper function to obtain the lexical C<name> from the
+caller's outer scope.  (Note that it never finds a lexical
+in the caller's lexpad -- use C<find_lex> for that.)  The
+C<max> parameter specifies the maximum outer to search --
+the default value of 1 will search the caller's immediate
+outer scope and no farther.  If the requested lexical is
+not found, C<!OUTER> returns null.
+
+=cut
+
+.sub '!OUTER'
+    .param string name
+    .param int max             :named('max') :optional
+    .param int has_max         :opt_flag
+
+    if has_max goto have_max
+    max = 1
+  have_max:
+
+    .local int min
+    min = 1
+
+    ##  start with caller's outer scope (i.e., outer depth is 2)
+    .local int depth
+    depth = 2
+    .local pmc lexpad, value
+    null value
+    push_eh outer_err
+  loop:
+    unless max >= min goto done
+    $P0 = getinterp
+    lexpad = $P0['outer', depth]
+    unless lexpad goto next
+    value = lexpad[name]
+    unless null value goto done
+  next:
+    inc depth
+    dec max
+    goto loop
+  done:
+    pop_eh
+  outer_err:
+    .return (value)
+.end
+
+
 =item !VAR
 
 Helper function for implementing the VAR and .VAR macros.

Reply via email to