From 68b9acdc7706f0f809c2063229a490930d18dd64 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Mon, 2 Nov 2026 16:49:02 +0100 Subject: [PATCH 1/3] Remove redundant check in DECLARE_LAMBDA_FUNCTION handler When `Z_TYPE(EX(This)) == IS_OBJECT`, EX(func) is always non-static. --- Zend/zend_vm_def.h | 5 ++--- Zend/zend_vm_execute.h | 10 ++++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 1e3d9984832d..7d6118b2aacb 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8440,9 +8440,8 @@ ZEND_VM_HANDLER(142, ZEND_DECLARE_LAMBDA_FUNCTION, UNUSED, NUM, NUM|CACHE_SLOT) } func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num]; - if (Z_TYPE(EX(This)) == IS_OBJECT - && EXPECTED(!(func->common.fn_flags & ZEND_ACC_STATIC)) - && EXPECTED(!(EX(func)->common.fn_flags & ZEND_ACC_STATIC))) { + if (Z_TYPE(EX(This)) == IS_OBJECT && EXPECTED(!(func->common.fn_flags & ZEND_ACC_STATIC))) { + ZEND_ASSERT(!(EX(func)->common.fn_flags & ZEND_ACC_STATIC)); object = Z_OBJ(EX(This)); } else { object = NULL; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index b1d7d3d80823..b3ae092c8434 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -32947,9 +32947,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_DECLARE_LAMBD } func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num]; - if (Z_TYPE(EX(This)) == IS_OBJECT - && EXPECTED(!(func->common.fn_flags & ZEND_ACC_STATIC)) - && EXPECTED(!(EX(func)->common.fn_flags & ZEND_ACC_STATIC))) { + if (Z_TYPE(EX(This)) == IS_OBJECT && EXPECTED(!(func->common.fn_flags & ZEND_ACC_STATIC))) { + ZEND_ASSERT(!(EX(func)->common.fn_flags & ZEND_ACC_STATIC)); object = Z_OBJ(EX(This)); } else { object = NULL; @@ -85619,9 +85618,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DECLARE_LAMBDA_FUN } func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num]; - if (Z_TYPE(EX(This)) == IS_OBJECT - && EXPECTED(!(func->common.fn_flags & ZEND_ACC_STATIC)) - && EXPECTED(!(EX(func)->common.fn_flags & ZEND_ACC_STATIC))) { + if (Z_TYPE(EX(This)) == IS_OBJECT && EXPECTED(!(func->common.fn_flags & ZEND_ACC_STATIC))) { + ZEND_ASSERT(!(EX(func)->common.fn_flags & ZEND_ACC_STATIC)); object = Z_OBJ(EX(This)); } else { object = NULL; From 00d5da367c1bf7c22c41d70098a4a059c987399b Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Mon, 2 Nov 2026 16:51:28 +0100 Subject: [PATCH 2/3] Remove EXPECTED() for static closure Declaring static closures from non-static functions is not rare. --- Zend/zend_vm_def.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7d6118b2aacb..3159bfaa59ca 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8440,7 +8440,7 @@ ZEND_VM_HANDLER(142, ZEND_DECLARE_LAMBDA_FUNCTION, UNUSED, NUM, NUM|CACHE_SLOT) } func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num]; - if (Z_TYPE(EX(This)) == IS_OBJECT && EXPECTED(!(func->common.fn_flags & ZEND_ACC_STATIC))) { + if (Z_TYPE(EX(This)) == IS_OBJECT && !(func->common.fn_flags & ZEND_ACC_STATIC)) { ZEND_ASSERT(!(EX(func)->common.fn_flags & ZEND_ACC_STATIC)); object = Z_OBJ(EX(This)); } else { From ca6aee3ed5a6e2859ad48aa65b51c6d56e590970 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Mon, 2 Nov 2026 19:35:23 +0100 Subject: [PATCH 3/3] Fix stale Zend/zend_vm_execute.h file --- Zend/zend_vm_execute.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index b3ae092c8434..e814db080bff 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -32947,7 +32947,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_DECLARE_LAMBD } func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num]; - if (Z_TYPE(EX(This)) == IS_OBJECT && EXPECTED(!(func->common.fn_flags & ZEND_ACC_STATIC))) { + if (Z_TYPE(EX(This)) == IS_OBJECT && !(func->common.fn_flags & ZEND_ACC_STATIC)) { ZEND_ASSERT(!(EX(func)->common.fn_flags & ZEND_ACC_STATIC)); object = Z_OBJ(EX(This)); } else { @@ -85618,7 +85618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DECLARE_LAMBDA_FUN } func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num]; - if (Z_TYPE(EX(This)) == IS_OBJECT && EXPECTED(!(func->common.fn_flags & ZEND_ACC_STATIC))) { + if (Z_TYPE(EX(This)) == IS_OBJECT && !(func->common.fn_flags & ZEND_ACC_STATIC)) { ZEND_ASSERT(!(EX(func)->common.fn_flags & ZEND_ACC_STATIC)); object = Z_OBJ(EX(This)); } else {