t. Signature changes
u. Error Notification callbacks to replace zend_error_cb overwrite use-cases
v. Removed Zend APIs
+ w. Renamed Zend APIs
+ x. ZEND_EXT_NOP no longer emitted
2. Build system changes
a. Abstract
w. The following APIs have been renamed:
- _zend_ts_hash_init() to zend_ts_hash_init()
+ x. In COMPILE_EXTENDED_STMT mode, a ZEND_EXT_NOP opcode will no longer be
+ generated at the start of a function. Use the new observer APIs or hook
+ into zend_execute_ex instead.
+
========================
2. Build system changes
========================
zend_oparray_context_begin(&orig_oparray_context);
- if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_STMT) {
- zend_op *opline_ext = zend_emit_op(NULL, ZEND_EXT_NOP, NULL, NULL);
- opline_ext->lineno = decl->start_lineno;
- }
-
{
/* Push a separator to the loop variable stack */
zend_loop_var dummy_var;
if (fbc->type == ZEND_USER_FUNCTION) {
zend_op_array *op_array = &fbc->op_array;
uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
- uint32_t opline_offset = op_array->opcodes[0].opcode == ZEND_EXT_NOP;
for (uint32_t i = 0; i < num_args; i++) {
zval *arg = ZEND_CALL_VAR_NUM(call, i);
if (!Z_ISUNDEF_P(arg)) {
continue;
}
- zend_op *opline = &op_array->opcodes[i + opline_offset];
+ zend_op *opline = &op_array->opcodes[i];
if (EXPECTED(opline->opcode == ZEND_RECV_INIT)) {
zval *default_value = RT_CONSTANT(opline, opline->op2);
if (Z_OPT_TYPE_P(default_value) == IS_CONSTANT_AST) {
Z_CACHE_SLOT_P(val) = op_array->cache_size;
op_array->cache_size += sizeof(zval);
}
- } else if (opline->opcode != ZEND_RECV && opline->opcode != ZEND_EXT_NOP) {
+ } else if (opline->opcode != ZEND_RECV) {
break;
}
opline++;
case ZEND_EXT_STMT:
case ZEND_EXT_FCALL_BEGIN:
case ZEND_EXT_FCALL_END:
- case ZEND_EXT_NOP:
case ZEND_TICKS:
case ZEND_YIELD:
case ZEND_YIELD_FROM:
zend_basic_block *blocks = cfg->blocks;
blocks[start].flags = ZEND_BB_START;
- if (op_array->opcodes[0].opcode == ZEND_EXT_NOP
- && (cfg->flags & ZEND_CFG_RECV_ENTRY)) {
- blocks[1].flags |= ZEND_BB_RECV_ENTRY;
- }
zend_mark_reachable(op_array->opcodes, cfg, blocks + start);
if (op_array->last_try_catch) {
/* Build CFG, Step 1: Find basic blocks starts, calculate number of blocks */
BB_START(0);
- if (op_array->opcodes[0].opcode == ZEND_EXT_NOP
- && (build_flags & ZEND_CFG_RECV_ENTRY)) {
- BB_START(1);
- }
for (i = 0; i < op_array->last; i++) {
zend_op *opline = op_array->opcodes + i;
switch (opline->opcode) {
case ZEND_FUNC_GET_ARGS:
flags |= ZEND_FUNC_VARARG;
break;
- case ZEND_EXT_NOP:
case ZEND_EXT_STMT:
flags |= ZEND_FUNC_HAS_EXTENDED_STMT;
break;
}
recv_emitted = 1;
} else if (opline->opcode == ZEND_RECV) {
- if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
- && op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
+ if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
/* skip */
continue;
} else if (recv_emitted) {
/* restore original opcode handlers */
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
- if (opline->opcode == ZEND_EXT_NOP) {
- opline++;
- }
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
opline++;
}
op_array = &func->op_array;
opline = op_array->opcodes;
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
- if (opline->opcode == ZEND_EXT_NOP) {
- opline++;
- }
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
opline++;
}
if (JIT_G(hot_func)) {
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
- if (opline->opcode == ZEND_EXT_NOP) {
- opline++;
- }
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
opline++;
}
/* Set run-time JIT handler */
ZEND_ASSERT(zend_jit_runtime_jit_handler != NULL);
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
- if (opline->opcode == ZEND_EXT_NOP) {
- opline++;
- }
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
opline++;
}
ZEND_ASSERT(zend_jit_profile_jit_handler != NULL);
if (op_array->function_name) {
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
- if (opline->opcode == ZEND_EXT_NOP) {
- opline++;
- }
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
opline++;
}
}
}
if (opline->opcode == ZEND_RECV_INIT
- && !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
- && op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
+ && !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
/* RECV_INIT always copy the constant */
ssa_var_info[ssa_ops[idx].result_def].type = _const_op_type(RT_CONSTANT(opline, opline->op2));
} else if ((opline->opcode == ZEND_FE_FETCH_R || opline->opcode == ZEND_FE_FETCH_RW)
}
}
if (opline->opcode == ZEND_RECV_INIT
- && !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
- && op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
+ && !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
/* RECV_INIT always copy the constant */
ssa_var_info[ssa_ops[idx].result_def].type = _const_op_type(RT_CONSTANT(opline, opline->op2));
} else {
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;
}
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
- && op_array->opcodes[0].opcode != ZEND_EXT_NOP
&& i < op_array->num_args) {
/* Propagate argument type */
ssa_var_info[v].type &= STACK_INFO(frame->stack, i);
|| prev_opline->opcode == ZEND_CHECK_UNDEF_ARGS)
&& p->op_array->num_args
&& (p->op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0
- && (p->op_array->opcodes[0].opcode != ZEND_EXT_NOP)
&& ((p+1)->op == ZEND_JIT_TRACE_VM
|| (p+1)->op == ZEND_JIT_TRACE_END)
&& TRACE_FRAME_NUM_ARGS(call) < p->op_array->num_args
ZEND_ASSERT(zend_jit_func_trace_counter_handler != NULL);
opline = op_array->opcodes;
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
- if (opline->opcode == ZEND_EXT_NOP) {
- opline++;
- }
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
opline++;
}
zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
- (op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) ||
- op_array->opcodes[0].opcode == ZEND_EXT_NOP) {
+ (op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
| cmp dword EX->This.u2.num_args, arg_num
| jae >5
}
|| opcode == ZEND_DECLARE_CONST || opcode == ZEND_DECLARE_CLASS || opcode == ZEND_DECLARE_FUNCTION
|| opcode == ZEND_DECLARE_CLASS_DELAYED
|| opcode == ZEND_DECLARE_ANON_CLASS || opcode == ZEND_FAST_RET || opcode == ZEND_TICKS
- || opcode == ZEND_EXT_STMT || opcode == ZEND_EXT_FCALL_BEGIN || opcode == ZEND_EXT_FCALL_END || opcode == ZEND_EXT_NOP || opcode == ZEND_BIND_GLOBAL
+ || opcode == ZEND_EXT_STMT || opcode == ZEND_EXT_FCALL_BEGIN || opcode == ZEND_EXT_FCALL_END
+ || opcode == ZEND_BIND_GLOBAL
;
}