Skip to content

Commit 5155bf1

Browse files
committed
Check for user defined classes
1 parent 37adfcc commit 5155bf1

File tree

3 files changed

+9
-8
lines changed

3 files changed

+9
-8
lines changed

ext/opcache/Optimizer/dfa_pass.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ int zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx,
107107
return FAILURE;
108108
}
109109

110-
if (zend_ssa_escape_analysis(op_array, ssa) != SUCCESS) {
110+
if (zend_ssa_escape_analysis(ctx->script, op_array, ssa) != SUCCESS) {
111111
return FAILURE;
112112
}
113113

ext/opcache/Optimizer/escape_analysis.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ static inline zend_class_entry *get_class_entry(const zend_script *script, zend_
163163
}
164164
/* }}} */
165165

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) /* {{{ */
167167
{
168168
zend_ssa_op *op = ssa->ops + def;
169169
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
175175
case ZEND_NEW:
176176
/* objects with destructors should escape */
177177
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));
179179
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)) {
181182
return 1;
182183
}
183184
}
@@ -316,7 +317,7 @@ static int is_escape_use(zend_op_array *op_array, zend_ssa *ssa, int use, int va
316317
}
317318
/* }}} */
318319

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) /* {{{ */
320321
{
321322
zend_ssa_var *ssa_vars = ssa->vars;
322323
int ssa_vars_count = ssa->vars_count;
@@ -333,7 +334,7 @@ int zend_ssa_escape_analysis(zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
333334
has_allocations = 0;
334335
for (i = 0; i < ssa_vars_count; i++) {
335336
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)) {
337338
has_allocations = 1;
338339
}
339340
}
@@ -362,7 +363,7 @@ int zend_ssa_escape_analysis(zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
362363
} else if (ssa_vars[i].definition >= 0) {
363364
root = ees[i];
364365
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)) {
366367
ssa_vars[root].escape_state = ESCAPE_STATE_NO_ESCAPE;
367368
num_non_escaped++;
368369
} else {

ext/opcache/Optimizer/zend_optimizer_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,6 @@ void zend_optimizer_shift_jump(zend_op_array *op_array, zend_op *opline, uint32_
114114
zend_uchar zend_compound_assign_to_binary_op(zend_uchar opcode);
115115
int sccp_optimize_op_array(zend_optimizer_ctx *ctx, zend_op_array *op_arrya, zend_ssa *ssa, zend_call_info **call_map);
116116
int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reorder_dtor_effects);
117-
int zend_ssa_escape_analysis(zend_op_array *op_array, zend_ssa *ssa);
117+
int zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa);
118118

119119
#endif

0 commit comments

Comments
 (0)