Skip to content

Commit 34bb5ba

Browse files
committed
Remove support for EXT_NOP
This is an annoying edge case that regularly gets broken. As we're not aware of significant users of this API, and there are other ways to hook this, remove support for EXT_NOP.
1 parent 9e94bcf commit 34bb5ba

File tree

10 files changed

+14
-47
lines changed

10 files changed

+14
-47
lines changed

UPGRADING.INTERNALS

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ PHP 8.0 INTERNALS UPGRADE NOTES
2323
t. Signature changes
2424
u. Error Notification callbacks to replace zend_error_cb overwrite use-cases
2525
v. Removed Zend APIs
26+
w. Renamed Zend APIs
27+
x. ZEND_EXT_NOP no longer emitted
2628

2729
2. Build system changes
2830
a. Abstract
@@ -395,6 +397,10 @@ PHP 8.0 INTERNALS UPGRADE NOTES
395397
w. The following APIs have been renamed:
396398
- _zend_ts_hash_init() to zend_ts_hash_init()
397399

400+
x. In COMPILE_EXTENDED_STMT mode, a ZEND_EXT_NOP opcode will no longer be
401+
generated at the start of a function. Use the new observer APIs or hook
402+
into zend_execute_ex instead.
403+
398404
========================
399405
2. Build system changes
400406
========================

Zend/zend_compile.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6936,11 +6936,6 @@ void zend_compile_func_decl(znode *result, zend_ast *ast, zend_bool toplevel) /*
69366936

69376937
zend_oparray_context_begin(&orig_oparray_context);
69386938

6939-
if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_STMT) {
6940-
zend_op *opline_ext = zend_emit_op(NULL, ZEND_EXT_NOP, NULL, NULL);
6941-
opline_ext->lineno = decl->start_lineno;
6942-
}
6943-
69446939
{
69456940
/* Push a separator to the loop variable stack */
69466941
zend_loop_var dummy_var;

