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: