Commit 8149fba295d for php.net
commit 8149fba295d060fafe9b4dfbbeb7099c57e8ce95
Author: Gina Peter Banyard <girgias@php.net>
Date: Thu Aug 13 19:26:16 2026 +0100
com: use zend_object* rather than zval* (#23255)
diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c
index 63fc8f6563b..e0fbb0c1739 100644
--- a/ext/com_dotnet/com_com.c
+++ b/ext/com_dotnet/com_com.c
@@ -670,7 +670,8 @@ PHP_FUNCTION(com_create_guid)
/* {{{ Connect events from a COM object to a PHP object */
PHP_FUNCTION(com_event_sink)
{
- zval *object, *sinkobject;
+ zend_object *object;
+ zend_object *sinkobject;
zend_string *sink_str = NULL;
HashTable *sink_ht = NULL;
zend_string *type_lib_name = NULL;
@@ -679,8 +680,8 @@ PHP_FUNCTION(com_event_sink)
ITypeInfo *typeinfo = NULL;
ZEND_PARSE_PARAMETERS_START(2, 3)
- Z_PARAM_OBJECT_OF_CLASS(object, php_com_variant_class_entry)
- Z_PARAM_OBJECT(sinkobject)
+ Z_PARAM_OBJ_OF_CLASS(object, php_com_variant_class_entry)
+ Z_PARAM_OBJ(sinkobject)
Z_PARAM_OPTIONAL
Z_PARAM_ARRAY_HT_OR_STR_OR_NULL(sink_ht, sink_str)
ZEND_PARSE_PARAMETERS_END();
@@ -688,7 +689,7 @@ PHP_FUNCTION(com_event_sink)
RETVAL_FALSE;
php_com_initialize();
- obj = CDNO_FETCH(object);
+ obj = (php_com_dotnet_object*)object;
if (sink_ht) {
/* 0 => typelibname, 1 => dispname */
diff --git a/ext/com_dotnet/com_variant.c b/ext/com_dotnet/com_variant.c
index 82f17d12d9b..87d33da1daf 100644
--- a/ext/com_dotnet/com_variant.c
+++ b/ext/com_dotnet/com_variant.c
@@ -115,7 +115,7 @@ static void php_com_variant_from_zval_ex(VARIANT *v, zval *z, int codepage, VART
break;
case IS_OBJECT:
- if (php_com_is_valid_object(z)) {
+ if (php_com_is_valid_object(Z_OBJ_P(z))) {
obj = CDNO_FETCH(z);
if (V_VT(&obj->v) == VT_DISPATCH) {
/* pass the underlying object */
@@ -132,7 +132,7 @@ static void php_com_variant_from_zval_ex(VARIANT *v, zval *z, int codepage, VART
} else {
/* export the PHP object using our COM wrapper */
V_VT(v) = VT_DISPATCH;
- V_DISPATCH(v) = php_com_wrapper_export(z);
+ V_DISPATCH(v) = php_com_wrapper_export(Z_OBJ_P(z));
}
break;
diff --git a/ext/com_dotnet/com_wrapper.c b/ext/com_dotnet/com_wrapper.c
index 175a2de3307..a040c0a84ab 100644
--- a/ext/com_dotnet/com_wrapper.c
+++ b/ext/com_dotnet/com_wrapper.c
@@ -499,11 +499,11 @@ static void generate_dispids(php_dispatchex *disp)
}
}
-static php_dispatchex *disp_constructor(zval *object)
+static php_dispatchex *disp_constructor(zend_object *object)
{
php_dispatchex *disp = (php_dispatchex*)CoTaskMemAlloc(sizeof(php_dispatchex));
- trace("constructing a COM wrapper for PHP object %p (%s)\n", object, ZSTR_VAL(Z_OBJCE_P(object)->name));
+ trace("constructing a COM wrapper for PHP object %p (%s)\n", object, ZSTR_VAL(object->ce->name));
if (disp == NULL)
return NULL;
@@ -516,7 +516,7 @@ static php_dispatchex *disp_constructor(zval *object)
if (object) {
- ZVAL_COPY(&disp->object, object);
+ ZVAL_OBJ_COPY(&disp->object, object);
} else {
ZVAL_UNDEF(&disp->object);
}
@@ -536,7 +536,7 @@ static void disp_destructor(php_dispatchex *disp)
CoTaskMemFree(disp);
}
-PHP_COM_DOTNET_API IDispatch *php_com_wrapper_export_as_sink(zval *val, GUID *sinkid,
+PHP_COM_DOTNET_API IDispatch *php_com_wrapper_export_as_sink(zend_object *val, GUID *sinkid,
HashTable *id_to_name)
{
php_dispatchex *disp = disp_constructor(val);
@@ -572,17 +572,13 @@ PHP_COM_DOTNET_API IDispatch *php_com_wrapper_export_as_sink(zval *val, GUID *si
return (IDispatch*)disp;
}
-PHP_COM_DOTNET_API IDispatch *php_com_wrapper_export(zval *val)
+PHP_COM_DOTNET_API IDispatch *php_com_wrapper_export(zend_object *val)
{
php_dispatchex *disp = NULL;
- if (Z_TYPE_P(val) != IS_OBJECT) {
- return NULL;
- }
-
if (php_com_is_valid_object(val)) {
/* pass back its IDispatch directly */
- php_com_dotnet_object *obj = CDNO_FETCH(val);
+ php_com_dotnet_object *obj = (php_com_dotnet_object*)val;
if (obj == NULL)
return NULL;
diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h
index c7e065c2487..64a1884244c 100644
--- a/ext/com_dotnet/php_com_dotnet_internal.h
+++ b/ext/com_dotnet/php_com_dotnet_internal.h
@@ -44,9 +44,9 @@ typedef struct _php_com_dotnet_object {
HashTable *id_of_name_cache;
} php_com_dotnet_object;
-static inline bool php_com_is_valid_object(zval *zv)
+static inline bool php_com_is_valid_object(zend_object *obj)
{
- zend_class_entry *ce = Z_OBJCE_P(zv);
+ const zend_class_entry *ce = obj->ce;
return zend_string_equals_literal(ce->name, "com") ||
zend_string_equals_literal(ce->name, "dotnet") ||
zend_string_equals_literal(ce->name, "variant");
@@ -54,7 +54,7 @@ static inline bool php_com_is_valid_object(zval *zv)
#define CDNO_FETCH(zv) (php_com_dotnet_object*)Z_OBJ_P(zv)
#define CDNO_FETCH_VERIFY(obj, zv) do { \
- if (!php_com_is_valid_object(zv)) { \
+ if (!php_com_is_valid_object(Z_OBJ_P(zv))) { \
php_com_throw_exception(E_UNEXPECTED, "expected a variant object"); \
return; \
} \
@@ -99,8 +99,8 @@ zend_result php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_fu
WORD flags, VARIANT *v, int nargs, zval *args);
/* com_wrapper.c */
-PHP_COM_DOTNET_API IDispatch *php_com_wrapper_export_as_sink(zval *val, GUID *sinkid, HashTable *id_to_name);
-PHP_COM_DOTNET_API IDispatch *php_com_wrapper_export(zval *val);
+PHP_COM_DOTNET_API IDispatch *php_com_wrapper_export_as_sink(zend_object *val, GUID *sinkid, HashTable *id_to_name);
+PHP_COM_DOTNET_API IDispatch *php_com_wrapper_export(zend_object *val);
/* com_persist.c */
void php_com_persist_minit(INIT_FUNC_ARGS);