Commit e758d885b24 for php.net
commit e758d885b24ed3b276babe51db6c9ea7332198f2
Author: Tim Düsterhus <tim@bastelstu.be>
Date: Mon Jul 6 22:50:17 2026 +0200
zend_types: Remove `Z_*CONSTANT_*()` (#22295)
This macro is very rarely used and badly named by neither including the `IS`
nor the `AST` in its name.
diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS
index a8eb6b80541..adfc91880f2 100644
--- a/UPGRADING.INTERNALS
+++ b/UPGRADING.INTERNALS
@@ -120,6 +120,9 @@ PHP 8.6 INTERNALS UPGRADE NOTES
. Added ZEND_CONTAINER_OF().
. The OPENBASEDIR_CHECKPATH() compatibility macro has been removed, instead
use php_check_open_basedir() directly.
+ . The Z_CONSTANT(), Z_CONSTANT_P(), Z_OPT_CONSTANT(), and
+ Z_OPT_CONSTANT_P() macros have been removed. Check for IS_CONSTANT_AST
+ directly.
. Added zend_reflection_property_set_raw_value_without_lazy_initialization(),
zend_reflection_property_set_raw_value() to expose the functionality of
ReflectionProperty::setRawValueWithoutLazyInitialization() and
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index d9fa3a1cb50..b73e2009075 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -9224,7 +9224,7 @@ static void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t f
if (*value_ast_ptr) {
zend_const_expr_to_zval(&value_zv, value_ast_ptr, /* allow_dynamic */ false);
- if (ZEND_TYPE_IS_SET(type) && !Z_CONSTANT(value_zv)
+ if (ZEND_TYPE_IS_SET(type) && Z_TYPE(value_zv) != IS_CONSTANT_AST
&& !zend_is_valid_default_value(type, &value_zv)) {
zend_string *str = zend_type_to_string(type);
if (Z_TYPE(value_zv) == IS_NULL && !ZEND_TYPE_IS_INTERSECTION(type)) {
@@ -9348,7 +9348,7 @@ static void zend_compile_class_const_decl(zend_ast *ast, uint32_t flags, zend_as
zend_const_expr_to_zval(&value_zv, value_ast_ptr, /* allow_dynamic */ false);
- if (!Z_CONSTANT(value_zv) && ZEND_TYPE_IS_SET(type) && !zend_is_valid_default_value(type, &value_zv)) {
+ if (Z_TYPE(value_zv) != IS_CONSTANT_AST && ZEND_TYPE_IS_SET(type) && !zend_is_valid_default_value(type, &value_zv)) {
zend_string *type_str = zend_type_to_string(type);
zend_error_noreturn(E_COMPILE_ERROR, "Cannot use %s as value for class constant %s::%s of type %s",
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y
index d35853ab5ac..47b05de4e69 100644
--- a/Zend/zend_ini_parser.y
+++ b/Zend/zend_ini_parser.y
@@ -151,7 +151,7 @@ static void zend_ini_get_constant(zval *result, zval *name)
&& (c = zend_get_constant(Z_STR_P(name))) != 0) {
if (Z_TYPE_P(c) != IS_STRING) {
ZVAL_COPY_OR_DUP(&tmp, c);
- if (Z_OPT_CONSTANT(tmp)) {
+ if (Z_OPT_TYPE(tmp) == IS_CONSTANT_AST) {
zval_update_constant_ex(&tmp, NULL);
}
convert_to_string(&tmp);
diff --git a/Zend/zend_types.h b/Zend/zend_types.h
index 2cdfdcb1961..56774e4e9d8 100644
--- a/Zend/zend_types.h
+++ b/Zend/zend_types.h
@@ -1017,8 +1017,6 @@ static zend_always_inline uint32_t zend_gc_delref_ex(zend_refcounted_h *p, uint3
} while(0)
/* All data types < IS_STRING have their constructor/destructors skipped */
-#define Z_CONSTANT(zval) (Z_TYPE(zval) == IS_CONSTANT_AST)
-#define Z_CONSTANT_P(zval_p) Z_CONSTANT(*(zval_p))
#if 1
/* This optimized version assumes that we have a single "type_flag" */
@@ -1036,9 +1034,6 @@ static zend_always_inline uint32_t zend_gc_delref_ex(zend_refcounted_h *p, uint3
#define Z_OPT_TYPE(zval) (Z_TYPE_INFO(zval) & Z_TYPE_MASK)
#define Z_OPT_TYPE_P(zval_p) Z_OPT_TYPE(*(zval_p))
-#define Z_OPT_CONSTANT(zval) (Z_OPT_TYPE(zval) == IS_CONSTANT_AST)
-#define Z_OPT_CONSTANT_P(zval_p) Z_OPT_CONSTANT(*(zval_p))
-
#define Z_OPT_REFCOUNTED(zval) Z_TYPE_INFO_REFCOUNTED(Z_TYPE_INFO(zval))
#define Z_OPT_REFCOUNTED_P(zval_p) Z_OPT_REFCOUNTED(*(zval_p))
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index a0bfad488f8..ec9a97eeb25 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -8323,7 +8323,7 @@ ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST)
val = GET_OP2_ZVAL_PTR(BP_VAR_R);
ZVAL_COPY(&c.value, val);
- if (Z_OPT_CONSTANT(c.value)) {
+ if (Z_OPT_TYPE(c.value) == IS_CONSTANT_AST) {
if (UNEXPECTED(zval_update_constant_ex(&c.value, EX(func)->op_array.scope) != SUCCESS)) {
zval_ptr_dtor_nogc(&c.value);
FREE_OP1();
@@ -8355,7 +8355,7 @@ ZEND_VM_HANDLER(210, ZEND_DECLARE_ATTRIBUTED_CONST, CONST, CONST)
val = GET_OP2_ZVAL_PTR(BP_VAR_R);
ZVAL_COPY(&c.value, val);
- if (Z_OPT_CONSTANT(c.value)) {
+ if (Z_OPT_TYPE(c.value) == IS_CONSTANT_AST) {
if (UNEXPECTED(zval_update_constant_ex(&c.value, EX(func)->op_array.scope) != SUCCESS)) {
zval_ptr_dtor_nogc(&c.value);
FREE_OP1();
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index cedc735bbb1..34b2455ce43 100644
Binary files a/Zend/zend_vm_execute.h and b/Zend/zend_vm_execute.h differ
diff --git a/ext/opcache/jit/zend_jit_ir.c b/ext/opcache/jit/zend_jit_ir.c
index d62ef95b551..b0b04456706 100644
--- a/ext/opcache/jit/zend_jit_ir.c
+++ b/ext/opcache/jit/zend_jit_ir.c
@@ -10924,7 +10924,7 @@ static int zend_jit_recv_init(zend_jit_ctx *jit, const zend_op *opline, const ze
zv, true);
}
- if (Z_CONSTANT_P(zv)) {
+ if (Z_TYPE_P(zv) == IS_CONSTANT_AST) {
jit_SET_EX_OPLINE(jit, opline);
ref = ir_CALL_2(IR_I32, ir_CONST_FC_FUNC(zval_update_constant_ex),
jit_ZVAL_ADDR(jit, res_addr),