Commit 594dfbe04b3 for php
commit 594dfbe04b3540b4fb354125faddbe35476845eb
Merge: 6903d8c6e90 2a5d6c39160
Author: ndossche <7771979+ndossche@users.noreply.github.com>
Date: Mon Oct 5 20:00:39 2026 +0200
Merge branch 'PHP-8.6'
* PHP-8.6:
Fix SCCP evaluation of isset()/empty() on dimension of non-escaping object
diff --cc Zend/Optimizer/sccp.c
index 48f67a662e4,42dcb4629fa..07de22f8535
--- a/Zend/Optimizer/sccp.c
+++ b/Zend/Optimizer/sccp.c
@@@ -440,23 -435,13 +440,27 @@@ static inline zend_result ct_eval_isset
}
return ct_eval_isset_isempty(result, extended_value, value);
} else if (Z_TYPE_P(op1) == IS_STRING) {
- // TODO
- return FAILURE;
+ zend_long index;
+ if (zval_to_string_offset(&index, op2) == FAILURE) {
+ return FAILURE;
+ }
+
+ if (index < 0) {
+ index += (zend_long) Z_STRLEN_P(op1);
+ }
+
+ bool rv = index >= 0 && index < Z_STRLEN_P(op1);
+ if (extended_value & ZEND_ISEMPTY) {
+ rv = !rv || Z_STRVAL_P(op1)[index] == '0';
+ }
+
+ ZVAL_BOOL(result, rv);
+ return SUCCESS;
+ } else if (IS_PARTIAL_OBJECT(op1)) {
+ /* Objects may implement ArrayAccess or throw. */
+ return FAILURE;
} else {
+ ZEND_ASSERT(Z_TYPE_P(op1) <= IS_DOUBLE);
ZVAL_BOOL(result, (extended_value & ZEND_ISEMPTY));
return SUCCESS;
}