]> granicus.if.org Git - php/commitdiff
Refactored using specialized opcodes
authorDmitry Stogov <dmitry@zend.com>
Mon, 27 Apr 2015 09:24:39 +0000 (12:24 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 27 Apr 2015 09:24:39 +0000 (12:24 +0300)
Zend/zend_compile.c
Zend/zend_opcode.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
Zend/zend_vm_opcodes.c
Zend/zend_vm_opcodes.h
ext/opcache/Optimizer/block_pass.c
ext/opcache/Optimizer/nop_removal.c
ext/opcache/Optimizer/optimize_temp_vars_5.c
ext/opcache/Optimizer/zend_optimizer.c
ext/opcache/zend_persist.c

index 4adc27d724ec39167d8b9770e8148eea4fd939cb..eb7f830cbc0be430bff541248e83b8e9484e6b4a 100644 (file)
@@ -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);
index 8bdaded38f94aaf11f82a179a13df16c711c9f0b..98734dc533d420aba2e1908d980b8cdfceafef75 100644 (file)
@@ -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:
index 68359062bcfb2ccf708d39c727d1635d2ab816ef..6565324c4c4d7b422e980f390c222768e4bef26e 100644 (file)
@@ -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
index 6a0c4bb49bf44ca695a4475d1178bba83b4a2116..18f4e8584a9d5b0ac83bcc44a3544fd6a0ae0451 100644 (file)
@@ -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;
index e8337404bba15cdcbefd492cfee0a0be1a0eac73..95b8b859eb1c8965d572c5bf72dc18967b0dcd08 100644 (file)
@@ -21,7 +21,7 @@
 #include <stdio.h>
 #include <zend.h>
 
-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) {
index a5620370bb8482816af09cd05551b333e09721e5..89a0d3139be33ddb0d33ae6ffc42276d43ca55fb 100644 (file)
@@ -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
index 97cdb5b9e84dd3191f9fdf3ba0ddbd9fa0045637..1d92f123b81e38b09da421c401c6a0e639c8c10e 100644 (file)
@@ -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];
index 061d2bb89f8828816c20692028db98dbd9f214f6..4a985df17c004567d72e6ca5abcfd9762d4db075 100644 (file)
@@ -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:
index b302556d568ea8af7c153ff6242822b59e9b57c1..77b4d66f94402dfce3376da620429fc121b19060 100644 (file)
@@ -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]) {
index cad023b5ca704b485259058827b53225aaf8d1b8..79a4d8321d0d192a36586e77bfb171cd162de043 100644 (file)
@@ -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:
index b8a8694b84ea60247c58b1b2d36b5cc20b8c5165..5597d382e8a59e9b6df59b47d72fbee3b087acdd 100644 (file)
@@ -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: