]> granicus.if.org Git - php/commitdiff
Compile/optimisation-time constants can't be circular, but in general may be referenc...
authorDmitry Stogov <dmitry@zend.com>
Tue, 4 Jul 2017 07:43:34 +0000 (10:43 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 4 Jul 2017 07:43:34 +0000 (10:43 +0300)
ext/opcache/Optimizer/block_pass.c
ext/opcache/Optimizer/compact_literals.c
ext/opcache/Optimizer/zend_optimizer.c
ext/opcache/Optimizer/zend_optimizer_internal.h

index b535d0760c4599b90f51ee8b64481443216bfd82..0340eb7a1193658da7ea0118fd8ed1336a00982e 100644 (file)
@@ -261,7 +261,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
                                        Z_TYPE_INFO(ZEND_OP1_LITERAL(last_op)) = IS_STRING_EX;
                                        memcpy(Z_STRVAL(ZEND_OP1_LITERAL(last_op)) + old_len, Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)));
                                        Z_STRVAL(ZEND_OP1_LITERAL(last_op))[l] = '\0';
-                                       zval_dtor(&ZEND_OP1_LITERAL(opline));
+                                       zval_ptr_dtor_nogc(&ZEND_OP1_LITERAL(opline));
                                        ZVAL_STR(&ZEND_OP1_LITERAL(opline), zend_new_interned_string(Z_STR(ZEND_OP1_LITERAL(last_op))));
                                        ZVAL_NULL(&ZEND_OP1_LITERAL(last_op));
                                        MAKE_NOP(last_op);
index bb0a768989ad5a97b417861b16ec2cb7234cd9f3..0b98da054da389bab9c53178d0cbfd4309aa595e 100644 (file)
@@ -330,7 +330,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
                                use_copy = zend_make_printable_zval(op_array->literals + i, &zv);
                                fprintf(stderr, "Literal %d, val (%d):%s\n", i, Z_STRLEN(zv), Z_STRVAL(zv));
                                if (use_copy) {
-                                       zval_dtor(&zv);
+                                       zval_ptr_dtor_nogc(&zv);
                                }
                        }
                        fflush(stderr);
@@ -345,7 +345,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
                for (i = 0; i < op_array->last_literal; i++) {
                        if (!info[i].flags) {
                                /* unsed literal */
-                               zval_dtor(&op_array->literals[i]);
+                               zval_ptr_dtor_nogc(&op_array->literals[i]);
                                continue;
                        }
                        switch (Z_TYPE(op_array->literals[i])) {
@@ -453,11 +453,11 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
 
                                                zend_string_release(key);
                                                map[i] = Z_LVAL_P(pos);
-                                               zval_dtor(&op_array->literals[i]);
+                                               zval_ptr_dtor_nogc(&op_array->literals[i]);
                                                n = LITERAL_NUM_RELATED(info[i].flags);
                                                while (n > 1) {
                                                        i++;
-                                                       zval_dtor(&op_array->literals[i]);
+                                                       zval_ptr_dtor_nogc(&op_array->literals[i]);
                                                        n--;
                                                }
                                        } else {
@@ -495,7 +495,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
                                                        }
                                                        j++;
                                                } else {
-                                                       zval_dtor(&op_array->literals[i]);
+                                                       zval_ptr_dtor_nogc(&op_array->literals[i]);
                                                }
                                                map[i] = l_empty_arr;
                                                break;
@@ -541,7 +541,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
                                use_copy = zend_make_printable_zval(op_array->literals + i, &zv);
                                fprintf(stderr, "Literal %d, val (%d):%s\n", i, Z_STRLEN(zv), Z_STRVAL(zv));
                                if (use_copy) {
-                                       zval_dtor(&zv);
+                                       zval_ptr_dtor_nogc(&zv);
                                }
                        }
                        fflush(stderr);
index 46fa4710af29f05de7d32cae114fdb115c03339a..966b472fdb1ba9e0adb3aa11efb887d9af1ce812 100644 (file)
@@ -38,7 +38,7 @@
 
 static void zend_optimizer_zval_dtor_wrapper(zval *zvalue)
 {
-       zval_dtor(zvalue);
+       zval_ptr_dtor_nogc(zvalue);
 }
 
 void zend_optimizer_collect_constant(zend_optimizer_ctx *ctx, zval *name, zval* value)
