Skip to content

Commit 86a96f2

Browse files
committed
Changed meaning of "op2" for ZEND_FREE, ZEND_FE_FREE, ZEND_FAST_CALL, ZEND_FAST_RET.
Previously it was an instruction number. Now it's an index in op_array->try_cacth_array[].
1 parent 9cfed11 commit 86a96f2

File tree

10 files changed

+64
-73
lines changed

10 files changed

+64
-73
lines changed

Zend/zend_compile.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,7 @@ typedef struct _zend_loop_var {
5858
zend_uchar opcode;
5959
zend_uchar var_type;
6060
uint32_t var_num;
61-
union {
62-
uint32_t try_catch_offset;
63-
uint32_t brk_cont_offset;
64-
} u;
61+
uint32_t try_catch_offset;
6562
} zend_loop_var;
6663

6764
static inline void zend_alloc_cache_slot(uint32_t literal) {
@@ -584,7 +581,7 @@ static inline void zend_begin_loop(zend_uchar free_opcode, const znode *loop_var
584581
info.opcode = free_opcode;
585582
info.var_type = loop_var->op_type;
586583
info.var_num = loop_var->u.op.var;
587-
info.u.brk_cont_offset = CG(context).current_brk_cont;
584+
info.try_catch_offset = CG(active_op_array)->last_try_catch;
588585
brk_cont_element->start = get_next_op_number(CG(active_op_array));
589586
} else {
590587
info.opcode = ZEND_NOP;
@@ -3574,7 +3571,7 @@ static int zend_handle_loops_and_finally_ex(zend_long depth) /* {{{ */
35743571
opline->result.var = loop_var->var_num;
35753572
SET_UNUSED(opline->op1);
35763573
SET_UNUSED(opline->op2);
3577-
opline->op1.num = loop_var->u.try_catch_offset;
3574+
opline->op1.num = loop_var->try_catch_offset;
35783575
} else if (loop_var->opcode == ZEND_RETURN) {
35793576
/* Stack separator */
35803577
break;
@@ -3592,7 +3589,7 @@ static int zend_handle_loops_and_finally_ex(zend_long depth) /* {{{ */
35923589
opline->op1_type = loop_var->var_type;
35933590
opline->op1.var = loop_var->var_num;
35943591
SET_UNUSED(opline->op2);
3595-
opline->op2.num = loop_var->u.brk_cont_offset;
3592+
opline->op2.num = loop_var->try_catch_offset;
35963593
opline->extended_value = ZEND_FREE_ON_RETURN;
35973594
depth--;
35983595
}
@@ -4163,7 +4160,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
41634160
fast_call.opcode = ZEND_FAST_CALL;
41644161
fast_call.var_type = IS_TMP_VAR;
41654162
fast_call.var_num = CG(context).fast_call_var;
4166-
fast_call.u.try_catch_offset = try_catch_offset;
4163+
fast_call.try_catch_offset = try_catch_offset;
41674164
zend_stack_push(&CG(loop_var_stack), &fast_call);
41684165
}
41694166

