jscript: Add VT_I2 support

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Wed Mar 14 04:00:27 CDT 2012


Hi,
Revised patch from Jacek comments.

Changelog:
      jscript: Add VT_I2 support


Best Regards
   Alistair Leslie-Hughes

-------------- next part --------------
>From de936fb5a9cc61a17fda2bd9c09e34279ba3abcf Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Wed, 14 Mar 2012 19:58:41 +1100
Subject: [PATCH] Add VT_I2 support
To: wine-patches <wine-patches at winehq.org>

---
 dlls/jscript/engine.c      |   16 ++++++++++++++++
 dlls/jscript/jsutils.c     |   11 ++++++++++-
 dlls/jscript/tests/lang.js |   25 +++++++++++++++++++++++++
 dlls/jscript/tests/run.c   |   12 ++++++++++++
 4 files changed, 63 insertions(+), 1 deletions(-)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 892cb1e..a0fb6bb 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -2016,6 +2016,22 @@ static HRESULT equal_values(script_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jse
         return equal_values(ctx, &v, rval, ei, ret);
     }
 
+    if(V_VT(rval) == VT_I2) {
+        VARIANT v;
+
+        V_VT(&v) = VT_I4;
+        V_I4(&v) = V_I2(rval);
+        return equal_values(ctx, lval, &v, ei, ret);
+    }
+
+    if(V_VT(lval) == VT_I2) {
+        VARIANT v;
+
+        V_VT(&v) = VT_I4;
+        V_I4(&v) = V_I2(lval);
+        return equal_values(ctx, &v, rval, ei, ret);
+    }
+
 
     if(V_VT(rval) == VT_DISPATCH && (V_VT(lval) == VT_BSTR || is_num_vt(V_VT(lval)))) {
         VARIANT v;
diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index 696133a..95dd0ad 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -187,11 +187,14 @@ HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret
     case VT_EMPTY:
     case VT_NULL:
     case VT_BOOL:
-    case VT_I2:
     case VT_I4:
     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));
@@ -414,6 +417,9 @@ HRESULT to_number(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret)
         V_I4(ret) = 0;
         break;
     case VT_I2:
+        V_VT(ret) = VT_I4;
+        V_I4(ret) = V_I2(v);
+        break;
     case VT_I4:
     case VT_R8:
         *ret = *v;
@@ -628,6 +634,9 @@ HRESULT to_object(script_ctx_t *ctx, VARIANT *v, IDispatch **disp)
 
         *disp = to_disp(dispex);
         break;
+    case VT_I2:
+        VariantChangeType(v, v, 0, VT_I4);
+        /* Fall through */
     case VT_I4:
     case VT_R8:
         hres = create_number(ctx, v, &dispex);
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index b6fe821..2a92f81 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -1258,6 +1258,31 @@ ok(tmp === "VT_DISPATCH", "getVT(Object(nullDisp) = " + tmp);
 tmp = Object(nullDisp).toString();
 ok(tmp === "[object Object]", "Object(nullDisp).toString() = " + tmp);
 
+function TestVT_I2()
+{
+    varI2 = short();
+
+    ok(varI2.toString() === "2", "varI2 = " + varI2.toString());
+    ok("2" === varI2.toString() , "varI2 = " + varI2.toString());
+
+    var i = 0;
+    /* Tests: to_primitive, to_number */
+    for(; i < varI2; i++)
+       ;
+
+    ok(i == varI2, "i != varI2");
+    ok(varI2 == i, "i != 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 64a8c7e..65b00a7 100644
--- a/dlls/jscript/tests/run.c
+++ b/dlls/jscript/tests/run.c
@@ -93,6 +93,7 @@ DEFINE_EXPECT(DeleteMemberByDispID);
 #define DISPID_GLOBAL_ISWIN64       0x100f
 #define DISPID_GLOBAL_PUREDISP      0x1010
 #define DISPID_GLOBAL_TESTPROPDELETE  0x1010
+#define DISPID_GLOBAL_SHORT         0x1012
 
 #define DISPID_TESTOBJ_PROP         0x2000
 #define DISPID_TESTOBJ_ONLYDISPID   0x2001
@@ -441,6 +442,10 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
         *pid = DISPID_GLOBAL_NULL_DISP;
         return S_OK;
     }
+    if(!strcmp_wa(bstrName, "short")) {
+        *pid = DISPID_GLOBAL_SHORT;
+        return S_OK;
+    }
     if(!strcmp_wa(bstrName, "notExists")) {
         CHECK_EXPECT(global_notexists_d);
         test_grfdex(grfdex, fdexNameCaseSensitive);
@@ -701,6 +706,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_TESTTHIS2:
         ok(pdp != NULL, "pdp == NULL\n");
         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
-- 
1.7.5.4



More information about the wine-patches mailing list