Re: cvs: php4 /ext/com COM.c VARIANT.c conversion.c dispatch.c
| From: | derick@php.net | Date: | Fri, 31 May 2002 06:43:50 +0000 |
| Subject: | Re: cvs: php4 /ext/com COM.c VARIANT.c conversion.c dispatch.c | ||
| References: | 1 | Groups: | php.qa |
| Request: | Send a blank email to php-qa+get-5447@lists.php.net to get a copy of this message | ||
On Thu, 30 May 2002, Harald Radi wrote:
> 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)
Can you merge those fixes to the branch?
Derick
>
> # 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))
>
>
>
> --
> PHP CVS Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
---------------------------------------------------------------------------
Did I help you? http://www.jdimedia.nl/derick/link.php?url=giftlist
Frequent ranting: http://www.jdimedia.nl/derick/
---------------------------------------------------------------------------
PHP: Scripting the Web - derick@php.net
All your branches are belong to me!
SRM: Script Running Machine - www.vl-srm.net
---------------------------------------------------------------------------