Jacek Caban : jscript: Fixed conversion in place in IVariantChangeType:: ChangeType.
Alexandre Julliard
julliard at winehq.org
Fri Sep 21 14:22:41 CDT 2012
Module: wine
Branch: master
Commit: c0d2029560372974001f75acbbaebda54473a51a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c0d2029560372974001f75acbbaebda54473a51a
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Sep 21 18:00:33 2012 +0200
jscript: Fixed conversion in place in IVariantChangeType::ChangeType.
---
dlls/jscript/jscript.c | 14 +++++++++++---
dlls/jscript/tests/caller.c | 10 ++++++++++
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index 9704e4e..e38987c 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -1007,20 +1007,28 @@ static ULONG WINAPI VariantChangeType_Release(IVariantChangeType *iface)
static HRESULT WINAPI VariantChangeType_ChangeType(IVariantChangeType *iface, VARIANT *dst, VARIANT *src, LCID lcid, VARTYPE vt)
{
JScript *This = impl_from_IVariantChangeType(iface);
+ VARIANT res;
HRESULT hres;
- TRACE("(%p)->(%p %s %x %d)\n", This, dst, debugstr_variant(src), lcid, vt);
+ TRACE("(%p)->(%p %p%s %x %d)\n", This, dst, src, debugstr_variant(src), lcid, vt);
if(!This->ctx) {
FIXME("Object uninitialized\n");
return E_UNEXPECTED;
}
- hres = VariantClear(dst);
+ hres = variant_change_type(This->ctx, &res, src, vt);
if(FAILED(hres))
return hres;
- return variant_change_type(This->ctx, dst, src, vt);
+ hres = VariantClear(dst);
+ if(FAILED(hres)) {
+ VariantClear(&res);
+ return hres;
+ }
+
+ *dst = res;
+ return S_OK;
}
static const IVariantChangeTypeVtbl VariantChangeTypeVtbl = {
diff --git a/dlls/jscript/tests/caller.c b/dlls/jscript/tests/caller.c
index 6fef7f1..f09ad90 100644
--- a/dlls/jscript/tests/caller.c
+++ b/dlls/jscript/tests/caller.c
@@ -168,6 +168,7 @@ static void test_change_type(IVariantChangeType *change_type, VARIANT *src, cons
static void test_change_types(IVariantChangeType *change_type, IDispatch *obj_disp)
{
VARIANT v, dst;
+ BSTR str;
HRESULT hres;
static const conv_results_t bool_results[] = {
@@ -214,6 +215,15 @@ static void test_change_types(IVariantChangeType *change_type, IDispatch *obj_di
hres = IVariantChangeType_ChangeType(change_type, &dst, &v, 0, VT_I4);
ok(hres == DISP_E_BADVARTYPE, "ChangeType failed: %08x, expected DISP_E_BADVARTYPE\n", hres);
ok(V_VT(&dst) == 0xdead, "V_VT(dst) = %d\n", V_VT(&dst));
+
+ /* Test conversion in place */
+ V_VT(&v) = VT_BSTR;
+ V_BSTR(&v) = str = a2bstr("test");
+ hres = IVariantChangeType_ChangeType(change_type, &v, &v, 0, VT_BSTR);
+ ok(hres == S_OK, "ChangeType failed: %08x\n", hres);
+ ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
+ ok(V_BSTR(&v) != str, "V_BSTR(v) == str\n");
+ ok(!strcmp_wa(V_BSTR(&v), "test"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
}
static void test_caller(IServiceProvider *caller, IDispatch *arg_obj)
More information about the wine-cvs
mailing list