]> granicus.if.org Git - php/commitdiff
Use absolute addresses as branch targets for NEW, FE_RESET and FE_FETCH
authorDmitry Stogov <dmitry@zend.com>
Wed, 11 Jun 2014 07:39:42 +0000 (11:39 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 11 Jun 2014 07:39:42 +0000 (11:39 +0400)
Zend/zend_execute_API.c
Zend/zend_opcode.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/opcache/Optimizer/zend_optimizer.c
ext/opcache/zend_persist.c

index 9a74a0d3fb7aef5a7340233ee6e3d71f3171ad94..c95986b7b0b673a337eb0b8c06496947ada8f535 100644 (file)
@@ -1192,6 +1192,9 @@ void execute_new_code(TSRMLS_D) /* {{{ */
                        case ZEND_JMPNZ_EX:
                        case ZEND_JMP_SET:
                        case ZEND_JMP_SET_VAR:
+                       case ZEND_NEW:
+                       case ZEND_FE_RESET:
+                       case ZEND_FE_FETCH:
                                opline->op2.jmp_addr = &CG(active_op_array)->opcodes[opline->op2.opline_num];
                                break;
                }
index 37875dca5784ff33068f8c160402e893112a6b0a..2cd0a1bf7df99d8e445344ecf84702a930a1b2e6 100644 (file)
@@ -693,6 +693,9 @@ ZEND_API int pass_two(zend_op_array *op_array TSRMLS_DC)
                        case ZEND_JMPNZ_EX:
                        case ZEND_JMP_SET:
                        case ZEND_JMP_SET_VAR:
+                       case ZEND_NEW:
+                       case ZEND_FE_RESET:
+                       case ZEND_FE_FETCH:
                                opline->op2.jmp_addr = &op_array->opcodes[opline->op2.opline_num];
                                break;
                        case ZEND_RETURN:
index 6bf4c7c6290efb1a578fa7bef341d25c5afce84e..86fcb44c3461e4908d353209827983698bdd406b 100644 (file)
@@ -3523,7 +3523,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, ANY, ANY)
                } else {
                        zval_ptr_dtor(&object_zval);
                }
