From b065fbde1932bee6ca60bf07a055d0ecc2881edc Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 19 Jul 2019 10:09:26 +0300 Subject: [PATCH] ZEND_DECLARE_ANON_CLASS doesn't need to skip anything now. It's immediatelly followed by ZEND_NEW. --- Zend/zend_compile.c | 3 +-- Zend/zend_opcode.c | 1 - Zend/zend_vm_def.h | 12 ++++++------ Zend/zend_vm_execute.h | 10 +++++----- Zend/zend_vm_opcodes.c | 2 +- ext/opcache/Optimizer/block_pass.c | 1 - ext/opcache/Optimizer/dfa_pass.c | 1 - ext/opcache/Optimizer/sccp.c | 1 - ext/opcache/Optimizer/zend_cfg.c | 2 -- ext/opcache/Optimizer/zend_optimizer.c | 4 ---- ext/opcache/zend_file_cache.c | 2 -- ext/opcache/zend_persist.c | 1 - 12 files changed, 13 insertions(+), 27 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 1e57c7bf09..d8180c9bee 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3960,11 +3960,10 @@ void zend_compile_new(znode *result, zend_ast *ast) /* {{{ */ zend_op *opline; if (class_ast->kind == ZEND_AST_CLASS) { - /* jump over anon class declaration */ + /* anon class declaration */ opline = zend_compile_class_decl(class_ast, 0); class_node.op_type = opline->result_type; class_node.u.op.var = opline->result.var; - opline->extended_value = get_next_op_number(); } else { zend_compile_class_ref(&class_node, class_ast, ZEND_FETCH_CLASS_EXCEPTION); } diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 0d26088167..a62d3db477 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -959,7 +959,6 @@ ZEND_API int pass_two(zend_op_array *op_array) ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op2); break; } - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: /* absolute index to relative offset */ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 8594cda179..0224e674e7 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -7264,24 +7264,24 @@ ZEND_VM_HANDLER(145, ZEND_DECLARE_CLASS_DELAYED, CONST, CONST) ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_HANDLER(146, ZEND_DECLARE_ANON_CLASS, ANY, ANY, JMP_ADDR) +ZEND_VM_HANDLER(146, ZEND_DECLARE_ANON_CLASS, ANY, ANY) { zval *zv; zend_class_entry *ce; USE_OPLINE - SAVE_OPLINE(); zv = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1); ZEND_ASSERT(zv != NULL); ce = Z_CE_P(zv); Z_CE_P(EX_VAR(opline->result.var)) = ce; if (ce->ce_flags & ZEND_ACC_LINKED) { - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - ZEND_VM_CONTINUE(); + ZEND_VM_NEXT_OPCODE(); + } else { + SAVE_OPLINE(); + zend_do_link_class(ce, (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - zend_do_link_class(ce, (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, ANY) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 763cc1b1ac..2c21ea0a04 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2430,18 +2430,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLE zend_class_entry *ce; USE_OPLINE - SAVE_OPLINE(); zv = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1); ZEND_ASSERT(zv != NULL); ce = Z_CE_P(zv); Z_CE_P(EX_VAR(opline->result.var)) = ce; if (ce->ce_flags & ZEND_ACC_LINKED) { - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - ZEND_VM_CONTINUE(); + ZEND_VM_NEXT_OPCODE(); + } else { + SAVE_OPLINE(); + zend_do_link_class(ce, (opline->op2_type == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - zend_do_link_class(ce, (opline->op2_type == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 31262e089c..6ef58e4d90 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -367,7 +367,7 @@ static uint32_t zend_vm_opcodes_flags[195] = { 0x00000303, 0x00000003, 0x00000303, - 0x03000000, + 0x00000000, 0x00000000, 0x00060757, 0x00000000, diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index e5f12dfa32..e699d03d62 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -1000,7 +1000,6 @@ static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array, zend_op ZEND_SET_OP_JMP_ADDR(opline, opline->op2, new_opcodes + blocks[b->successors[0]].start); } break; - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: opline->extended_value = ZEND_OPLINE_TO_OFFSET(opline, new_opcodes + blocks[b->successors[0]].start); diff --git a/ext/opcache/Optimizer/dfa_pass.c b/ext/opcache/Optimizer/dfa_pass.c index 2da656e0c1..704cca1835 100644 --- a/ext/opcache/Optimizer/dfa_pass.c +++ b/ext/opcache/Optimizer/dfa_pass.c @@ -628,7 +628,6 @@ static void zend_ssa_replace_control_link(zend_op_array *op_array, zend_ssa *ssa } } break; - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: if (ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value) == old->start) { diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index bb3eebe183..6f8de3d43f 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -1927,7 +1927,6 @@ static void sccp_mark_feasible_successors( switch (opline->opcode) { case ZEND_ASSERT_CHECK: case ZEND_CATCH: - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: scdf_mark_edge_feasible(scdf, block_num, block->successors[0]); diff --git a/ext/opcache/Optimizer/zend_cfg.c b/ext/opcache/Optimizer/zend_cfg.c index d956f6dfbd..5e0f137024 100644 --- a/ext/opcache/Optimizer/zend_cfg.c +++ b/ext/opcache/Optimizer/zend_cfg.c @@ -375,7 +375,6 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b } BB_START(i + 1); break; - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: BB_START(ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value)); @@ -535,7 +534,6 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b block->successors[0] = j + 1; } break; - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: block->successors_count = 2; diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 683ea2548d..a922d0f597 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -709,7 +709,6 @@ void zend_optimizer_migrate_jump(zend_op_array *op_array, zend_op *new_opline, z case ZEND_ASSERT_CHECK: ZEND_SET_OP_JMP_ADDR(new_opline, new_opline->op2, ZEND_OP2_JMP_ADDR(opline)); break; - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: new_opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, new_opline, ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value)); @@ -759,7 +758,6 @@ void zend_optimizer_shift_jump(zend_op_array *op_array, zend_op *opline, uint32_ ZEND_SET_OP_JMP_ADDR(opline, opline->op2, ZEND_OP2_JMP_ADDR(opline) - shiftlist[ZEND_OP2_JMP_ADDR(opline) - op_array->opcodes]); } break; - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value) - shiftlist[ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value)]); @@ -1146,7 +1144,6 @@ static void zend_redo_pass_two(zend_op_array *op_array) opline->op2.jmp_addr = &op_array->opcodes[opline->op2.jmp_addr - old_opcodes]; } break; - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: case ZEND_SWITCH_LONG: @@ -1234,7 +1231,6 @@ static void zend_redo_pass_two_ex(zend_op_array *op_array, zend_ssa *ssa) opline->op2.jmp_addr = &op_array->opcodes[opline->op2.jmp_addr - old_opcodes]; } break; - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: case ZEND_SWITCH_LONG: diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index b5bab36e4b..83e8a9d575 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -470,7 +470,6 @@ static void zend_file_cache_serialize_op_array(zend_op_array *op_arra SERIALIZE_PTR(opline->op2.jmp_addr); } break; - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: case ZEND_SWITCH_LONG: @@ -1169,7 +1168,6 @@ static void zend_file_cache_unserialize_op_array(zend_op_array *op_arr UNSERIALIZE_PTR(opline->op2.jmp_addr); } break; - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: case ZEND_SWITCH_LONG: diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 247acc90f3..733b331e65 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -453,7 +453,6 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc opline->op2.jmp_addr = &new_opcodes[opline->op2.jmp_addr - op_array->opcodes]; } break; - case ZEND_DECLARE_ANON_CLASS: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: case ZEND_SWITCH_LONG: -- 2.40.0