From 7a5b557dfd6ef95478ede458d8fbd323e1320565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Sat, 13 Jun 2026 16:06:24 +0200 Subject: [PATCH] zend_types: Remove `Z_*CONSTANT_*()` This macro is very rarely used and badly named by neither including the `IS` nor the `AST` in its name. --- UPGRADING.INTERNALS | 3 +++ Zend/zend_compile.c | 4 ++-- Zend/zend_ini_parser.y | 2 +- Zend/zend_types.h | 5 ----- Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 8 ++++---- ext/opcache/jit/zend_jit_ir.c | 2 +- 7 files changed, 13 insertions(+), 15 deletions(-) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index dd4b9840aee3..cdcd608094be 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -110,6 +110,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. ======================== 2. Build system changes diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 105f99d24171..8cd54ff67502 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -9207,7 +9207,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)) { @@ -9331,7 +9331,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 d35853ab5acd..47b05de4e692 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 cfff3b942c4b..faf2694c2501 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -929,8 +929,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { } 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" */ @@ -948,9 +946,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { #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 1de7a7cd4195..f804efbc43dc 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8320,7 +8320,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(); @@ -8352,7 +8352,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 5b52f1941845..5f7c8bcd34c9 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -8290,7 +8290,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_DECLARE_CONST val = RT_CONSTANT(opline, opline->op2); 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); @@ -8325,7 +8325,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_DECLARE_ATTRI val = RT_CONSTANT(opline, opline->op2); 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); @@ -60964,7 +60964,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DECLARE_CONST_SPEC val = RT_CONSTANT(opline, opline->op2); 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); @@ -60999,7 +60999,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DECLARE_ATTRIBUTED val = RT_CONSTANT(opline, opline->op2); 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); diff --git a/ext/opcache/jit/zend_jit_ir.c b/ext/opcache/jit/zend_jit_ir.c index cf43d3ad840f..489e23da9cc0 100644 --- a/ext/opcache/jit/zend_jit_ir.c +++ b/ext/opcache/jit/zend_jit_ir.c @@ -10927,7 +10927,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),