@@ -15166,18 +15166,10 @@ static int zend_jit_switch(zend_jit_ctx *jit, const zend_op *opline, const zend_
15166
15166
int b;
15167
15167
int32_t exit_point;
15168
15168
const void *exit_addr;
15169
- const void *fallback_label = NULL;
15170
15169
const void *default_label = NULL;
15171
15170
zval *zv;
15172
15171
15173
15172
if (next_opline) {
15174
- if (opline->opcode != ZEND_MATCH && next_opline != opline + 1) {
15175
- exit_point = zend_jit_trace_get_exit_point(opline + 1, 0);
15176
- fallback_label = zend_jit_trace_get_exit_addr(exit_point);
15177
- if (!fallback_label) {
15178
- return 0;
15179
- }
15180
- }
15181
15173
if (next_opline != default_opline) {
15182
15174
exit_point = zend_jit_trace_get_exit_point(default_opline, 0);
15183
15175
default_label = zend_jit_trace_get_exit_addr(exit_point);
@@ -15189,6 +15181,17 @@ static int zend_jit_switch(zend_jit_ctx *jit, const zend_op *opline, const zend_
15189
15181
15190
15182
if (opline->opcode == ZEND_SWITCH_LONG) {
15191
15183
if (op1_info & MAY_BE_LONG) {
15184
+ const void *fallback_label = NULL;
15185
+
15186
+ if (next_opline) {
15187
+ if (next_opline != opline + 1) {
15188
+ exit_point = zend_jit_trace_get_exit_point(opline + 1, 0);
15189
+ fallback_label = zend_jit_trace_get_exit_addr(exit_point);
15190
+ if (!fallback_label) {
15191
+ return 0;
15192
+ }
15193
+ }
15194
+ }
15192
15195
if (op1_info & MAY_BE_REF) {
15193
15196
ir_ref ref, if_long, fast_path, ref2;
15194
15197
@@ -15294,13 +15297,23 @@ static int zend_jit_switch(zend_jit_ctx *jit, const zend_op *opline, const zend_
15294
15297
}
15295
15298
jit->b = -1;
15296
15299
}
15297
- } else {
15298
- ZEND_ASSERT(!next_opline);
15300
+ } else if (!next_opline) {
15299
15301
_zend_jit_add_predecessor_ref(jit, jit->b + 1, jit->b, ir_END());
15300
15302
jit->b = -1;
15301
15303
}
15302
15304
} else if (opline->opcode == ZEND_SWITCH_STRING) {
15303
15305
if (op1_info & MAY_BE_STRING) {
15306
+ const void *fallback_label = NULL;
15307
+
15308
+ if (next_opline) {
15309
+ if (next_opline != opline + 1) {
15310
+ exit_point = zend_jit_trace_get_exit_point(opline + 1, 0);
15311
+ fallback_label = zend_jit_trace_get_exit_addr(exit_point);
15312
+ if (!fallback_label) {
15313
+ return 0;
15314
+ }
15315
+ }
15316
+ }
15304
15317
if (op1_info & MAY_BE_REF) {
15305
15318
ir_ref ref, if_string, fast_path, ref2;
15306
15319
@@ -15403,8 +15416,7 @@ static int zend_jit_switch(zend_jit_ctx *jit, const zend_op *opline, const zend_
15403
15416
}
15404
15417
jit->b = -1;
15405
15418
}
15406
- } else {
15407
- ZEND_ASSERT(!next_opline);
15419
+ } else if (!next_opline) {
15408
15420
_zend_jit_add_predecessor_ref(jit, jit->b + 1, jit->b, ir_END());
15409
15421
jit->b = -1;
15410
15422
}
0 commit comments