Re: cvs: php4 /ext/com COM.c VARIANT.c conversion.c dispatch.c

From: 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 ---------------------------------------------------------------------------

« previous php.qa (#5447) next »