From b06311cb3d927d2f7660e39ce14acde92526998c Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Wed, 24 Jan 2024 16:35:00 +0100 Subject: [PATCH] Improve ZEND_NEW RC inference ZEND_NEW returns RC1 if the instanciated class has no constructor. Closes GH-13239 --- Zend/Optimizer/zend_inference.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 083474559a6..02b34c0ab7e 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -3376,9 +3376,19 @@ static zend_always_inline zend_result _zend_update_type_info( UPDATE_SSA_OBJ_TYPE(ce, 0, ssa_op->result_def); } else if ((t1 & MAY_BE_CLASS) && ssa_op->op1_use >= 0 && ssa_var_info[ssa_op->op1_use].ce) { 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); + if (!ssa_var_info[ssa_op->result_def].is_instanceof) { + ce = ssa_var_info[ssa_op->op1_use].ce; + } } else { UPDATE_SSA_OBJ_TYPE(NULL, 0, ssa_op->result_def); } + /* New objects without constructors cannot escape. */ + if (ce + && !ce->constructor + && !ce->create_object + && ce->default_object_handlers->get_constructor == zend_std_get_constructor) { + tmp &= ~MAY_BE_RCN; + } UPDATE_SSA_TYPE(tmp, ssa_op->result_def); break; case ZEND_CLONE: