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);