Skip to content

Commit e788202

Browse files
committed
Improve ZEND_NEW RC inference
ZEND_NEW returns RC1 if the instanciated class has no constructor.
1 parent ea3c541 commit e788202

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

Zend/Optimizer/zend_inference.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3369,8 +3369,17 @@ static zend_always_inline zend_result _zend_update_type_info(
33693369
ce = zend_optimizer_get_class_entry_from_op1(script, op_array, opline);
33703370
if (ce) {
33713371
UPDATE_SSA_OBJ_TYPE(ce, 0, ssa_op->result_def);
3372+
/* New objects without constructors cannot escape. */
3373+
if (!ce->constructor) {
3374+
tmp &= ~MAY_BE_RCN;
3375+
}
33723376
} else if ((t1 & MAY_BE_CLASS) && ssa_op->op1_use >= 0 && ssa_var_info[ssa_op->op1_use].ce) {
33733377
UPDATE_SSA_OBJ_TYPE(ssa_var_info[ssa_op->op1_use].ce, ssa_var_info[ssa_op->op1_use].is_instanceof, ssa_op->result_def);
3378+
/* New objects without constructors cannot escape. */
3379+
if (!ssa_var_info[ssa_op->result_def].is_instanceof
3380+
&& !ssa_var_info[ssa_op->result_def].ce->constructor) {
3381+
tmp &= ~MAY_BE_RCN;
3382+
}
33743383
} else {
33753384
UPDATE_SSA_OBJ_TYPE(NULL, 0, ssa_op->result_def);
33763385
}

0 commit comments

Comments
 (0)