@@ -91,7 +91,7 @@ int zend_optimizer_is_disabled_func(const char *name, size_t len) {
 static inline void drop_leading_backslash(zval *val) {
        if (Z_STRVAL_P(val)[0] == '\\') {
                zend_string *str = zend_string_init(Z_STRVAL_P(val) + 1, Z_STRLEN_P(val) - 1, 0);
-               zval_dtor(val);
+               zval_ptr_dtor_nogc(val);
                ZVAL_STR(val, str);
        }
 }
@@ -107,14 +107,14 @@ static inline void alloc_cache_slots_op2(zend_op_array *op_array, zend_op *oplin
 
 #define REQUIRES_STRING(val) do { \
        if (Z_TYPE_P(val) != IS_STRING) { \
-               zval_dtor(val); \
+               zval_ptr_dtor_nogc(val); \
                return 0; \
        } \
 } while (0)
 
 #define TO_STRING_NOWARN(val) do { \
        if (Z_TYPE_P(val) >= IS_ARRAY) { \
-               zval_dtor(val); \
+               zval_ptr_dtor_nogc(val); \
                return 0; \
        } \
        convert_to_string(val); \
@@ -127,7 +127,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array,
        switch (opline->opcode) {
                case ZEND_FREE:
                        MAKE_NOP(opline);
-                       zval_dtor(val);
+                       zval_ptr_dtor_nogc(val);
                        return 1;
                case ZEND_INIT_STATIC_METHOD_CALL:
                case ZEND_CATCH:
@@ -158,16 +158,16 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array,
                case ZEND_SEPARATE:
                case ZEND_SEND_VAR_NO_REF:
                case ZEND_SEND_VAR_NO_REF_EX:
-                       zval_ptr_dtor(val);
+                       zval_ptr_dtor_nogc(val);
                        return 0;
                case ZEND_VERIFY_RETURN_TYPE:
                        /* This would require a non-local change.
                         * zend_optimizer_replace_by_const() supports this. */
-                       zval_ptr_dtor(val);
+                       zval_ptr_dtor_nogc(val);
                        return 0;
                case ZEND_CASE:
                case ZEND_FETCH_LIST:
-                       zval_ptr_dtor(val);
+                       zval_ptr_dtor_nogc(val);
                        return 0;
                case ZEND_CONCAT:
                case ZEND_FAST_CONCAT:
@@ -198,7 +198,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array,
        switch (opline->opcode) {
                case ZEND_ASSIGN_REF:
                case ZEND_FAST_CALL:
-                       zval_dtor(val);
+                       zval_ptr_dtor_nogc(val);
                        return 0;
                case ZEND_FETCH_CLASS:
                case ZEND_INIT_FCALL_BY_NAME:
@@ -229,14 +229,14 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array,
                case ZEND_INIT_DYNAMIC_CALL:
                        if (Z_TYPE_P(val) == IS_STRING) {
                                if (zend_memrchr(Z_STRVAL_P(val), ':', Z_STRLEN_P(val))) {
-                                       zval_dtor(val);
+                                       zval_ptr_dtor_nogc(val);
                                        return 0;
                                }
 
                                if (zend_optimizer_classify_function(Z_STR_P(val), opline->extended_value)) {
                                        /* Dynamic call to various special functions must stay dynamic,
                                         * otherwise would drop a warning */
-                                       zval_dtor(val);
+                                       zval_ptr_dtor_nogc(val);
                                        return 0;
                                }
 
@@ -309,7 +309,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array,
                        if (Z_TYPE_P(val) == IS_STRING) {
                                zend_ulong index;
                                if (ZEND_HANDLE_NUMERIC(Z_STR_P(val), index)) {
-                                       zval_dtor(val);
+                                       zval_ptr_dtor_nogc(val);
                                        ZVAL_LONG(val, index);
                                }
                        }
@@ -394,7 +394,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
                                case ZEND_ASSIGN_DIM:
                                case ZEND_SEPARATE:
                                case ZEND_RETURN_BY_REF:
-                                       zval_dtor(val);
+                                       zval_ptr_dtor_nogc(val);
                                        return 0;
                                case ZEND_SEND_VAR:
                                        opline->extended_value = 0;
@@ -405,7 +405,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
                                        opline->opcode = ZEND_SEND_VAL_EX;
                                        break;
                                case ZEND_SEND_VAR_NO_REF:
-                                       zval_dtor(val);
+                                       zval_ptr_dtor_nogc(val);
                                        return 0;
                                case ZEND_SEND_VAR_NO_REF_EX:
                                        opline->opcode = ZEND_SEND_VAL;
@@ -440,7 +440,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
 
                                        ZEND_ASSERT(m->opcode == ZEND_FREE && m->op1_type == type && m->op1.var == var);
                                        MAKE_NOP(m);
-                                       zval_dtor(val);
+                                       zval_ptr_dtor_nogc(val);
                                        zend_optimizer_remove_live_range(op_array, var);
                                        return 1;
                                }
@@ -462,7 +462,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
                                        if (!in_switch) {
                                                ZEND_ASSERT(opline->opcode == ZEND_FREE);
                                                MAKE_NOP(opline);
-                                               zval_dtor(val);
+                                               zval_ptr_dtor_nogc(val);
                                                return 1;
                                        }
 
@@ -497,7 +497,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
                                                }
                                                m++;
                                        }
-                                       zval_dtor(val);
+                                       zval_ptr_dtor_nogc(val);
                                        zend_optimizer_remove_live_range(op_array, var);
                                        return 1;
                                }
@@ -507,7 +507,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
                                                || ZEND_TYPE_CODE(ret_info->type) == IS_CALLABLE
                                                || !ZEND_SAME_FAKE_TYPE(ZEND_TYPE_CODE(ret_info->type), Z_TYPE_P(val))
                                                || (op_array->fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
-                                               zval_dtor(val);
+                                               zval_ptr_dtor_nogc(val);
                                                return 0;
                                        }
                                        MAKE_NOP(opline);
index a1876646b3efcd0e898c9acfe7a6a48884d4aebd..39bf62d1a430044e7b7f6962129c0ea9e422a014 100644 (file)
@@ -61,7 +61,7 @@ typedef struct _zend_optimizer_ctx {
        } while (0)
 
 #define literal_dtor(zv) do { \
-               zval_dtor(zv); \
+               zval_ptr_dtor_nogc(zv); \
                ZVAL_NULL(zv); \
        } while (0)