[php-src] master: com: use zend_object* rather than zval* (#23255)

Gina Peter Banyard via GitHub <[email protected]>
Newsgroups gmane.comp.php.cvs.general
Message-ID <[email protected]>
Author: Gina Peter Banyard (Girgias)
Committer: GitHub (web-flow)
Pusher: Girgias
Date: 2026-08-13T19:26:16+01:00

Commit: https://github.com/php/php-src/commit/8149fba295d060fafe9b4dfbbeb7099c57e8ce95
Raw diff: https://github.com/php/php-src/commit/8149fba295d060fafe9b4dfbbeb7099c57e8ce95.diff

com: use zend_object* rather than zval* (#23255)

Changed paths:
  M  ext/com_dotnet/com_com.c
  M  ext/com_dotnet/com_variant.c
  M  ext/com_dotnet/com_wrapper.c
  M  ext/com_dotnet/php_com_dotnet_internal.h


Diff:

diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c
index 63fc8f6563b2..e0fbb0c17399 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 82f17d12d9b5..87d33da1daf4 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 175a2de33074..a040c0a84aba 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 c7e065c24872..64a1884244ca 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);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.