From: Dmitry Stogov Date: Mon, 27 Apr 2015 09:24:39 +0000 (+0300) Subject: Refactored using specialized opcodes X-Git-Tag: PRE_PHP7_NSAPI_REMOVAL~149^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=94245bc14c5ed1a1afa2c5a1bc081e95bcd3628b;p=php Refactored using specialized opcodes --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 4adc27d724..eb7f830cbc 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1055,16 +1055,9 @@ ZEND_API zend_class_entry *do_bind_class(const zend_op_array* op_array, const ze zend_error_noreturn(E_COMPILE_ERROR, "Internal Zend error - Missing class information for %s", Z_STRVAL_P(op1)); return NULL; } - - if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { - return ce; - } - ce->refcount++; - if (zend_hash_add_ptr(class_table, Z_STR_P(op2), ce) == NULL) { ce->refcount--; - if (!compile_time) { /* If we're in compile time, in practice, it's quite possible * that we'll never reach this class declaration at runtime, @@ -1114,11 +1107,6 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ce->name->val); } - /* Reuse anonymous bound class */ - if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { - return ce; - } - zend_do_inheritance(ce, parent_ce); ce->refcount++; @@ -1127,7 +1115,6 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array if (zend_hash_add_ptr(class_table, Z_STR_P(op2), ce) == NULL) { zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ce->name->val); } - return ce; } /* }}} */ @@ -3257,9 +3244,16 @@ void zend_compile_new(znode *result, zend_ast *ast) /* {{{ */ class_node.op_type = IS_CONST; ZVAL_STR(&class_node.u.constant, zend_resolve_class_name_ast(class_ast)); } else if (class_ast->kind == ZEND_AST_CLASS) { + uint32_t dcl_opnum = get_next_op_number(CG(active_op_array)); zend_class_entry *ce = zend_compile_class_decl(class_ast); class_node.op_type = IS_CONST; ZVAL_STR_COPY(&class_node.u.constant, ce->name); + /* jump over anon class declaration */ + opline = &CG(active_op_array)->opcodes[dcl_opnum]; + if (opline->opcode == ZEND_FETCH_CLASS) { + opline++; + } + opline->op1.opline_num = get_next_op_number(CG(active_op_array)); } else { zend_compile_class_ref(&class_node, class_ast, 1); } @@ -4904,7 +4898,7 @@ void zend_compile_implements(znode *class_node, zend_ast *ast) /* {{{ */ } /* }}} */ -static zend_string *zend_generate_anon_class_name() /* {{{ */ +static zend_string *zend_generate_anon_class_name(void) /* {{{ */ { // TODO The opline pointer may be reused, this is not safe! uint32_t next = get_next_op_number(CG(active_op_array)); @@ -4996,15 +4990,28 @@ zend_class_entry *zend_compile_class_decl(zend_ast *ast) /* {{{ */ opline->op2_type = IS_CONST; LITERAL_STR(opline->op2, lcname); - if (extends_ast) { - opline->opcode = ZEND_DECLARE_INHERITED_CLASS; - opline->extended_value = extends_node.u.op.var; + if (decl->flags & ZEND_ACC_ANON_CLASS) { + if (extends_ast) { + opline->opcode = ZEND_DECLARE_ANON_INHERITED_CLASS; + opline->extended_value = extends_node.u.op.var; + } else { + opline->opcode = ZEND_DECLARE_ANON_CLASS; + } + + opline->op1_type = IS_UNUSED; + + zend_hash_update_ptr(CG(class_table), lcname, ce); } else { - opline->opcode = ZEND_DECLARE_CLASS; - } + zend_string *key; - { - zend_string *key = zend_build_runtime_definition_key(lcname, decl->lex_pos); + if (extends_ast) { + opline->opcode = ZEND_DECLARE_INHERITED_CLASS; + opline->extended_value = extends_node.u.op.var; + } else { + opline->opcode = ZEND_DECLARE_CLASS; + } + + key = zend_build_runtime_definition_key(lcname, decl->lex_pos); opline->op1_type = IS_CONST; LITERAL_STR(opline->op1, key); diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 8bdaded38f..98734dc533 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -761,6 +761,9 @@ ZEND_API int pass_two(zend_op_array *op_array) opline->result.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->result.var); } switch (opline->opcode) { + case ZEND_DECLARE_ANON_INHERITED_CLASS: + ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1); + /* break omitted intentionally */ case ZEND_DECLARE_INHERITED_CLASS: case ZEND_DECLARE_INHERITED_CLASS_DELAYED: opline->extended_value = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->extended_value); @@ -772,6 +775,7 @@ ZEND_API int pass_two(zend_op_array *op_array) /* break omitted intentionally */ case ZEND_JMP: case ZEND_FAST_CALL: + case ZEND_DECLARE_ANON_CLASS: ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1); break; case ZEND_JMPZNZ: diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 68359062bc..6565324c4c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6723,14 +6723,6 @@ ZEND_VM_HANDLER(139, ZEND_DECLARE_CLASS, ANY, ANY) SAVE_OPLINE(); Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0); - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) { - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) { - while (opline->opcode != ZEND_NEW) { - opline++; - } - ZEND_VM_JMP(opline); - } else Z_CE_P(EX_VAR(opline->result.var))->ce_flags |= ZEND_ACC_ANON_BOUND; - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -6741,14 +6733,6 @@ ZEND_VM_HANDLER(140, ZEND_DECLARE_INHERITED_CLASS, ANY, ANY) SAVE_OPLINE(); Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->extended_value)), 0); - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) { - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) { - while (opline->opcode != ZEND_NEW) { - opline++; - } - ZEND_VM_JMP(opline); - } else Z_CE_P(EX_VAR(opline->result.var))->ce_flags |= ZEND_ACC_ANON_BOUND; - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -6768,6 +6752,48 @@ ZEND_VM_HANDLER(145, ZEND_DECLARE_INHERITED_CLASS_DELAYED, ANY, ANY) ZEND_VM_NEXT_OPCODE(); } +ZEND_VM_HANDLER(171, ZEND_DECLARE_ANON_CLASS, ANY, ANY) +{ + zend_class_entry *ce; + USE_OPLINE + + SAVE_OPLINE(); + ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op2))); + Z_CE_P(EX_VAR(opline->result.var)) = ce; + ZEND_ASSERT(ce != NULL); + + if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { + ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op1)); + } + + if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) { + zend_verify_abstract_class(ce); + } + ce->ce_flags |= ZEND_ACC_ANON_BOUND; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +ZEND_VM_HANDLER(172, ZEND_DECLARE_ANON_INHERITED_CLASS, ANY, ANY) +{ + zend_class_entry *ce; + USE_OPLINE + + SAVE_OPLINE(); + ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op2))); + Z_CE_P(EX_VAR(opline->result.var)) = ce; + ZEND_ASSERT(ce != NULL); + + if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { + ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op1)); + } + + zend_do_inheritance(ce, Z_CE_P(EX_VAR(opline->extended_value))); + ce->ce_flags |= ZEND_ACC_ANON_BOUND; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, ANY) { USE_OPLINE diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6a0c4bb49b..18f4e8584a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1305,14 +1305,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_HANDLER(ZEN SAVE_OPLINE(); Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0); - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) { - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) { - while (opline->opcode != ZEND_NEW) { - opline++; - } - ZEND_VM_JMP(opline); - } else Z_CE_P(EX_VAR(opline->result.var))->ce_flags |= ZEND_ACC_ANON_BOUND; - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -1323,14 +1315,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_SPEC_H SAVE_OPLINE(); Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->extended_value)), 0); - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) { - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) { - while (opline->opcode != ZEND_NEW) { - opline++; - } - ZEND_VM_JMP(opline); - } else Z_CE_P(EX_VAR(opline->result.var))->ce_flags |= ZEND_ACC_ANON_BOUND; - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -1350,6 +1334,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_DELAYE ZEND_VM_NEXT_OPCODE(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + zend_class_entry *ce; + USE_OPLINE + + SAVE_OPLINE(); + ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op2))); + Z_CE_P(EX_VAR(opline->result.var)) = ce; + ZEND_ASSERT(ce != NULL); + + if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { + ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op1)); + } + + if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) { + zend_verify_abstract_class(ce); + } + ce->ce_flags |= ZEND_ACC_ANON_BOUND; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + zend_class_entry *ce; + USE_OPLINE + + SAVE_OPLINE(); + ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op2))); + Z_CE_P(EX_VAR(opline->result.var)) = ce; + ZEND_ASSERT(ce != NULL); + + if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { + ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op1)); + } + + zend_do_inheritance(ce, Z_CE_P(EX_VAR(opline->extended_value))); + ce->ce_flags |= ZEND_ACC_ANON_BOUND; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -48776,6 +48802,56 @@ void zend_init_opcodes_handlers(void) ZEND_SPACESHIP_SPEC_CV_TMPVAR_HANDLER, ZEND_NULL_HANDLER, ZEND_SPACESHIP_SPEC_CV_CV_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, ZEND_NULL_HANDLER }; zend_opcode_handlers = labels; diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index e8337404bb..95b8b859eb 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -21,7 +21,7 @@ #include #include -const char *zend_vm_opcodes_map[171] = { +const char *zend_vm_opcodes_map[173] = { "ZEND_NOP", "ZEND_ADD", "ZEND_SUB", @@ -193,6 +193,8 @@ const char *zend_vm_opcodes_map[171] = { "ZEND_BIND_GLOBAL", "ZEND_COALESCE", "ZEND_SPACESHIP", + "ZEND_DECLARE_ANON_CLASS", + "ZEND_DECLARE_ANON_INHERITED_CLASS", }; ZEND_API const char* zend_get_opcode_name(zend_uchar opcode) { diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index a5620370bb..89a0d3139b 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -203,5 +203,7 @@ END_EXTERN_C() #define ZEND_BIND_GLOBAL 168 #define ZEND_COALESCE 169 #define ZEND_SPACESHIP 170 +#define ZEND_DECLARE_ANON_CLASS 171 +#define ZEND_DECLARE_ANON_INHERITED_CLASS 172 #endif diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 97cdb5b9e8..1d92f123b8 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -144,6 +144,8 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg, zend_optimiz START_BLOCK_OP(opno + 1); break; case ZEND_JMP: + case ZEND_DECLARE_ANON_CLASS: + case ZEND_DECLARE_ANON_INHERITED_CLASS: START_BLOCK_OP(ZEND_OP1(opline).opline_num); /* break missing intentionally */ case ZEND_RETURN: @@ -288,6 +290,11 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg, zend_optimiz case ZEND_JMP: cur_block->op1_to = &blocks[ZEND_OP1(opline).opline_num]; break; + case ZEND_DECLARE_ANON_CLASS: + case ZEND_DECLARE_ANON_INHERITED_CLASS: + cur_block->op1_to = &blocks[ZEND_OP1(opline).opline_num]; + cur_block->follow_to = &blocks[opno]; + break; case ZEND_JMPZNZ: cur_block->op2_to = &blocks[ZEND_OP2(opline).opline_num]; cur_block->ext_to = &blocks[opline->extended_value]; diff --git a/ext/opcache/Optimizer/nop_removal.c b/ext/opcache/Optimizer/nop_removal.c index 061d2bb89f..4a985df17c 100644 --- a/ext/opcache/Optimizer/nop_removal.c +++ b/ext/opcache/Optimizer/nop_removal.c @@ -87,6 +87,8 @@ void zend_optimizer_nop_removal(zend_op_array *op_array) case ZEND_JMP: case ZEND_GOTO: case ZEND_FAST_CALL: + case ZEND_DECLARE_ANON_CLASS: + case ZEND_DECLARE_ANON_INHERITED_CLASS: ZEND_OP1(opline).opline_num -= shiftlist[ZEND_OP1(opline).opline_num]; break; case ZEND_JMPZ: diff --git a/ext/opcache/Optimizer/optimize_temp_vars_5.c b/ext/opcache/Optimizer/optimize_temp_vars_5.c index b302556d56..77b4d66f94 100644 --- a/ext/opcache/Optimizer/optimize_temp_vars_5.c +++ b/ext/opcache/Optimizer/optimize_temp_vars_5.c @@ -125,6 +125,7 @@ void optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_ctx *c } if (opline->opcode == ZEND_DECLARE_INHERITED_CLASS || + opline->opcode == ZEND_DECLARE_ANON_INHERITED_CLASS || opline->opcode == ZEND_DECLARE_INHERITED_CLASS_DELAYED) { currT = VAR_NUM(opline->extended_value) - offset; if (!valid_T[currT]) { diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index cad023b5ca..79a4d8321d 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -89,6 +89,7 @@ int zend_optimizer_lookup_cv(zend_op_array *op_array, zend_string* name) opline->result.var += sizeof(zval); } if (opline->opcode == ZEND_DECLARE_INHERITED_CLASS || + opline->opcode == ZEND_DECLARE_ANON_INHERITED_CLASS || opline->opcode == ZEND_DECLARE_INHERITED_CLASS_DELAYED) { opline->extended_value += sizeof(zval); } @@ -497,6 +498,8 @@ static void zend_accel_optimize(zend_op_array *op_array, case ZEND_JMP: case ZEND_GOTO: case ZEND_FAST_CALL: + case ZEND_DECLARE_ANON_CLASS: + case ZEND_DECLARE_ANON_INHERITED_CLASS: ZEND_PASS_TWO_UNDO_JMP_TARGET(op_array, opline, ZEND_OP1(opline)); break; case ZEND_JMPZNZ: @@ -538,6 +541,8 @@ static void zend_accel_optimize(zend_op_array *op_array, case ZEND_JMP: case ZEND_GOTO: case ZEND_FAST_CALL: + case ZEND_DECLARE_ANON_CLASS: + case ZEND_DECLARE_ANON_INHERITED_CLASS: ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, ZEND_OP1(opline)); break; case ZEND_JMPZNZ: diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index b8a8694b84..5597d382e8 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -502,6 +502,8 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc case ZEND_JMP: case ZEND_GOTO: case ZEND_FAST_CALL: + case ZEND_DECLARE_ANON_CLASS: + case ZEND_DECLARE_ANON_INHERITED_CLASS: ZEND_OP1(opline).jmp_addr = &new_opcodes[ZEND_OP1(opline).jmp_addr - op_array->opcodes]; break; case ZEND_JMPZNZ: