Skip to content

Commit 10dbc0b

Browse files
committed
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.
1 parent b685991 commit 10dbc0b

File tree

4 files changed

+26
-26
lines changed

4 files changed

+26
-26
lines changed

ext/opcache/Optimizer/block_pass.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
261261
Z_TYPE_INFO(ZEND_OP1_LITERAL(last_op)) = IS_STRING_EX;
262262
memcpy(Z_STRVAL(ZEND_OP1_LITERAL(last_op)) + old_len, Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)));
263263
Z_STRVAL(ZEND_OP1_LITERAL(last_op))[l] = '\0';
264-
zval_dtor(&ZEND_OP1_LITERAL(opline));
264+
zval_ptr_dtor_nogc(&ZEND_OP1_LITERAL(opline));
265265
ZVAL_STR(&ZEND_OP1_LITERAL(opline), zend_new_interned_string(Z_STR(ZEND_OP1_LITERAL(last_op))));
266266
ZVAL_NULL(&ZEND_OP1_LITERAL(last_op));
267267
MAKE_NOP(last_op);

ext/opcache/Optimizer/compact_literals.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
330330
use_copy = zend_make_printable_zval(op_array->literals + i, &zv);
331331
fprintf(stderr, "Literal %d, val (%d):%s\n", i, Z_STRLEN(zv), Z_STRVAL(zv));
332332
if (use_copy) {
333-
zval_dtor(&zv);
333+
zval_ptr_dtor_nogc(&zv);
334334
}
335335
}
336336
fflush(stderr);
@@ -345,7 +345,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
345345
for (i = 0; i < op_array->last_literal; i++) {
346346
if (!info[i].flags) {
347347
/* unsed literal */
348-
zval_dtor(&op_array->literals[i]);
348+
zval_ptr_dtor_nogc(&op_array->literals[i]);
349349
continue;
350350
}
351351
switch (Z_TYPE(op_array->literals[i])) {
@@ -453,11 +453,11 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
453453

454454
zend_string_release(key);
455455
map[i] = Z_LVAL_P(pos);
456-
zval_dtor(&op_array->literals[i]);
456+
zval_ptr_dtor_nogc(&op_array->literals[i]);
457457
n = LITERAL_NUM_RELATED(info[i].flags);
458458
while (n > 1) {
459459
i++;
460-
zval_dtor(&op_array->literals[i]);
460+
zval_ptr_dtor_nogc(&op_array->literals[i]);
461461
n--;
462462
}
463463
} else {
@@ -495,7 +495,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
495495
}
496496
j++;
497497
} else {
498-
zval_dtor(&op_array->literals[i]);
498+
zval_ptr_dtor_nogc(&op_array->literals[i]);
499499
}
500500
map[i] = l_empty_arr;
501501
break;
@@ -541,7 +541,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
541541
use_copy = zend_make_printable_zval(op_array->literals + i, &zv);
542542
fprintf(stderr, "Literal %d, val (%d):%s\n", i, Z_STRLEN(zv), Z_STRVAL(zv));
543543
if (use_copy) {
544-
zval_dtor(&zv);
544+
zval_ptr_dtor_nogc(&zv);
545545
}
546546
}
547547
fflush(stderr);

ext/opcache/Optimizer/zend_optimizer.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
static void zend_optimizer_zval_dtor_wrapper(zval *zvalue)
4040
{
41-
zval_dtor(zvalue);
41+
zval_ptr_dtor_nogc(zvalue);
4242
}
4343

