Commit baf9a0db867 for php
commit baf9a0db8675d2c2375c0c9c8c859056ea92e6c7
Author: Gina Peter Banyard <girgias@php.net>
Date: Wed Sep 30 15:42:41 2026 +0100
Zend: use zend_object* parameter type instead of zval* for closure API (#24015)
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index 9d5971fac47..c7279ea36e7 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -571,9 +571,9 @@ ZEND_API const zend_function *zend_get_closure_method_def(zend_object *obj) /* {
}
/* }}} */
-ZEND_API zend_object* zend_get_closure_this_ptr(zval *obj) /* {{{ */
+ZEND_API zend_object* zend_get_closure_this_ptr(zend_object *closure_zobj) /* {{{ */
{
- zend_closure *closure = (zend_closure *)Z_OBJ_P(obj);
+ zend_closure *closure = (zend_closure *)closure_zobj;
return closure->this_ptr;
}
/* }}} */
@@ -982,17 +982,17 @@ void zend_closure_from_frame(zval *return_value, const zend_execute_data *call)
}
} /* }}} */
-void zend_closure_bind_var(zval *closure_zv, zend_string *var_name, zval *var) /* {{{ */
+void zend_closure_bind_var(zend_object *closure_zobj, zend_string *var_name, zval *var) /* {{{ */
{
- zend_closure *closure = (zend_closure *) Z_OBJ_P(closure_zv);
+ zend_closure *closure = (zend_closure *) closure_zobj;
HashTable *static_variables = ZEND_MAP_PTR_GET(closure->func.op_array.static_variables_ptr);
zend_hash_update(static_variables, var_name, var);
}
/* }}} */
-void zend_closure_bind_var_ex(zval *closure_zv, uint32_t offset, zval *val) /* {{{ */
+void zend_closure_bind_var_ex(zend_object *closure_zobj, uint32_t offset, zval *val) /* {{{ */
{
- zend_closure *closure = (zend_closure *) Z_OBJ_P(closure_zv);
+ zend_closure *closure = (zend_closure *) closure_zobj;
HashTable *static_variables = ZEND_MAP_PTR_GET(closure->func.op_array.static_variables_ptr);
zval *var = (zval*)((char*)static_variables->arData + offset);
zval_ptr_dtor(var);
diff --git a/Zend/zend_closures.h b/Zend/zend_closures.h
index c421c100833..051bffe98eb 100644
--- a/Zend/zend_closures.h
+++ b/Zend/zend_closures.h
@@ -28,8 +28,8 @@ BEGIN_EXTERN_C()
((zend_object*)((char*)(op_array) - sizeof(zend_object)))
void zend_register_closure_ce(void);
-void zend_closure_bind_var(zval *closure_zv, zend_string *var_name, zval *var);
-void zend_closure_bind_var_ex(zval *closure_zv, uint32_t offset, zval *val);
+void zend_closure_bind_var(zend_object *closure_zobj, zend_string *var_name, zval *var);
+void zend_closure_bind_var_ex(zend_object *closure_zobj, uint32_t offset, zval *val);
void zend_closure_from_frame(zval *closure_zv, const zend_execute_data *frame);
extern ZEND_API zend_class_entry *zend_ce_closure;
@@ -39,7 +39,7 @@ ZEND_API void zend_create_fake_closure(zval *res, zend_function *op_array, zend_
ZEND_API void zend_create_partial_closure(zval *res, zend_function *func, zend_class_entry *scope, zend_class_entry *called_scope, zend_object *this_ptr, bool partial_of_closure);
ZEND_API zend_function *zend_get_closure_invoke_method(zend_object *obj);
ZEND_API const zend_function *zend_get_closure_method_def(zend_object *obj);
-ZEND_API zend_object* zend_get_closure_this_ptr(zval *obj);
+ZEND_API zend_object* zend_get_closure_this_ptr(zend_object *closure_zobj);
END_EXTERN_C()
diff --git a/Zend/zend_partial.c b/Zend/zend_partial.c
index e938f53cc3c..fa73560e31a 100644
--- a/Zend/zend_partial.c
+++ b/Zend/zend_partial.c
@@ -1087,7 +1087,7 @@ static void zp_bind(zval *result, zend_function *function, uint32_t argc, zval *
zval var;
ZVAL_OBJ(&var, ZEND_CLOSURE_OBJECT(function));
Z_ADDREF(var);
- zend_closure_bind_var_ex(result, bind_offset, &var);
+ zend_closure_bind_var_ex(Z_OBJ_P(result), bind_offset, &var);
bind_offset += sizeof(Bucket);
}
@@ -1119,7 +1119,7 @@ static void zp_bind(zval *result, zend_function *function, uint32_t argc, zval *
return;
}
ZEND_ASSERT(zp_arg_must_be_sent_by_ref(function, offset+1) ? Z_ISREF_P(var) : !Z_ISREF_P(var));
- zend_closure_bind_var_ex(result, bind_offset, var);
+ zend_closure_bind_var_ex(Z_OBJ_P(result), bind_offset, var);
bind_offset += sizeof(Bucket);
}
@@ -1127,7 +1127,7 @@ static void zp_bind(zval *result, zend_function *function, uint32_t argc, zval *
zval var;
ZVAL_ARR(&var, extra_named_params);
Z_ADDREF(var);
- zend_closure_bind_var_ex(result, bind_offset, &var);
+ zend_closure_bind_var_ex(Z_OBJ_P(result), bind_offset, &var);
}
}
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index d1355208c28..b01d7287c53 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -9248,7 +9248,7 @@ ZEND_VM_HANDLER(182, ZEND_BIND_LEXICAL, TMP, CV, REF)
Z_TRY_ADDREF_P(var);
}
- zend_closure_bind_var_ex(closure,
+ zend_closure_bind_var_ex(Z_OBJ_P(closure),
(opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT)), var);
ZEND_VM_NEXT_OPCODE();
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index fe2df85c23e..352e6d9f692 100644
Binary files a/Zend/zend_vm_execute.h and b/Zend/zend_vm_execute.h differ
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index b1968d9ff11..c140109dae2 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -1779,7 +1779,7 @@ ZEND_METHOD(ReflectionFunctionAbstract, getClosureThis)
GET_REFLECTION_OBJECT();
if (!Z_ISUNDEF(intern->obj)) {
- zend_object *closure_this = zend_get_closure_this_ptr(&intern->obj);
+ zend_object *closure_this = zend_get_closure_this_ptr(Z_OBJ(intern->obj));
if (closure_this) {
RETURN_OBJ_COPY(closure_this);
}