Zend/zend_execute.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4454,14 +4454,13 @@ ZEND_API zend_result ZEND_FASTCALL zend_handle_undef_args(zend_execute_data *cal
44544454
if (fbc->type == ZEND_USER_FUNCTION) {
44554455
zend_op_array *op_array = &fbc->op_array;
44564456
uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
4457-
uint32_t opline_offset = op_array->opcodes[0].opcode == ZEND_EXT_NOP;
44584457
for (uint32_t i = 0; i < num_args; i++) {
44594458
zval *arg = ZEND_CALL_VAR_NUM(call, i);
44604459
if (!Z_ISUNDEF_P(arg)) {
44614460
continue;
44624461
}
44634462

4464-
zend_op *opline = &op_array->opcodes[i + opline_offset];
4463+
zend_op *opline = &op_array->opcodes[i];
44654464
if (EXPECTED(opline->opcode == ZEND_RECV_INIT)) {
44664465
zval *default_value = RT_CONSTANT(opline, opline->op2);
44674466
if (Z_OPT_TYPE_P(default_value) == IS_CONSTANT_AST) {

ext/opcache/Optimizer/compact_literals.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
815815
Z_CACHE_SLOT_P(val) = op_array->cache_size;
816816
op_array->cache_size += sizeof(zval);
817817
}
818-
} else if (opline->opcode != ZEND_RECV && opline->opcode != ZEND_EXT_NOP) {
818+
} else if (opline->opcode != ZEND_RECV) {
819819
break;
820820
}
821821
opline++;

ext/opcache/Optimizer/dce.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ static inline zend_bool may_have_side_effects(
152152
case ZEND_EXT_STMT:
153153
case ZEND_EXT_FCALL_BEGIN:
154154
case ZEND_EXT_FCALL_END:
155-
case ZEND_EXT_NOP:
156155
case ZEND_TICKS:
157156
case ZEND_YIELD:
158157
case ZEND_YIELD_FROM:

ext/opcache/Optimizer/zend_cfg.c

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,6 @@ static void zend_mark_reachable_blocks(const zend_op_array *op_array, zend_cfg *
112112
zend_basic_block *blocks = cfg->blocks;
113113

114114
blocks[start].flags = ZEND_BB_START;
115-
if (op_array->opcodes[0].opcode == ZEND_EXT_NOP
116-
&& (cfg->flags & ZEND_CFG_RECV_ENTRY)) {
117-
blocks[1].flags |= ZEND_BB_RECV_ENTRY;
118-
}
119115
zend_mark_reachable(op_array->opcodes, cfg, blocks + start);
120116

121117
if (op_array->last_try_catch) {
@@ -291,10 +287,6 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
291287

292288
/* Build CFG, Step 1: Find basic blocks starts, calculate number of blocks */
293289
BB_START(0);
294-
if (op_array->opcodes[0].opcode == ZEND_EXT_NOP
295-
&& (build_flags & ZEND_CFG_RECV_ENTRY)) {
296-
BB_START(1);
297-
}
298290
for (i = 0; i < op_array->last; i++) {
299291
zend_op *opline = op_array->opcodes + i;
300292
switch (opline->opcode) {
@@ -434,7 +426,6 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
434426
case ZEND_FUNC_GET_ARGS:
435427
flags |= ZEND_FUNC_VARARG;
436428
break;
437-
case ZEND_EXT_NOP:
438429
case ZEND_EXT_STMT:
439430
flags |= ZEND_FUNC_HAS_EXTENDED_STMT;
440431
break;

ext/opcache/jit/zend_jit.c

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2118,8 +2118,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
21182118
}
21192119
recv_emitted = 1;
21202120
} else if (opline->opcode == ZEND_RECV) {
2121-
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
2122-
&& op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
2121+
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
21232122
/* skip */
21242123
continue;
21252124
} else if (recv_emitted) {
@@ -3540,9 +3539,6 @@ static void ZEND_FASTCALL zend_runtime_jit(void)
35403539

35413540
/* restore original opcode handlers */
35423541
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
3543-
if (opline->opcode == ZEND_EXT_NOP) {
3544-
opline++;
3545-
}
35463542
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
35473543
opline++;
35483544
}
@@ -3576,9 +3572,6 @@ void zend_jit_check_funcs(HashTable *function_table, zend_bool is_method) {
35763572
op_array = &func->op_array;
35773573
opline = op_array->opcodes;
35783574
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
3579-
if (opline->opcode == ZEND_EXT_NOP) {
3580-
opline++;
3581-
}
35823575
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
35833576
opline++;
35843577
}
@@ -3651,9 +3644,6 @@ static int zend_jit_setup_hot_counters(zend_op_array *op_array)
36513644

36523645
if (JIT_G(hot_func)) {
36533646
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
3654-
if (opline->opcode == ZEND_EXT_NOP) {
3655-
opline++;
3656-
}
36573647
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
36583648
opline++;
36593649
}
@@ -3692,9 +3682,6 @@ ZEND_EXT_API int zend_jit_op_array(zend_op_array *op_array, zend_script *script)
36923682
/* Set run-time JIT handler */
36933683
ZEND_ASSERT(zend_jit_runtime_jit_handler != NULL);
36943684
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
3695-
if (opline->opcode == ZEND_EXT_NOP) {
3696-
opline++;
3697-
}
36983685
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
36993686
opline++;
37003687
}
@@ -3714,9 +3701,6 @@ ZEND_EXT_API int zend_jit_op_array(zend_op_array *op_array, zend_script *script)
37143701
ZEND_ASSERT(zend_jit_profile_jit_handler != NULL);
37153702
if (op_array->function_name) {
37163703
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
3717-
if (opline->opcode == ZEND_EXT_NOP) {
3718-
opline++;
3719-
}
37203704
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
37213705
opline++;
37223706
}

ext/opcache/jit/zend_jit_trace.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,8 +1743,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
17431743
}
17441744
}
17451745
if (opline->opcode == ZEND_RECV_INIT
1746-
&& !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
1747-
&& op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
1746+
&& !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
17481747
/* RECV_INIT always copy the constant */
17491748
ssa_var_info[ssa_ops[idx].result_def].type = _const_op_type(RT_CONSTANT(opline, opline->op2));
17501749
} else if ((opline->opcode == ZEND_FE_FETCH_R || opline->opcode == ZEND_FE_FETCH_RW)
@@ -1806,8 +1805,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
18061805
}
18071806
}
18081807
if (opline->opcode == ZEND_RECV_INIT
1809-
&& !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
1810-
&& op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
1808+
&& !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
18111809
/* RECV_INIT always copy the constant */
18121810
ssa_var_info[ssa_ops[idx].result_def].type = _const_op_type(RT_CONSTANT(opline, opline->op2));
18131811
} else {
@@ -1887,7 +1885,6 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
18871885
ssa_var_info[v].type = MAY_BE_UNDEF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
18881886
}
18891887
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
1890-
&& op_array->opcodes[0].opcode != ZEND_EXT_NOP
18911888
&& i < op_array->num_args) {
18921889
/* Propagate argument type */
18931890
ssa_var_info[v].type &= STACK_INFO(frame->stack, i);
@@ -5323,7 +5320,6 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
53235320
|| prev_opline->opcode == ZEND_CHECK_UNDEF_ARGS)
53245321
&& p->op_array->num_args
53255322
&& (p->op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0
5326-
&& (p->op_array->opcodes[0].opcode != ZEND_EXT_NOP)
53275323
&& ((p+1)->op == ZEND_JIT_TRACE_VM
53285324
|| (p+1)->op == ZEND_JIT_TRACE_END)
53295325
&& TRACE_FRAME_NUM_ARGS(call) < p->op_array->num_args
@@ -6814,9 +6810,6 @@ static int zend_jit_setup_hot_trace_counters(zend_op_array *op_array)
68146810
ZEND_ASSERT(zend_jit_func_trace_counter_handler != NULL);
68156811
opline = op_array->opcodes;
68166812
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
6817-
if (opline->opcode == ZEND_EXT_NOP) {
6818-
opline++;
6819-
}
68206813
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
68216814
opline++;
68226815
}

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12199,8 +12199,7 @@ static int zend_jit_recv_init(dasm_State **Dst, const zend_op *opline, const zen
1219912199
zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
1220012200

1220112201
if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
12202-
(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) ||
12203-
op_array->opcodes[0].opcode == ZEND_EXT_NOP) {
12202+
(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
1220412203
| cmp dword EX->This.u2.num_args, arg_num
1220512204
| jae >5
1220612205
}

sapi/phpdbg/phpdbg.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,8 @@ static zend_always_inline zend_bool phpdbg_is_ignored_opcode(zend_uchar opcode)
482482
|| opcode == ZEND_DECLARE_CONST || opcode == ZEND_DECLARE_CLASS || opcode == ZEND_DECLARE_FUNCTION
483483
|| opcode == ZEND_DECLARE_CLASS_DELAYED
484484
|| opcode == ZEND_DECLARE_ANON_CLASS || opcode == ZEND_FAST_RET || opcode == ZEND_TICKS
485-
|| opcode == ZEND_EXT_STMT || opcode == ZEND_EXT_FCALL_BEGIN || opcode == ZEND_EXT_FCALL_END || opcode == ZEND_EXT_NOP || opcode == ZEND_BIND_GLOBAL
485+
|| opcode == ZEND_EXT_STMT || opcode == ZEND_EXT_FCALL_BEGIN || opcode == ZEND_EXT_FCALL_END
486+
|| opcode == ZEND_BIND_GLOBAL
486487
;
487488
}
488489

0 commit comments

Comments
 (0)