Zend/zend_opcode.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -516,48 +516,52 @@ static void zend_check_finally_breakout(zend_op_array *op_array, uint32_t op_num
516516
static void zend_resolve_fast_call(zend_op_array *op_array, uint32_t op_num)
517517
{
518518
int i;
519-
uint32_t finally_op_num = 0;
519+
uint32_t finally_num = (uint32_t)-1;
520520

521521
for (i = 0; i < op_array->last_try_catch; i++) {
522522
if (op_num >= op_array->try_catch_array[i].finally_op
523523
&& op_num < op_array->try_catch_array[i].finally_end) {
524-
finally_op_num = op_array->try_catch_array[i].finally_op;
524+
finally_num = i;
525525
}
526526
}
527527

528-
if (finally_op_num) {
528+
if (finally_num != (uint32_t)-1) {
529529
/* Must be ZEND_FAST_CALL */
530-
ZEND_ASSERT(op_array->opcodes[finally_op_num - 2].opcode == ZEND_FAST_CALL);
530+
ZEND_ASSERT(op_array->opcodes[op_array->try_catch_array[finally_num].finally_op - 2].opcode == ZEND_FAST_CALL);
531531
op_array->opcodes[op_num].extended_value = ZEND_FAST_CALL_FROM_FINALLY;
532-
op_array->opcodes[op_num].op2.opline_num = finally_op_num - 2;
532+
op_array->opcodes[op_num].op2.num = finally_num;
533533
}
534534
}
535535

536536
static void zend_resolve_finally_ret(zend_op_array *op_array, uint32_t op_num)
537537
{
538538
int i;
539-
uint32_t catch_op_num = 0, finally_op_num = 0;
539+
uint32_t finally_num = (uint32_t)-1;
540+
uint32_t catch_num = (uint32_t)-1;
540541

541542
for (i = 0; i < op_array->last_try_catch; i++) {
542543
if (op_array->try_catch_array[i].try_op > op_num) {
543544
break;
544545
}
545546
if (op_num < op_array->try_catch_array[i].finally_op) {
546-
finally_op_num = op_array->try_catch_array[i].finally_op;
547+
finally_num = i;
547548
}
548549
if (op_num < op_array->try_catch_array[i].catch_op) {
549-
catch_op_num = op_array->try_catch_array[i].catch_op;
550+
catch_num = i;
550551
}
551552
}
552553

553-
if (finally_op_num && (!catch_op_num || catch_op_num >= finally_op_num)) {
554+
if (finally_num != (uint32_t)-1 &&
555+
(catch_num == (uint32_t)-1 ||
556+
op_array->try_catch_array[catch_num].catch_op >=
557+
op_array->try_catch_array[finally_num].finally_op)) {
554558
/* in case of unhandled exception return to upward finally block */
555559
op_array->opcodes[op_num].extended_value = ZEND_FAST_RET_TO_FINALLY;
556-
op_array->opcodes[op_num].op2.opline_num = finally_op_num;
557-
} else if (catch_op_num) {
560+
op_array->opcodes[op_num].op2.num = finally_num;
561+
} else if (catch_num != (uint32_t)-1) {
558562
/* in case of unhandled exception return to upward catch block */
559563
op_array->opcodes[op_num].extended_value = ZEND_FAST_RET_TO_CATCH;
560-
op_array->opcodes[op_num].op2.opline_num = catch_op_num;
564+
op_array->opcodes[op_num].op2.num = catch_num;
561565
}
562566
}
563567

Zend/zend_vm_def.h

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2711,7 +2711,7 @@ ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
27112711
ZEND_VM_JMP(opline);
27122712
}
27132713

2714-
ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, ANY)
2714+
ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, TRY_CATCH)
27152715
{
27162716
USE_OPLINE
27172717

@@ -2720,7 +2720,7 @@ ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, ANY)
27202720
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
27212721
}
27222722

