jscript: Add VT_I2 support

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Tue Mar 13 04:36:48 CDT 2012


Hi,


Changelog:
     jscript: Add VT_I2 support


Best Regards
  Alistair Leslie-Hughes
-------------- next part --------------
>From 70beeb47b768c96ffb43c3a565c0a8564476d67e Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Fri, 20 Jan 2012 15:28:55 +1100
Subject: [PATCH] Add VT_I2 support
To: wine-patches <wine-patches at winehq.org>

---
 dlls/jscript/jscript.h     |   14 ++++++++++++--
 dlls/jscript/jsutils.c     |    9 +++++++++
 dlls/jscript/number.c      |    4 +++-
 dlls/jscript/tests/lang.js |   15 +++++++++++++++
 dlls/jscript/tests/run.c   |   13 +++++++++++++
 5 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 9362fb6..ead25f7 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -395,12 +395,22 @@ static inline BOOL is_vclass(vdisp_t *vdisp, jsclass_t class)
 
 static inline BOOL is_num_vt(enum VARENUM vt)
 {
-    return vt == VT_I4 || vt == VT_R8;
+    return vt == VT_I4 || vt == VT_I2 ||vt == VT_R8;
 }
 
 static inline DOUBLE num_val(const VARIANT *v)
 {
-    return V_VT(v) == VT_I4 ? V_I4(v) : V_R8(v);
+    switch(V_VT(v))
+    {
+       case VT_I2:
+          return V_I2(v);
+       case VT_I4:
+          return V_I4(v);
+       case VT_R8:
+          return V_R8(v);
+    }
+
+    return 0;
 }
 
 static inline void num_set_int(VARIANT *v, INT i)
diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index b9a35db..437ae93 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -187,6 +187,7 @@ 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;
@@ -412,6 +413,10 @@ HRESULT to_number(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret)
         V_VT(ret) = VT_I4;
         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;
@@ -569,6 +574,9 @@ HRESULT to_string(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, BSTR *str)
     case VT_NULL:
         *str = SysAllocString(nullW);
         break;
+    case VT_I2:
+        *str = int_to_bstr(V_I2(v));
+        break;
     case VT_I4:
         *str = int_to_bstr(V_I4(v));
         break;
@@ -614,6 +622,7 @@ HRESULT to_object(script_ctx_t *ctx, VARIANT *v, IDispatch **disp)
 
         *disp = to_disp(dispex);
         break;
+    case VT_I2:
     case VT_I4:
     case VT_R8:
         hres = create_number(ctx, v, &dispex);
diff --git a/dlls/jscript/number.c b/dlls/jscript/number.c
index 82dd5bce..bbb1de7 100644
--- a/dlls/jscript/number.c
+++ b/dlls/jscript/number.c
@@ -76,7 +76,9 @@ static HRESULT Number_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
             return throw_type_error(ctx, ei, JS_E_INVALIDARG, NULL);
     }
 
-    if(V_VT(&number->num) == VT_I4)
+    if(V_VT(&number->num) == VT_I2)
+        val = V_I2(&number->num);
+    else if(V_VT(&number->num) == VT_I4)
         val = V_I4(&number->num);
     else
         val = V_R8(&number->num);
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index b6fe821..51dd348 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -1258,6 +1258,21 @@ ok(tmp === "VT_DISPATCH", "getVT(Object(nullDisp) = " + tmp);
 tmp = Object(nullDisp).toString();
 ok(tmp === "[object Object]", "Object(nullDisp).toString() = " + tmp);
 
+objI2 = createVT_I2();
+ok(getVT(objI2) === "VT_I4", "getVT(obj) = " + getVT(objI2));
+ok(objI2.toString() === "2", "obj = " + objI2.toString());
+function funcLoopI2()
+{
+    var i = 0;
+    /* Tests: to_primitive, to_number */
+    for(; i < objI2; i++)
+       ;
+    ok(i == objI2, "i(" + i + ") != 1");
+}
+
+funcLoopI2();
+
+
 function do_test() {}
 function nosemicolon() {} nosemicolon();
 function () {} nosemicolon();
diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c
index 64a8c7e..1b36034 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_CREATE_I2     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, "createVT_I2")) {
+        *pid = DISPID_GLOBAL_CREATE_I2;
+        return S_OK;
+    }
     if(!strcmp_wa(bstrName, "notExists")) {
         CHECK_EXPECT(global_notexists_d);
         test_grfdex(grfdex, fdexNameCaseSensitive);
@@ -603,6 +608,7 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
         case VT_NULL:
             V_BSTR(pvarRes) = a2bstr("VT_NULL");
             break;
+        case VT_I2:
         case VT_I4:
             V_BSTR(pvarRes) = a2bstr("VT_I4");
             break;
@@ -687,6 +693,13 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
         V_DISPATCH(pvarRes) = NULL;
         return S_OK;
 
+    case DISPID_GLOBAL_CREATE_I2:
+        if(pvarRes) {
+            V_VT(pvarRes) = VT_I2;
+            V_I2(pvarRes) = 2;
+        }
+        return S_OK;
+
     case DISPID_GLOBAL_TESTTHIS:
         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