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

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

« previous php.cvs (#12168) next »