From: Dmitry Stogov Date: Tue, 4 Jul 2017 07:43:34 +0000 (+0300) Subject: Compile/optimisation-time constants can't be circular, but in general may be referenc... X-Git-Tag: php-7.2.0alpha3~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=10dbc0b2e79a5e3c36a0cb681c8db2c529e8f6f8;p=php Compile/optimisation-time constants can't be circular, but in general may be reference-countable. It's better to use zval_ptr_dtor_nogc() to release them. --- diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index b535d0760c..0340eb7a11 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -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); diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index bb0a768989..0b98da054d 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -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); diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 46fa4710af..966b472fdb 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -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); diff --git a/ext/opcache/Optimizer/zend_optimizer_internal.h b/ext/opcache/Optimizer/zend_optimizer_internal.h index a1876646b3..39bf62d1a4 100644 --- a/ext/opcache/Optimizer/zend_optimizer_internal.h +++ b/ext/opcache/Optimizer/zend_optimizer_internal.h @@ -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)