jscript: Add VT_I2 support (try 2)

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Fri Mar 30 05:29:50 CDT 2012


Hi,


Changelog:
       jscript: Add VT_I2 support


Best Regards
    Alistair Leslie-Hughes


-------------- next part --------------
>From 7fcc060cfee37a39164a651f2244797d3a973888 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Thu, 29 Mar 2012 15:31:55 +1100
Subject: [PATCH] Add VT_I2 support
To: wine-patches <wine-patches at winehq.org>

---
 dlls/jscript/dispex.c      |    5 +++++
 dlls/jscript/jsutils.c     |    4 ++++
 dlls/jscript/tests/lang.js |   26 ++++++++++++++++++++++++++
 dlls/jscript/tests/run.c   |   12 ++++++++++++
 4 files changed, 47 insertions(+), 0 deletions(-)

diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index 0e209db..6c3ee82 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -1055,6 +1055,11 @@ HRESULT disp_call(script_ctx_t *ctx, IDispatch *disp, DISPID id, WORD flags, DIS
     }
 
     hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, dp, retv, &ei->ei, &ctx->jscaller->IServiceProvider_iface);
+    if(SUCCEEDED(hres) && retv)
+    {
+        if(V_VT(retv) == VT_I2)
+            VariantChangeType(retv, retv, 0, VT_I4);
+    }
     IDispatchEx_Release(dispex);
 
     return hres;
diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index 040ec58..3b20d05 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -191,6 +191,10 @@ HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret
     case VT_R8:
         *ret = *v;
         break;
+    case VT_I2:
+        V_VT(ret) = VT_I4;
+        V_I4(ret) = V_I2(v);
+        break;
     case VT_BSTR:
         V_VT(ret) = VT_BSTR;
         V_BSTR(ret) = SysAllocString(V_BSTR(v));
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index 8f5e5d5..bb3ac2b 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -1260,6 +1260,32 @@ ok(tmp === "VT_DISPATCH", "getVT(Object(nullDisp) = " + tmp);
 tmp = Object(nullDisp).toString();
 ok(tmp === "[object Object]", "Object(nullDisp).toString() = " + tmp);
 
+function TestVT_I2()
+{
+    varI2 = GetShort();
+    num3 = 3
+
+    ok(getVT(varI2) === "VT_I4", "getVT(varI2) = " + getVT(varI2));
+
+    ok("2" == varI2, "string");
+    ok("2" == varI2.toString(), "string");
+
+    ok(2 == varI2, "2 != varI2");
+    ok(varI2 == 2, "varI2 != 2");
+
+    ok(varI2 != num3, "varI2 == num3");
+    ok(num3 != varI2, "num3 == varI2");
+
+    ok((varI2 <= 1) === false, "(varI2 <= 1) !== false");
+    ok((varI2 <= 2) === true, "(varI2 <= 2) !== true");
+    ok((varI2 < 2) === false, "(varI2 < 2) !== false");
+    ok((varI2 > 2) === false, "(varI2 > 2) !== false");
+    ok((varI2 >= 2) === true, "(varI2 >= 2) !== true");
+    ok((varI2 > 1) === true, "(varI2 > 1) !== true");
+}
+
+TestVT_I2();
+
 function do_test() {}
 function nosemicolon() {} nosemicolon();
 function () {} nosemicolon();
diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c
index e6f0009..763cd9d 100644
--- a/dlls/jscript/tests/run.c
+++ b/dlls/jscript/tests/run.c
@@ -96,6 +96,7 @@ DEFINE_EXPECT(DeleteMemberByDispID);
 #define DISPID_GLOBAL_PUREDISP      0x1010
 #define DISPID_GLOBAL_TESTPROPDELETE  0x1010
 #define DISPID_GLOBAL_ISNULLBSTR    0x1011
+#define DISPID_GLOBAL_SHORT         0x1012
 
 #define DISPID_TESTOBJ_PROP         0x2000
 #define DISPID_TESTOBJ_ONLYDISPID   0x2001
@@ -451,6 +452,10 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
         *pid = DISPID_GLOBAL_NULL_DISP;
         return S_OK;
     }
+    if(!strcmp_wa(bstrName, "GetShort")) {
+        *pid = DISPID_GLOBAL_SHORT;
+        return S_OK;
+    }
     if(!strcmp_wa(bstrName, "notExists")) {
         CHECK_EXPECT(global_notexists_d);
         test_grfdex(grfdex, fdexNameCaseSensitive);
@@ -697,6 +702,13 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
         }
         return S_OK;
 
+    case DISPID_GLOBAL_SHORT:
+        if(pvarRes) {
+            V_VT(pvarRes) = VT_I2;
+            V_I2(pvarRes) = 2;
+        }
+        return S_OK;
+
     case DISPID_GLOBAL_NULL_DISP:
         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
         ok(pdp != NULL, "pdp == NULL\n");
-- 
1.7.5.4



More information about the wine-patches mailing list