Jacek Caban : jscript: Added ChangeType implementation.

Alexandre Julliard julliard at winehq.org
Mon Mar 12 11:59:59 CDT 2012


Module: wine
Branch: master
Commit: bac7c1ef3650a6b48e97094bef87d87ad4bd7a4a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bac7c1ef3650a6b48e97094bef87d87ad4bd7a4a

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Mar 12 12:12:26 2012 +0100

jscript: Added ChangeType implementation.

---

 dlls/jscript/jscript.c |   16 +++++++++-
 dlls/jscript/jscript.h |    2 +
 dlls/jscript/jsutils.c |   70 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 86 insertions(+), 2 deletions(-)

diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index 4453bcc..1ca5f9c 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -1002,8 +1002,20 @@ 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);
-    FIXME("(%p)->(%p %s %x %d)\n", This, dst, debugstr_variant(src), lcid, vt);
-    return E_NOTIMPL;
+    HRESULT hres;
+
+    TRACE("(%p)->(%p %s %x %d)\n", This, dst, debugstr_variant(src), lcid, vt);
+
+    if(!This->ctx) {
+        FIXME("Object uninitialized\n");
+        return E_UNEXPECTED;
+    }
+
+    hres = VariantClear(dst);
+    if(FAILED(hres))
+        return hres;
+
+    return variant_change_type(This->ctx, dst, src, vt);
 }
 
 static const IVariantChangeTypeVtbl VariantChangeTypeVtbl = {
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 2e2d57b..47df16d 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -260,6 +260,8 @@ HRESULT to_uint32(script_ctx_t*,VARIANT*,jsexcept_t*,DWORD*) DECLSPEC_HIDDEN;
 HRESULT to_string(script_ctx_t*,VARIANT*,jsexcept_t*,BSTR*) DECLSPEC_HIDDEN;
 HRESULT to_object(script_ctx_t*,VARIANT*,IDispatch**) DECLSPEC_HIDDEN;
 
+HRESULT variant_change_type(script_ctx_t*,VARIANT*,VARIANT*,VARTYPE);
+
 BSTR int_to_bstr(int) DECLSPEC_HIDDEN;
 HRESULT double_to_bstr(double,BSTR*) DECLSPEC_HIDDEN;
 
diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index 2e1030e..6d77fe1 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -657,6 +657,76 @@ HRESULT to_object(script_ctx_t *ctx, VARIANT *v, IDispatch **disp)
     return S_OK;
 }
 
+HRESULT variant_change_type(script_ctx_t *ctx, VARIANT *dst, VARIANT *src, VARTYPE vt)
+{
+    jsexcept_t ei;
+    HRESULT hres;
+
+    memset(&ei, 0, sizeof(ei));
+
+    switch(vt) {
+    case VT_I2:
+    case VT_I4: {
+        INT i;
+
+        hres = to_int32(ctx, src, &ei, &i);
+        if(SUCCEEDED(hres)) {
+            if(vt == VT_I4)
+                V_I4(dst) = i;
+            else
+                V_I2(dst) = i;
+        }
+        break;
+    }
+    case VT_R8:
+        hres = to_number(ctx, src, &ei, dst);
+        if(SUCCEEDED(hres) && V_VT(dst) == VT_I4)
+            V_R8(dst) = V_I4(dst);
+        break;
+    case VT_R4: {
+        VARIANT n;
+
+        hres = to_number(ctx, src, &ei, &n);
+        if(SUCCEEDED(hres))
+            V_R4(dst) = num_val(&n);
+        break;
+    }
+    case VT_BOOL: {
+        VARIANT_BOOL b;
+
+        hres = to_boolean(src, &b);
+        if(SUCCEEDED(hres))
+            V_BOOL(dst) = b;
+        break;
+    }
+    case VT_BSTR: {
+        BSTR str;
+
+        hres = to_string(ctx, src, &ei, &str);
+        if(SUCCEEDED(hres))
+            V_BSTR(dst) = str;
+        break;
+    }
+    case VT_EMPTY:
+        hres = V_VT(src) == VT_EMPTY ? S_OK : E_NOTIMPL;
+        break;
+    case VT_NULL:
+        hres = V_VT(src) == VT_NULL ? S_OK : E_NOTIMPL;
+        break;
+    default:
+        FIXME("vt %d not implemented\n", vt);
+        hres = E_NOTIMPL;
+    }
+
+    if(FAILED(hres)) {
+        VariantClear(&ei.var);
+        return hres;
+    }
+
+    V_VT(dst) = vt;
+    return S_OK;
+}
+
 static inline JSCaller *impl_from_IServiceProvider(IServiceProvider *iface)
 {
     return CONTAINING_RECORD(iface, JSCaller, IServiceProvider_iface);




More information about the wine-cvs mailing list