Commit aac7c07c943 for php
commit aac7c07c9432157b1a15a87647c45557207b505c
Merge: 696ac1ab5d6 652980081e9
Author: ndossche <7771979+ndossche@users.noreply.github.com>
Date: Mon Oct 12 19:20:13 2026 +0200
Merge branch 'PHP-8.5' into PHP-8.6
* PHP-8.5:
Fix escape analysis for objects implementing ArrayAccess
diff --cc Zend/Optimizer/escape_analysis.c
index 59e0cea05a7,78e667b97f4..54533d16b69
--- a/Zend/Optimizer/escape_analysis.c
+++ b/Zend/Optimizer/escape_analysis.c
@@@ -269,10 -272,29 +269,29 @@@ static bool is_local_def(const zend_op_
}
/* }}} */
+ /* ArrayAccess methods receive the object, so dimension accesses on it let it escape. */
+ static bool may_be_array_access(const zend_ssa_var_info *info) /* {{{ */
+ {
+ if (!(info->type & MAY_BE_OBJECT)) {
- return 0;
++ return false;
+ }
+
+ const zend_class_entry *ce = info->ce;
+ if (!ce || info->is_instanceof) {
- return 1;
++ return true;
+ }
+ if (ce->ce_flags & ZEND_ACC_LINKED) {
+ return ce->arrayaccess_funcs_ptr != NULL;
+ }
+ /* The interfaces of unlinked classes are not known yet. */
+ return ce->num_interfaces || ce->parent_name;
+ }
+ /* }}} */
+
-static bool is_escape_use(zend_op_array *op_array, zend_ssa *ssa, int use, int var) /* {{{ */
+static bool is_escape_use(const zend_op_array *op_array, const zend_ssa *ssa, int use, int var) /* {{{ */
{
- zend_ssa_op *ssa_op = ssa->ops + use;
- zend_op *opline = op_array->opcodes + use;
+ const zend_ssa_op *ssa_op = ssa->ops + use;
+ const zend_op *opline = op_array->opcodes + use;
if (ssa_op->op1_use == var) {
switch (opline->opcode) {
@@@ -288,18 -310,22 +307,22 @@@
}
break;
case ZEND_ISSET_ISEMPTY_DIM_OBJ:
- case ZEND_ISSET_ISEMPTY_PROP_OBJ:
case ZEND_FETCH_DIM_R:
- case ZEND_FETCH_OBJ_R:
case ZEND_FETCH_DIM_IS:
+ case ZEND_ASSIGN_DIM_OP:
+ case ZEND_ASSIGN_DIM:
+ if (may_be_array_access(&ssa->var_info[ssa_op->op1_use])) {
- return 1;
++ return true;
+ }
+ break;
+ case ZEND_ISSET_ISEMPTY_PROP_OBJ:
+ case ZEND_FETCH_OBJ_R:
case ZEND_FETCH_OBJ_IS:
break;
case ZEND_ASSIGN_OP:
- return 1;
+ return true;
- case ZEND_ASSIGN_DIM_OP:
case ZEND_ASSIGN_OBJ_OP:
case ZEND_ASSIGN_STATIC_PROP_OP:
- case ZEND_ASSIGN_DIM:
case ZEND_ASSIGN_OBJ:
break;
case ZEND_ASSIGN_OBJ_REF: