Huw Davies : oleaut32: Remove weird attempt to clear VT_VARIANT.
Alexandre Julliard
julliard at wine.codeweavers.com
Sun May 7 03:36:38 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 2898b5d9ad886c0e9077e5ed91b16cd9a8988943
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=2898b5d9ad886c0e9077e5ed91b16cd9a8988943
Author: Huw Davies <huw at codeweavers.com>
Date: Fri May 5 15:28:22 2006 +0100
oleaut32: Remove weird attempt to clear VT_VARIANT.
Add some tests.
---
dlls/oleaut32/tests/vartest.c | 111 +++++++++++++++++++++++++++++++++++++++++
dlls/oleaut32/variant.c | 5 --
2 files changed, 111 insertions(+), 5 deletions(-)
diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c
index 2d60b86..2b6cf1c 100644
--- a/dlls/oleaut32/tests/vartest.c
+++ b/dlls/oleaut32/tests/vartest.c
@@ -273,11 +273,49 @@ static int IsValidVariantClearVT(VARTYPE
return ret;
}
+typedef struct
+{
+ const IUnknownVtbl *lpVtbl;
+ LONG ref;
+ LONG events;
+} test_VariantClearImpl;
+
+static HRESULT WINAPI VC_QueryInterface(LPUNKNOWN iface,REFIID riid,LPVOID *ppobj)
+{
+ test_VariantClearImpl *This = (test_VariantClearImpl *)iface;
+ This->events |= 0x1;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI VC_AddRef(LPUNKNOWN iface) {
+ test_VariantClearImpl *This = (test_VariantClearImpl *)iface;
+ This->events |= 0x2;
+ return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI VC_Release(LPUNKNOWN iface) {
+ test_VariantClearImpl *This = (test_VariantClearImpl *)iface;
+ /* static class, won't be freed */
+ This->events |= 0x4;
+ return InterlockedDecrement(&This->ref);
+}
+
+static const IUnknownVtbl test_VariantClear_vtbl = {
+ VC_QueryInterface,
+ VC_AddRef,
+ VC_Release,
+};
+
+static test_VariantClearImpl test_myVariantClearImpl = {&test_VariantClear_vtbl, 1, 0};
+
static void test_VariantClear(void)
{
HRESULT hres;
VARIANTARG v;
+ VARIANT v2;
size_t i;
+ long i4;
+ IUnknown *punk;
#if 0
/* Crashes: Native does not test input for NULL, so neither does Wine */
@@ -319,6 +357,79 @@ #endif
hExpected, hres, vt, ExtraFlags[i]);
}
}
+
+ /* Some BYREF tests with non-NULL ptrs */
+
+ /* VARIANT BYREF */
+ V_VT(&v2) = VT_I4;
+ V_I4(&v2) = 0x1234;
+ V_VT(&v) = VT_VARIANT | VT_BYREF;
+ V_VARIANTREF(&v) = &v2;
+
+ hres = VariantClear(&v);
+ ok(hres == S_OK, "ret %08lx\n", hres);
+ ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
+ ok(V_VARIANTREF(&v) == &v2, "variant ref %p\n", V_VARIANTREF(&v2));
+ ok(V_VT(&v2) == VT_I4, "vt %04x\n", V_VT(&v2));
+ ok(V_I4(&v2) == 0x1234, "i4 %04lx\n", V_I4(&v2));
+
+ /* I4 BYREF */
+ i4 = 0x4321;
+ V_VT(&v) = VT_I4 | VT_BYREF;
+ V_I4REF(&v) = &i4;
+
+ hres = VariantClear(&v);
+ ok(hres == S_OK, "ret %08lx\n", hres);
+ ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
+ ok(V_I4REF(&v) == &i4, "i4 ref %p\n", V_I4REF(&v2));
+ ok(i4 == 0x4321, "i4 changed %08lx\n", i4);
+
+
+ /* UNKNOWN */
+ V_VT(&v) = VT_UNKNOWN;
+ V_UNKNOWN(&v) = (IUnknown*)&test_myVariantClearImpl;
+ test_myVariantClearImpl.events = 0;
+ hres = VariantClear(&v);
+ ok(hres == S_OK, "ret %08lx\n", hres);
+ ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
+ ok(V_UNKNOWN(&v) == (IUnknown*)&test_myVariantClearImpl, "unknown %p\n", V_UNKNOWN(&v));
+ /* Check that Release got called, but nothing else */
+ ok(test_myVariantClearImpl.events == 0x4, "Unexpected call. events %08lx\n", test_myVariantClearImpl.events);
+
+ /* UNKNOWN BYREF */
+ punk = (IUnknown*)&test_myVariantClearImpl;
+ V_VT(&v) = VT_UNKNOWN | VT_BYREF;
+ V_UNKNOWNREF(&v) = &punk;
+ test_myVariantClearImpl.events = 0;
+ hres = VariantClear(&v);
+ ok(hres == S_OK, "ret %08lx\n", hres);
+ ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
+ ok(V_UNKNOWNREF(&v) == &punk, "unknown ref %p\n", V_UNKNOWNREF(&v));
+ /* Check that nothing got called */
+ ok(test_myVariantClearImpl.events == 0, "Unexpected call. events %08lx\n", test_myVariantClearImpl.events);
+
+ /* DISPATCH */
+ V_VT(&v) = VT_DISPATCH;
+ V_DISPATCH(&v) = (IDispatch*)&test_myVariantClearImpl;
+ test_myVariantClearImpl.events = 0;
+ hres = VariantClear(&v);
+ ok(hres == S_OK, "ret %08lx\n", hres);
+ ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
+ ok(V_DISPATCH(&v) == (IDispatch*)&test_myVariantClearImpl, "dispatch %p\n", V_DISPATCH(&v));
+ /* Check that Release got called, but nothing else */
+ ok(test_myVariantClearImpl.events == 0x4, "Unexpected call. events %08lx\n", test_myVariantClearImpl.events);
+
+ /* DISPATCH BYREF */
+ punk = (IUnknown*)&test_myVariantClearImpl;
+ V_VT(&v) = VT_DISPATCH | VT_BYREF;
+ V_DISPATCHREF(&v) = (IDispatch**)&punk;
+ test_myVariantClearImpl.events = 0;
+ hres = VariantClear(&v);
+ ok(hres == S_OK, "ret %08lx\n", hres);
+ ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
+ ok(V_DISPATCHREF(&v) == (IDispatch**)&punk, "dispatch ref %p\n", V_DISPATCHREF(&v));
+ /* Check that nothing got called */
+ ok(test_myVariantClearImpl.events == 0, "Unexpected call. events %08lx\n", test_myVariantClearImpl.events);
}
static void test_VariantCopy(void)
diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c
index a40f3d0..a21a2b6 100644
--- a/dlls/oleaut32/variant.c
+++ b/dlls/oleaut32/variant.c
@@ -625,11 +625,6 @@ HRESULT WINAPI VariantClear(VARIANTARG*
if (V_UNKNOWN(pVarg))
IUnknown_Release(V_UNKNOWN(pVarg));
}
- else if (V_VT(pVarg) == VT_VARIANT)
- {
- if (V_VARIANTREF(pVarg))
- VariantClear(V_VARIANTREF(pVarg));
- }
}
V_VT(pVarg) = VT_EMPTY;
}
More information about the wine-cvs
mailing list