2723-
ZEND_VM_HANDLER(127, ZEND_FE_FREE, TMPVAR, ANY)
2723+
ZEND_VM_HANDLER(127, ZEND_FE_FREE, TMPVAR, TRY_CATCH)
27242724
{
27252725
zval *var;
27262726
USE_OPLINE
@@ -7239,6 +7239,7 @@ ZEND_VM_HANDLER(155, ZEND_BIND_TRAITS, ANY, ANY)
72397239
ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
72407240
{
72417241
uint32_t op_num = EG(opline_before_exception) - EX(func)->op_array.opcodes;
7242+
uint32_t last_try_catch = EX(func)->op_array.last_try_catch;
72427243
int i;
72437244
uint32_t catch_op_num = 0, finally_op_num = 0, finally_op_end = 0;
72447245
int in_finally = 0;
@@ -7250,14 +7251,14 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
72507251
if ((exc_opline->opcode == ZEND_FREE || exc_opline->opcode == ZEND_FE_FREE)
72517252
&& exc_opline->extended_value & ZEND_FREE_ON_RETURN) {
72527253
/* exceptions thrown because of loop var destruction on return/break/...
7253-
* are logically thrown at the end of the foreach loop, so adjust the
7254-
* op_num.
7254+
* are logically thrown at the end of the foreach loop,
7255+
* so don't check the inner exception regions
72557256
*/
7256-
op_num = EX(func)->op_array.brk_cont_array[exc_opline->op2.num].brk;
7257+
last_try_catch = exc_opline->op2.num;
72577258
}
72587259
}
72597260

7260-
for (i = 0; i < EX(func)->op_array.last_try_catch; i++) {
7261+
for (i = 0; i < last_try_catch; i++) {
72617262
if (EX(func)->op_array.try_catch_array[i].try_op > op_num) {
72627263
/* further blocks will not be relevant... */
72637264
break;
@@ -7679,7 +7680,7 @@ ZEND_VM_HANDLER(159, ZEND_DISCARD_EXCEPTION, ANY, ANY)
76797680
ZEND_VM_NEXT_OPCODE();
76807681
}
76817682

7682-
ZEND_VM_HANDLER(162, ZEND_FAST_CALL, JMP_ADDR, JMP_ABS, FAST_CALL)
7683+
ZEND_VM_HANDLER(162, ZEND_FAST_CALL, JMP_ADDR, TRY_CATCH, FAST_CALL)
76837684
{
76847685
USE_OPLINE
76857686
zval *fast_call = EX_VAR(opline->result.var);
@@ -7695,7 +7696,7 @@ ZEND_VM_HANDLER(162, ZEND_FAST_CALL, JMP_ADDR, JMP_ABS, FAST_CALL)
76957696
ZEND_VM_CONTINUE();
76967697
}
76977698

7698-
ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, JMP_ABS, FAST_RET)
7699+
ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, TRY_CATCH, FAST_RET)
76997700
{
77007701
USE_OPLINE
77017702
zval *fast_call = EX_VAR(opline->op1.var);
@@ -7704,23 +7705,27 @@ ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, JMP_ABS, FAST_RET)
77047705
const zend_op *fast_ret = EX(func)->op_array.opcodes + fast_call->u2.lineno;
77057706
ZEND_VM_SET_OPCODE(fast_ret + 1);
77067707
if (fast_ret->extended_value & ZEND_FAST_CALL_FROM_FINALLY) {
7707-
fast_call->u2.lineno = fast_ret->op2.opline_num;
7708+
fast_call->u2.lineno = EX(func)->op_array.try_catch_array[fast_ret->op2.num].finally_op - 2;
77087709
}
77097710
ZEND_VM_CONTINUE();
77107711
} else {
77117712
/* special case for unhandled exceptions */
77127713
USE_OPLINE
77137714

77147715
if (opline->extended_value == ZEND_FAST_RET_TO_FINALLY) {
7715-
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, opline->op2.opline_num);
7716-
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]);
7716+
uint32_t finally_op = EX(func)->op_array.try_catch_array[opline->op2.num].finally_op;
7717+
7718+
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, finally_op);
7719+
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[finally_op]);
77177720
ZEND_VM_CONTINUE();
77187721
} else {
77197722
EG(exception) = Z_OBJ_P(fast_call);
77207723
Z_OBJ_P(fast_call) = NULL;
77217724
if (opline->extended_value == ZEND_FAST_RET_TO_CATCH) {
7722-
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, opline->op2.opline_num);
7723-
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]);
7725+
uint32_t catch_op = EX(func)->op_array.try_catch_array[opline->op2.num].catch_op;
7726+
7727+
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, catch_op);
7728+
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[catch_op]);
77247729
ZEND_VM_CONTINUE();
77257730
} else {
77267731
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, 0);

