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