cvs: php4 /ext/com COM.c VARIANT.c conversion.c dispatch.c
| From: | Harald Radi | Date: | Thu, 30 May 2002 23:07:24 +0000 |
| Subject: | cvs: php4 /ext/com COM.c VARIANT.c conversion.c dispatch.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-12168@lists.php.net to get a copy of this message | ||
phanto Thu May 30 19:07:24 2002 EDT
Modified files:
/php4/ext/com COM.c conversion.c dispatch.c VARIANT.c
Log:
@ Added missing AddRef() calls in the COM extension. This should
@ fix weird behaviour (in particular with ADODB). (Harald)
# waah, this suxx
Index: php4/ext/com/COM.c
diff -u php4/ext/com/COM.c:1.78 php4/ext/com/COM.c:1.79
--- php4/ext/com/COM.c:1.78 Tue May 21 18:44:09 2002
+++ php4/ext/com/COM.c Thu May 30 19:07:20 2002
@@ -18,7 +18,7 @@
| Wez Furlong <wez@thebrainroom.com> |
+----------------------------------------------------------------------+
*/
-/* $Id: COM.c,v 1.78 2002/05/21 22:44:09 wez Exp $ */
+/* $Id: COM.c,v 1.79 2002/05/30 23:07:20 phanto Exp $ */
/*
* This module implements support for COM components that support the IDispatch
* interface. Both local (COM) and remote (DCOM) components can be accessed.
@@ -281,9 +281,11 @@
if (C_HASENUM(obj) = SUCCEEDED(C_DISPATCH_VT(obj)->Invoke(C_DISPATCH(obj), DISPID_NEWENUM,
&IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dispparams, var_result, NULL, NULL))) {
if (V_VT(var_result) == VT_UNKNOWN) {
+ V_UNKNOWN(var_result)->lpVtbl->AddRef(V_UNKNOWN(var_result));
C_HASENUM(obj) =
SUCCEEDED(V_UNKNOWN(var_result)->lpVtbl->QueryInterface(V_UNKNOWN(var_result),
&IID_IEnumVARIANT,
(void**)&C_ENUMVARIANT(obj)));
} else if (V_VT(var_result) == VT_DISPATCH) {
+ V_DISPATCH(var_result)->lpVtbl->AddRef(V_DISPATCH(var_result));
C_HASENUM(obj) =
SUCCEEDED(V_DISPATCH(var_result)->lpVtbl->QueryInterface(V_DISPATCH(var_result),
&IID_IEnumVARIANT,
(void**)&C_ENUMVARIANT(obj)));
}
@@ -1584,10 +1586,11 @@
php_error(E_WARNING,"PropPut() failed: %s", error_message);
}
LocalFree(error_message);
- efree(propname);
FREE_VARIANT(var_result);
- FREE_VARIANT(new_value);
+
+ efree(new_value);
+ efree(propname);
RETURN_NULL();
}
@@ -1597,20 +1600,22 @@
hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result, &ErrString
TSRMLS_CC);
- if (SUCCEEDED(hr)) {
- php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
- } else {
- *return_value = *value;
- zval_copy_ctor(return_value);
- }
+ if (return_value) {
+ if (SUCCEEDED(hr)) {
+ php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
+ } else {
+ *return_value = *value;
+ zval_copy_ctor(return_value);
+ }
- if (ErrString) {
- pefree(ErrString, 1);
+ if (ErrString) {
+ pefree(ErrString, 1);
+ }
}
FREE_VARIANT(var_result);
- FREE_VARIANT(new_value);
+ efree(new_value); // FREE_VARIANT does a VariantClear() which is not desired here !
efree(propname);
}
@@ -1784,6 +1789,7 @@
obj = obj_prop;
php_COM_set(obj, &V_DISPATCH(var_result), TRUE TSRMLS_CC);
+ VariantInit(var_result); // to protect C_DISPATCH(obj) from being freed when var_result is
destructed
} else {
php_variant_to_pval(var_result, &return_value, codepage TSRMLS_CC);
@@ -1791,7 +1797,6 @@
obj_prop = NULL;
}
- VariantInit(var_result); // to protect C_DISPATCH(obj) from being freed when var_result is
destructed
pval_destructor(&overloaded_property->element);
}
@@ -1808,7 +1813,6 @@
PHPAPI int php_COM_set_property_handler(zend_property_reference *property_reference, pval *value)
{
- pval result;
zend_overloaded_element *overloaded_property;
zend_llist_element *element;
pval **comval_handle;
@@ -1878,7 +1882,7 @@
FREE_VARIANT(var_result);
overloaded_property = (zend_overloaded_element *) element->data;
- do_COM_propput(&result, obj, &overloaded_property->element, value TSRMLS_CC);
+ do_COM_propput(NULL, obj, &overloaded_property->element, value TSRMLS_CC);
FREE_COM(obj_prop);
pval_destructor(&overloaded_property->element);
Index: php4/ext/com/conversion.c
diff -u php4/ext/com/conversion.c:1.48 php4/ext/com/conversion.c:1.49
--- php4/ext/com/conversion.c:1.48 Mon May 20 11:35:56 2002
+++ php4/ext/com/conversion.c Thu May 30 19:07:21 2002
@@ -720,9 +720,10 @@
ZVAL_NULL(pval_arg);
} else {
ALLOC_COM(obj);
- php_COM_set(obj, &V_DISPATCH(var_arg), TRUE TSRMLS_CC);
+ php_COM_set(obj, &V_DISPATCH(var_arg), FALSE TSRMLS_CC);
ZVAL_COM(pval_arg, obj);
+ VariantInit(var_arg); // to protect C_DISPATCH(obj) from being freed when var_result is
destructed
}
}
break;
Index: php4/ext/com/dispatch.c
diff -u php4/ext/com/dispatch.c:1.2 php4/ext/com/dispatch.c:1.3
--- php4/ext/com/dispatch.c:1.2 Tue May 21 14:58:10 2002
+++ php4/ext/com/dispatch.c Thu May 30 19:07:21 2002
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: dispatch.c,v 1.2 2002/05/21 18:58:10 wez Exp $ */
+/* $Id: dispatch.c,v 1.3 2002/05/30 23:07:21 phanto Exp $ */
/*
* This module is used to export PHP objects to COM and DOTNET by exposing
@@ -280,6 +280,7 @@
ZVAL_NULL(zarg);
}
} else {
+ // arg can't be an idispatch, so we don't care for the implicit AddRef() call here
if (FAILURE == php_variant_to_pval(arg, zarg, codepage TSRMLS_CC)) {
trace("failed to convert arg %d to zval\n", i);
ZVAL_NULL(zarg);
Index: php4/ext/com/VARIANT.c
diff -u php4/ext/com/VARIANT.c:1.31 php4/ext/com/VARIANT.c:1.32
--- php4/ext/com/VARIANT.c:1.31 Tue Dec 11 10:28:55 2001
+++ php4/ext/com/VARIANT.c Thu May 30 19:07:21 2002
@@ -181,6 +181,7 @@
case OE_IS_OBJECT:
if (!strcmp(Z_STRVAL(overloaded_property->element), "value")) {
+ // var_arg can't be an idispatch, so we don't care for the implicit AddRef() call
here
php_variant_to_pval(var_arg, &result, codepage TSRMLS_CC);
} else if (!strcmp(Z_STRVAL(overloaded_property->element), "type")) {
ZVAL_LONG(&result, V_VT(var_arg))