Zend/zend_vm_execute.h

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1476,6 +1476,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_TRAITS_SPEC_HANDLER(ZEND_
14761476
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14771477
{
14781478
uint32_t op_num = EG(opline_before_exception) - EX(func)->op_array.opcodes;
1479+
uint32_t last_try_catch = EX(func)->op_array.last_try_catch;
14791480
int i;
14801481
uint32_t catch_op_num = 0, finally_op_num = 0, finally_op_end = 0;
14811482
int in_finally = 0;
@@ -1487,14 +1488,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
14871488
if ((exc_opline->opcode == ZEND_FREE || exc_opline->opcode == ZEND_FE_FREE)
14881489
&& exc_opline->extended_value & ZEND_FREE_ON_RETURN) {
14891490
/* exceptions thrown because of loop var destruction on return/break/...
1490-
* are logically thrown at the end of the foreach loop, so adjust the
1491-
* op_num.
1491+
* are logically thrown at the end of the foreach loop,
1492+
* so don't check the inner exception regions
14921493
*/
1493-
op_num = EX(func)->op_array.brk_cont_array[exc_opline->op2.num].brk;
1494+
last_try_catch = exc_opline->op2.num;
14941495
}
14951496
}
14961497

1497-
for (i = 0; i < EX(func)->op_array.last_try_catch; i++) {
1498+
for (i = 0; i < last_try_catch; i++) {
14981499
if (EX(func)->op_array.try_catch_array[i].try_op > op_num) {
14991500
/* further blocks will not be relevant... */
15001501
break;
@@ -1633,23 +1634,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_RET_SPEC_HANDLER(ZEND_OPC
16331634
const zend_op *fast_ret = EX(func)->op_array.opcodes + fast_call->u2.lineno;
16341635
ZEND_VM_SET_OPCODE(fast_ret + 1);
16351636
if (fast_ret->extended_value & ZEND_FAST_CALL_FROM_FINALLY) {
1636-
fast_call->u2.lineno = fast_ret->op2.opline_num;
1637+
fast_call->u2.lineno = EX(func)->op_array.try_catch_array[fast_ret->op2.num].finally_op - 2;
16371638
}
16381639
ZEND_VM_CONTINUE();
16391640
} else {
16401641
/* special case for unhandled exceptions */
16411642
USE_OPLINE
16421643

16431644
if (opline->extended_value == ZEND_FAST_RET_TO_FINALLY) {
1644-
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, opline->op2.opline_num);
1645-
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]);
1645+
uint32_t finally_op = EX(func)->op_array.try_catch_array[opline->op2.num].finally_op;
1646+
1647+
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, finally_op);
1648+
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[finally_op]);
16461649
ZEND_VM_CONTINUE();
16471650
} else {
16481651
EG(exception) = Z_OBJ_P(fast_call);
16491652
Z_OBJ_P(fast_call) = NULL;
16501653
if (opline->extended_value == ZEND_FAST_RET_TO_CATCH) {
1651-
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, opline->op2.opline_num);
1652-
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]);
1654+
uint32_t catch_op = EX(func)->op_array.try_catch_array[opline->op2.num].catch_op;
1655+
1656+
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, catch_op);
1657+
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[catch_op]);
16531658
ZEND_VM_CONTINUE();
16541659
} else {
16551660
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, 0);

Zend/zend_vm_gen.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,14 @@
6060
"ZEND_VM_OP1_TMPVAR" => 1<<2,
6161
"ZEND_VM_OP1_NUM" => 1<<3,
6262
"ZEND_VM_OP1_JMP_ADDR" => 1<<4,
63-
"ZEND_VM_OP1_JMP_ABS" => 1<<5,
63+
"ZEND_VM_OP1_TRY_CATCH" => 1<<5,
6464

6565
"ZEND_VM_OP2_SPEC" => 1<<8,
6666
"ZEND_VM_OP2_CONST" => 1<<9,
6767
"ZEND_VM_OP2_TMPVAR" => 1<<10,
6868
"ZEND_VM_OP2_NUM" => 1<<11,
6969
"ZEND_VM_OP2_JMP_ADDR" => 1<<12,
70-
"ZEND_VM_OP2_JMP_ABS" => 1<<13,
70+
"ZEND_VM_OP2_TRY_CATCH" => 1<<13,
7171

7272
"ZEND_VM_EXT_NUM" => 1<<16,
7373
"ZEND_VM_EXT_VAR" => 1<<17,
@@ -98,7 +98,7 @@
9898
"TMPVAR" => ZEND_VM_OP1_SPEC | ZEND_VM_OP1_TMPVAR,
9999
"NUM" => ZEND_VM_OP1_NUM,
100100
"JMP_ADDR" => ZEND_VM_OP1_JMP_ADDR,
101-
"JMP_ABS" => ZEND_VM_OP1_JMP_ABS,
101+
"TRY_CATCH" => ZEND_VM_OP1_TRY_CATCH,
102102
);
103103