-               ZEND_VM_JMP(EX(op_array)->opcodes + opline->op2.opline_num);
+               ZEND_VM_JMP(opline->op2.jmp_addr);
        } else {
                call_slot *call = EX(call_slots) + opline->extended_value;
 
@@ -4290,7 +4290,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                        if(Z_OBJ_HT_P(array_ptr)->get_class_entry == NULL) {
                                zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
-                               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                               ZEND_VM_JMP(opline->op2.jmp_addr);
                        }
 
                        ce = Z_OBJCE_P(array_ptr);
@@ -4430,7 +4430,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                FREE_OP1_VAR_PTR();
        }
        if (is_empty) {
-               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+               ZEND_VM_JMP(opline->op2.jmp_addr);
        } else {
                CHECK_EXCEPTION();
                ZEND_VM_NEXT_OPCODE();
@@ -4465,7 +4465,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
                default:
                case ZEND_ITER_INVALID:
                        zend_error(E_WARNING, "Invalid argument supplied for foreach()");
-                       ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                       ZEND_VM_JMP(opline->op2.jmp_addr);
 
                case ZEND_ITER_PLAIN_OBJECT: {
                        zend_object *zobj = Z_OBJ_P(array);
@@ -4478,7 +4478,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
                        while (1) {
                                if ((value = zend_hash_get_current_data(fe_ht)) == NULL) {
                                        /* reached end of iteration */
-                                       ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                                       ZEND_VM_JMP(opline->op2.jmp_addr);
                                }
 
                                if (Z_TYPE_P(value) == IS_INDIRECT) {
@@ -4520,7 +4520,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
                        zend_hash_set_pointer(fe_ht, (HashPointer*)EX_VAR((opline+1)->op1.var));
                        if ((value = zend_hash_get_current_data(fe_ht)) == NULL) {
                                /* reached end of iteration */
-                               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                               ZEND_VM_JMP(opline->op2.jmp_addr);
                        }
                        if (key) {
                                zend_hash_get_current_key_zval(fe_ht, key);
@@ -4547,7 +4547,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
                                        zval_ptr_dtor(array_ref);
                                        HANDLE_EXCEPTION();
                                }
-                               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                               ZEND_VM_JMP(opline->op2.jmp_addr);
                        }
                        value = iter->funcs->get_current_data(iter TSRMLS_CC);
                        if (UNEXPECTED(EG(exception) != NULL)) {
@@ -4556,7 +4556,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
                        }
                        if (!value) {
                                /* failure in get_current_data */
-                               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                               ZEND_VM_JMP(opline->op2.jmp_addr);
                        }
                        if (key) {
                                if (iter->funcs->get_current_key) {
index d979ce4d816028b6119bfbfef6388c483e47df4c..7961f10adfbd9d858bea9e14a066071e2ac4c99d 100644 (file)
@@ -988,7 +988,7 @@ static int ZEND_FASTCALL  ZEND_NEW_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                } else {
                        zval_ptr_dtor(&object_zval);
                }
-               ZEND_VM_JMP(EX(op_array)->opcodes + opline->op2.opline_num);
+               ZEND_VM_JMP(opline->op2.jmp_addr);
        } else {
                call_slot *call = EX(call_slots) + opline->extended_value;
 
@@ -3061,7 +3061,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                        if(Z_OBJ_HT_P(array_ptr)->get_class_entry == NULL) {
                                zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
-                               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                               ZEND_VM_JMP(opline->op2.jmp_addr);
                        }
 
                        ce = Z_OBJCE_P(array_ptr);
@@ -3201,7 +3201,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
 
        }
        if (is_empty) {
-               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+               ZEND_VM_JMP(opline->op2.jmp_addr);
        } else {
                CHECK_EXCEPTION();
                ZEND_VM_NEXT_OPCODE();
@@ -8251,7 +8251,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                        if(Z_OBJ_HT_P(array_ptr)->get_class_entry == NULL) {
                                zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
-                               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                               ZEND_VM_JMP(opline->op2.jmp_addr);
                        }
 
                        ce = Z_OBJCE_P(array_ptr);
@@ -8391,7 +8391,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
        }
        if (is_empty) {
-               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+               ZEND_VM_JMP(opline->op2.jmp_addr);
        } else {
                CHECK_EXCEPTION();
                ZEND_VM_NEXT_OPCODE();
@@ -13502,7 +13502,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                        if(Z_OBJ_HT_P(array_ptr)->get_class_entry == NULL) {
                                zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
-                               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                               ZEND_VM_JMP(opline->op2.jmp_addr);
                        }
 
                        ce = Z_OBJCE_P(array_ptr);
@@ -13642,7 +13642,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
        }
        if (is_empty) {
-               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+               ZEND_VM_JMP(opline->op2.jmp_addr);
        } else {
                CHECK_EXCEPTION();
                ZEND_VM_NEXT_OPCODE();
@@ -13677,7 +13677,7 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                default:
                case ZEND_ITER_INVALID:
                        zend_error(E_WARNING, "Invalid argument supplied for foreach()");
-                       ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                       ZEND_VM_JMP(opline->op2.jmp_addr);
 
                case ZEND_ITER_PLAIN_OBJECT: {
                        zend_object *zobj = Z_OBJ_P(array);
@@ -13690,7 +13690,7 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                        while (1) {
                                if ((value = zend_hash_get_current_data(fe_ht)) == NULL) {
                                        /* reached end of iteration */
-                                       ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                                       ZEND_VM_JMP(opline->op2.jmp_addr);
                                }
 
                                if (Z_TYPE_P(value) == IS_INDIRECT) {
@@ -13732,7 +13732,7 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                        zend_hash_set_pointer(fe_ht, (HashPointer*)EX_VAR((opline+1)->op1.var));
                        if ((value = zend_hash_get_current_data(fe_ht)) == NULL) {
                                /* reached end of iteration */
-                               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                               ZEND_VM_JMP(opline->op2.jmp_addr);
                        }
                        if (key) {
                                zend_hash_get_current_key_zval(fe_ht, key);
@@ -13759,7 +13759,7 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                        zval_ptr_dtor(array_ref);
                                        HANDLE_EXCEPTION();
                                }
-                               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                               ZEND_VM_JMP(opline->op2.jmp_addr);
                        }
                        value = iter->funcs->get_current_data(iter TSRMLS_CC);
                        if (UNEXPECTED(EG(exception) != NULL)) {
@@ -13768,7 +13768,7 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                        }
                        if (!value) {
                                /* failure in get_current_data */
-                               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                               ZEND_VM_JMP(opline->op2.jmp_addr);
                        }
                        if (key) {
                                if (iter->funcs->get_current_key) {
@@ -30723,7 +30723,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                        if(Z_OBJ_HT_P(array_ptr)->get_class_entry == NULL) {
                                zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
-                               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+                               ZEND_VM_JMP(opline->op2.jmp_addr);
                        }
 
                        ce = Z_OBJCE_P(array_ptr);
@@ -30863,7 +30863,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
 
        }
        if (is_empty) {
-               ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
+               ZEND_VM_JMP(opline->op2.jmp_addr);
        } else {
                CHECK_EXCEPTION();
                ZEND_VM_NEXT_OPCODE();
index 657a3f4b52a76eddf8256a67b8e729ca92560b97..029f0846dd5d018fecf7f3f6f2d7248f507e2d86 100644 (file)
@@ -533,6 +533,9 @@ static void zend_accel_optimize(zend_op_array           *op_array,
 #if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
                        case ZEND_JMP_SET_VAR:
 #endif
+                       case ZEND_NEW:
+                       case ZEND_FE_RESET:
+                       case ZEND_FE_FETCH:
                                ZEND_OP2(opline).opline_num = ZEND_OP2(opline).jmp_addr - op_array->opcodes;
                                break;
                }
@@ -578,6 +581,9 @@ static void zend_accel_optimize(zend_op_array           *op_array,
 #if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
                        case ZEND_JMP_SET_VAR:
 #endif
+                       case ZEND_NEW:
+                       case ZEND_FE_RESET:
+                       case ZEND_FE_FETCH:
                                ZEND_OP2(opline).jmp_addr = &op_array->opcodes[ZEND_OP2(opline).opline_num];
                                break;
                }
index ccdde640e1b61ad66c10c23255000a763ea325d2..bc88df69cf299df2025fed2ebdec03664dc64fdd 100644 (file)
@@ -437,6 +437,9 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
 #if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
                                        case ZEND_JMP_SET_VAR:
 #endif
+                                       case ZEND_NEW:
+                                       case ZEND_FE_RESET:
+                                       case ZEND_FE_FETCH:
                                                ZEND_OP2(opline).jmp_addr = &new_opcodes[ZEND_OP2(opline).jmp_addr - op_array->opcodes];
                                                break;
                                }