# New Ticket Created by Pepe Schwarz # Please include the string: [perl #126490] # in the subject line of all future correspondence about this issue. # <URL: https://rt.perl.org/Ticket/Display.html?id=126490 >
R-J currently fails in about five files in roast with "control exception without handler", golfable as follows: 16:08 <psch> r: A: for 1 { for 1 { last A } }; 16:08 <camelia> rakudo-jvm 3cc195: OUTPUT«===SORRY!===control exception without handler» 16:08 <camelia> ..rakudo-moar 3cc195: ( no output ) Digging around a bit showed that in this specific case the exception is of type 4104, e.g. last_labeled, which clearly is correct. The case of last-ing out of the current loop (with or without label) works, as follows: 16:12 <psch> j: A: for 1 { last A }; for 1 { last } 16:12 <camelia> rakudo-jvm 3cc195: ( no output ) Installing a CONTROL block in the labeled loop in the first case works somewhat as expected, the exception is caught, but doesn't identify itself as CX::Last: 16:15 <psch> j: A: for 1 { for 1 { last A }; CONTROL { when CX::Last { say "last" }; default { .perl.say } } } 16:15 <camelia> rakudo-jvm 3cc195: OUTPUT«X::AdHoc.new(payload => "Died")» The same code on R-M segfaults: 16:15 <psch> m: A: for 1 { for 1 { last A }; CONTROL { when CX::Last { say "last" }; default { .perl.say } } } 16:15 <camelia> rakudo-moar 3cc195: OUTPUT«(signal SEGV)» I have looked at the R-J and NQP-J CX handling, and have the suspicion that responsibility partly lies with org.perl6.nqp.runtime.ExceptionHandling:90, where it's decided not to use a handler if it's from the current frame. The corresponding code in Moar is beyond my C-understanding, but I further suspect that either the condition for discarding a possibly valid handler is different, or that codegen on moar inserts handlers differently. Also of note might be that neither NQP implements labeled loops themselves, even though it's from NQP::Grammar and NQP::Actions that we get handling of last/next/redo in the first place.