104104
$vm_ext_decode = array(

Zend/zend_vm_opcodes.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ static uint32_t zend_vm_opcodes_flags[182] = {
277277
0x00000801,
278278
0x00011003,
279279
0x00010300,
280-
0x00000005,
280+
0x00002005,
281281
0x00800703,
282282
0x00010703,
283283
0x02000007,
@@ -334,7 +334,7 @@ static uint32_t zend_vm_opcodes_flags[182] = {
334334
0x00000103,
335335
0x00001003,
336336
0x00040001,
337-
0x00000005,
337+
0x00002005,
338338
0x00010700,
339339
0x00000000,
340340
0x00000000,

Zend/zend_vm_opcodes.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@
3333
#define ZEND_VM_OP1_TMPVAR 0x00000004
3434
#define ZEND_VM_OP1_NUM 0x00000008
3535
#define ZEND_VM_OP1_JMP_ADDR 0x00000010
36-
#define ZEND_VM_OP1_JMP_ABS 0x00000020
36+
#define ZEND_VM_OP1_TRY_CATCH 0x00000020
3737
#define ZEND_VM_OP2_SPEC 0x00000100
3838
#define ZEND_VM_OP2_CONST 0x00000200
3939
#define ZEND_VM_OP2_TMPVAR 0x00000400
4040
#define ZEND_VM_OP2_NUM 0x00000800
4141
#define ZEND_VM_OP2_JMP_ADDR 0x00001000
42-
#define ZEND_VM_OP2_JMP_ABS 0x00002000
42+
#define ZEND_VM_OP2_TRY_CATCH 0x00002000
4343
#define ZEND_VM_EXT_NUM 0x00010000
4444
#define ZEND_VM_EXT_VAR 0x00020000
4545
#define ZEND_VM_EXT_JMP_ADDR 0x00040000

ext/opcache/Optimizer/block_pass.c

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -125,18 +125,6 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg, zend_optimiz
125125
while (opline < end) {
126126
switch((unsigned)opline->opcode) {
127127
case ZEND_FAST_CALL:
128-
START_BLOCK_OP(ZEND_OP1(opline).opline_num);
129-
if (opline->extended_value) {
130-
START_BLOCK_OP(ZEND_OP2(opline).opline_num);
131-
}
132-
START_BLOCK_OP(opno + 1);
133-
break;
134-
case ZEND_FAST_RET:
135-
if (opline->extended_value) {
136-
START_BLOCK_OP(ZEND_OP2(opline).opline_num);
137-
}
138-
START_BLOCK_OP(opno + 1);
139-
break;
140128
case ZEND_JMP:
141129
case ZEND_DECLARE_ANON_CLASS:
142130
case ZEND_DECLARE_ANON_INHERITED_CLASS:
@@ -147,6 +135,7 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg, zend_optimiz
147135
case ZEND_GENERATOR_RETURN:
148136
case ZEND_EXIT:
149137
case ZEND_THROW:
138+
case ZEND_FAST_RET:
150139
/* start new block from this+1 */
151140
START_BLOCK_OP(opno + 1);
152141
break;
@@ -272,21 +261,12 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg, zend_optimiz
272261
case ZEND_GENERATOR_RETURN:
273262
case ZEND_EXIT:
274263
case ZEND_THROW:
275-
break;
276-
case ZEND_FAST_CALL:
277-
if (opline->extended_value) {
278-
cur_block->op2_to = &blocks[ZEND_OP2(opline).opline_num];
279-
}
280-
cur_block->op1_to = &blocks[ZEND_OP1(opline).opline_num];
281-
break;
282264
case ZEND_FAST_RET:
283-
if (opline->extended_value) {
284-
cur_block->op2_to = &blocks[ZEND_OP2(opline).opline_num];
285-
}
286265
break;
287266
case ZEND_JMP:
288267
cur_block->op1_to = &blocks[ZEND_OP1(opline).opline_num];
289268
break;
269+
case ZEND_FAST_CALL:
290270
case ZEND_DECLARE_ANON_CLASS:
291271
case ZEND_DECLARE_ANON_INHERITED_CLASS:
292272
cur_block->op1_to = &blocks[ZEND_OP1(opline).opline_num];

sapi/phpdbg/phpdbg_opcode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op) /*{{{ */
121121
case ZEND_FAST_CALL:
122122
case ZEND_FAST_RET:
123123
if (op->extended_value != 0) {
124-
spprintf(&decode[2], 0, "J%" PRIu32, op->op2.opline_num);
124+
spprintf(&decode[2], 0, "%" PRIu32, op->op2.num);
125125
}
126126
break;
127127

sapi/phpdbg/tests/exceptions_003.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ prompt> [L7 %s ECHO "ok "
2525
00008: }
2626
00009: } catch (Error $e) {
2727
prompt> ok
28-
[L7 %s FAST_RET<TO_CATCH> ~%d J7 %s]
28+
[L7 %s FAST_RET<TO_CATCH> ~%d 0 %s]
2929
[L9 %s CATCH "Error" $e 1 %s]
3030
>00005: x();
3131
00006: } finally {

0 commit comments

Comments
 (0)