@@ -81,6 +81,7 @@ my $EX_CAT_PROCEED := 256;
81
81
my $ EX_CAT_CONTROL := $ EX_CAT_NEXT +| $ EX_CAT_REDO +| $ EX_CAT_LAST +|
82
82
$ EX_CAT_TAKE +| $ EX_CAT_WARN +|
83
83
$ EX_CAT_SUCCEED +| $ EX_CAT_PROCEED ;
84
+ my $ EX_CAT_LABELED := 4096 ;
84
85
85
86
# Exception handler kinds.
86
87
my $ EX_UNWIND_SIMPLE := 0 ;
@@ -1066,7 +1067,7 @@ for ('', 'repeat_') -> $repness {
1066
1067
my $ l_handler_id ;
1067
1068
my $ nr_handler_id ;
1068
1069
if $ handler {
1069
- $ l_handler_id := & * REGISTER_UNWIND_HANDLER ($ * HANDLER_IDX , $ EX_CAT_LAST , : ex_obj(1 ));
1070
+ $ l_handler_id := & * REGISTER_UNWIND_HANDLER ($ * HANDLER_IDX , $ EX_CAT_LAST , : ex_obj(1 ));
1070
1071
$ nr_handler_id := & * REGISTER_UNWIND_HANDLER ($ l_handler_id , $ EX_CAT_NEXT +| $ EX_CAT_REDO , : ex_obj(1 ));
1071
1072
}
1072
1073
@@ -1133,6 +1134,8 @@ for ('', 'repeat_') -> $repness {
1133
1134
$ qastcomp . unwind_check($ catch , $ nr_handler_id , : $ label , : outer($ l_handler_id ));
1134
1135
$ catch . append (JAST::Instruction. new ( : op(' getfield' ), $ TYPE_EX_UNWIND , ' category' , ' Long' ));
1135
1136
$ catch . append (JAST::PushIVal. new ( : value($ EX_CAT_REDO ) ));
1137
+ $ catch . append (JAST::Instruction. new ( : op(' land' ) ));
1138
+ $ catch . append (JAST::PushIVal. new ( : value($ EX_CAT_REDO ) ));
1136
1139
$ catch . append ($ LCMP );
1137
1140
$ catch . append (JAST::Instruction. new ( : op(' ifeq' ), $ redo_lbl ));
1138
1141
$ body_il := $ qastcomp . delimit_handler(
@@ -1712,7 +1715,10 @@ QAST::OperationsJAST.add_core_op('handle', :!inlinable, sub ($qastcomp, $op) {
1712
1715
my % control_map := nqp ::hash(
1713
1716
' next' , $ EX_CAT_NEXT ,
1714
1717
' last' , $ EX_CAT_LAST ,
1715
- ' redo' , $ EX_CAT_REDO
1718
+ ' redo' , $ EX_CAT_REDO ,
1719
+ ' next_label' , $ EX_CAT_NEXT +| $ EX_CAT_LABELED ,
1720
+ ' last_label' , $ EX_CAT_LAST +| $ EX_CAT_LABELED ,
1721
+ ' redo_label' , $ EX_CAT_REDO +| $ EX_CAT_LABELED
1716
1722
);
1717
1723
QAST ::OperationsJAST. add_core_op(' control' , -> $ qastcomp , $ op {
1718
1724
my $ label ;
@@ -1721,10 +1727,10 @@ QAST::OperationsJAST.add_core_op('control', -> $qastcomp, $op {
1721
1727
}
1722
1728
my $ name := $ op . name ;
1723
1729
if nqp ::existskey(% control_map , $ name ) {
1724
- my $ cat := % control_map {$ name };
1725
1730
my $ il := JAST::InstructionList. new ();
1726
1731
$ * STACK . spill_to_locals($ il );
1727
1732
if $ label {
1733
+ my $ cat := % control_map {$ name ~ ' _label' };
1728
1734
my $ new_ex := $ * TA . fresh_o();
1729
1735
1730
1736
# Create a new exception object
@@ -1758,6 +1764,7 @@ QAST::OperationsJAST.add_core_op('control', -> $qastcomp, $op {
1758
1764
' _throw_c' , ' Void' , $ TYPE_SMO , $ TYPE_TC )));
1759
1765
}
1760
1766
else {
1767
+ my $ cat := % control_map {$ name };
1761
1768
$ il . append (JAST::PushIVal. new ( : value($ cat ) ));
1762
1769
$ il . append ($ ALOAD_1 );
1763
1770
$ il . append (savesite(JAST::Instruction. new ( : op(' invokestatic' ), $ TYPE_OPS ,
0 commit comments