4444
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) {
9191
static inline void drop_leading_backslash(zval *val) {
9292
if (Z_STRVAL_P(val)[0] == '\\') {
9393
zend_string *str = zend_string_init(Z_STRVAL_P(val) + 1, Z_STRLEN_P(val) - 1, 0);
94-
zval_dtor(val);
94+
zval_ptr_dtor_nogc(val);
9595
ZVAL_STR(val, str);
9696
}
9797
}
@@ -107,14 +107,14 @@ static inline void alloc_cache_slots_op2(zend_op_array *op_array, zend_op *oplin
107107

108108
#define REQUIRES_STRING(val) do { \
109109
if (Z_TYPE_P(val) != IS_STRING) { \
110-
zval_dtor(val); \
110+
zval_ptr_dtor_nogc(val); \
111111
return 0; \
112112
} \
113113
} while (0)
114114

115115
#define TO_STRING_NOWARN(val) do { \
116116
if (Z_TYPE_P(val) >= IS_ARRAY) { \
117-
zval_dtor(val); \
117+
zval_ptr_dtor_nogc(val); \
118118
return 0; \
119119
} \
120120
convert_to_string(val); \
@@ -127,7 +127,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array,
127127
switch (opline->opcode) {
128128
case ZEND_FREE:
129129
MAKE_NOP(opline);
130-
zval_dtor(val);
130+
zval_ptr_dtor_nogc(val);
131131
return 1;
132132
case ZEND_INIT_STATIC_METHOD_CALL:
133133
case ZEND_CATCH:
@@ -158,16 +158,16 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array,
158158
case ZEND_SEPARATE:
159159
case ZEND_SEND_VAR_NO_REF:
160160
case ZEND_SEND_VAR_NO_REF_EX:
161-
zval_ptr_dtor(val);
161+
zval_ptr_dtor_nogc(val);
162162
return 0;
163163
case ZEND_VERIFY_RETURN_TYPE:
164164
/* This would require a non-local change.
165165
* zend_optimizer_replace_by_const() supports this. */
166-
zval_ptr_dtor(val);
166+
zval_ptr_dtor_nogc(val);
167167
return 0;
168168
case ZEND_CASE:
169169
case ZEND_FETCH_LIST:
170-
zval_ptr_dtor(val);
170+
zval_ptr_dtor_nogc(val);
171171
return 0;
172172
case ZEND_CONCAT:
173173
case ZEND_FAST_CONCAT:
@@ -198,7 +198,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array,
198198
switch (opline->opcode) {
199199
case ZEND_ASSIGN_REF:
200200
case ZEND_FAST_CALL:
201-
zval_dtor(val);
201+
zval_ptr_dtor_nogc(val);
202202
return 0;
203203
case ZEND_FETCH_CLASS:
204204
case ZEND_INIT_FCALL_BY_NAME:
@@ -229,14 +229,14 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array,
229229
case ZEND_INIT_DYNAMIC_CALL:
230230
if (Z_TYPE_P(val) == IS_STRING) {
231231
if (zend_memrchr(Z_STRVAL_P(val), ':', Z_STRLEN_P(val))) {
232-
zval_dtor(val);
232+
zval_ptr_dtor_nogc(val);
233233
return 0;
234234
}
235235

236236
if (zend_optimizer_classify_function(Z_STR_P(val), opline->extended_value)) {
237237
/* Dynamic call to various special functions must stay dynamic,
238238
* otherwise would drop a warning */
239-
zval_dtor(val);
239+
zval_ptr_dtor_nogc(val);
240240
return 0;
241241
}
242242

@@ -309,7 +309,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array,
309309
if (Z_TYPE_P(val) == IS_STRING) {
310310
zend_ulong index;
311311
if (ZEND_HANDLE_NUMERIC(Z_STR_P(val), index)) {
312-
zval_dtor(val);
312+
zval_ptr_dtor_nogc(val);
313313
ZVAL_LONG(val, index);
314314
}
315315
}
@@ -394,7 +394,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
394394
case ZEND_ASSIGN_DIM:
395395
case ZEND_SEPARATE:
396396
case ZEND_RETURN_BY_REF:
397-
zval_dtor(val);
397+
zval_ptr_dtor_nogc(val);
398398
return 0;
399399
case ZEND_SEND_VAR:
400400
opline->extended_value = 0;
@@ -405,7 +405,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
405405
opline->opcode = ZEND_SEND_VAL_EX;
406406
break;
407407
case ZEND_SEND_VAR_NO_REF:
408-
zval_dtor(val);
408+
zval_ptr_dtor_nogc(val);
409409
return 0;
410410
case ZEND_SEND_VAR_NO_REF_EX:
411411
opline->opcode = ZEND_SEND_VAL;
@@ -440,7 +440,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
440440

441441
ZEND_ASSERT(m->opcode == ZEND_FREE && m->op1_type == type && m->op1.var == var);
442442
MAKE_NOP(m);
443-
zval_dtor(val);
443+
zval_ptr_dtor_nogc(val);
444444
zend_optimizer_remove_live_range(op_array, var);
445445
return 1;
446446
}
@@ -462,7 +462,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
462462
if (!in_switch) {
463463
ZEND_ASSERT(opline->opcode == ZEND_FREE);
464464
MAKE_NOP(opline);
465-
zval_dtor(val);
465+
zval_ptr_dtor_nogc(val);
466466
return 1;
467467
}
468468

@@ -497,7 +497,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
497497
}
498498
m++;
499499
}
500-
zval_dtor(val);
500+
zval_ptr_dtor_nogc(val);
501501
zend_optimizer_remove_live_range(op_array, var);
502502
return 1;
503503
}
@@ -507,7 +507,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
507507
|| ZEND_TYPE_CODE(ret_info->type) == IS_CALLABLE
508508
|| !ZEND_SAME_FAKE_TYPE(ZEND_TYPE_CODE(ret_info->type), Z_TYPE_P(val))
509509
|| (op_array->fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
510-
zval_dtor(val);
510+
zval_ptr_dtor_nogc(val);
511511
return 0;
512512
}
513513
MAKE_NOP(opline);

ext/opcache/Optimizer/zend_optimizer_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ typedef struct _zend_optimizer_ctx {
6161
} while (0)
6262

6363
#define literal_dtor(zv) do { \
64-
zval_dtor(zv); \
64+
zval_ptr_dtor_nogc(zv); \
6565
ZVAL_NULL(zv); \
6666
} while (0)
6767

0 commit comments

Comments
 (0)