@@ -163,7 +163,7 @@ static inline zend_class_entry *get_class_entry(const zend_script *script, zend_
163
163
}
164
164
/* }}} */
165
165
166
- static int is_allocation_def (zend_op_array * op_array , zend_ssa * ssa , int def , int var ) /* {{{ */
166
+ static int is_allocation_def (zend_op_array * op_array , zend_ssa * ssa , int def , int var , const zend_script * script ) /* {{{ */
167
167
{
168
168
zend_ssa_op * op = ssa -> ops + def ;
169
169
zend_op * opline = op_array -> opcodes + def ;
@@ -175,9 +175,10 @@ static int is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, in
175
175
case ZEND_NEW :
176
176
/* objects with destructors should escape */
177
177
if (opline -> op1_type == IS_CONST ) {
178
- zend_class_entry * ce = get_class_entry (NULL , Z_STR_P (CRT_CONSTANT_EX (op_array , opline -> op1 , ssa -> rt_constants )+ 1 ));
178
+ zend_class_entry * ce = get_class_entry (script , Z_STR_P (CRT_CONSTANT_EX (op_array , opline -> op1 , ssa -> rt_constants )+ 1 ));
179
179
if (ce && !ce -> create_object &&
180
- !ce -> destructor && !ce -> __get && !ce -> __set ) {
180
+ !ce -> destructor && !ce -> __get && !ce -> __set &&
181
+ !(ce -> ce_flags & ZEND_ACC_INHERITED )) {
181
182
return 1 ;
182
183
}
183
184
}
@@ -316,7 +317,7 @@ static int is_escape_use(zend_op_array *op_array, zend_ssa *ssa, int use, int va
316
317
}
317
318
/* }}} */
318
319
319
- int zend_ssa_escape_analysis (zend_op_array * op_array , zend_ssa * ssa ) /* {{{ */
320
+ int zend_ssa_escape_analysis (const zend_script * script , zend_op_array * op_array , zend_ssa * ssa ) /* {{{ */
320
321
{
321
322
zend_ssa_var * ssa_vars = ssa -> vars ;
322
323
int ssa_vars_count = ssa -> vars_count ;
@@ -333,7 +334,7 @@ int zend_ssa_escape_analysis(zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
333
334
has_allocations = 0 ;
334
335
for (i = 0 ; i < ssa_vars_count ; i ++ ) {
335
336
if (ssa_vars [i ].definition >= 0 ) {
336
- if (is_allocation_def (op_array , ssa , ssa_vars [i ].definition , i )) {
337
+ if (is_allocation_def (op_array , ssa , ssa_vars [i ].definition , i , script )) {
337
338
has_allocations = 1 ;
338
339
}
339
340
}
@@ -362,7 +363,7 @@ int zend_ssa_escape_analysis(zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
362
363
} else if (ssa_vars [i ].definition >= 0 ) {
363
364
root = ees [i ];
364
365
if (ssa_vars [root ].escape_state == ESCAPE_STATE_UNKNOWN ) {
365
- if (is_allocation_def (op_array , ssa , ssa_vars [i ].definition , i )) {
366
+ if (is_allocation_def (op_array , ssa , ssa_vars [i ].definition , i , script )) {
366
367
ssa_vars [root ].escape_state = ESCAPE_STATE_NO_ESCAPE ;
367
368
num_non_escaped ++ ;
368
369
} else {
0 commit comments