Jacek Caban : jscript: Add VT_CY type support.
Alexandre Julliard
julliard at winehq.org
Fri Jan 22 15:59:15 CST 2021
Module: wine
Branch: master
Commit: d22bafa7630488bd12cb1549ee33bc6d9eb1e45a
URL: https://source.winehq.org/git/wine.git/?a=commit;h=d22bafa7630488bd12cb1549ee33bc6d9eb1e45a
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Jan 22 20:22:09 2021 +0100
jscript: Add VT_CY type support.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/jscript/jsutils.c | 6 ++++++
dlls/jscript/tests/lang.js | 28 +++++++++++++++++++++++++
dlls/jscript/tests/run.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 85 insertions(+)
diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index bfecdc75c4a..3c3cd012490 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -315,6 +315,12 @@ HRESULT variant_to_jsval(VARIANT *var, jsval_t *r)
case VT_R4:
*r = jsval_number(V_R4(var));
return S_OK;
+ case VT_CY:
+ /* FIXME: Native converts VT_CY to a special kind number type, which is
+ * never converted to VT_I4 when it's converted back to VARIANT. */
+ *r = jsval_number((double)V_CY(var).int64 / 10000.0);
+ WARN("VT_CY: %lf\n", get_number(*r));
+ return S_OK;
case VT_UNKNOWN:
if(V_UNKNOWN(var)) {
IDispatch *disp;
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index 6b3640bfa0b..753b4ee595e 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -215,6 +215,34 @@ ok(tmp === 3, "tmp = " + tmp);
ok(d != d, "date d == d");
})();
+(function() {
+ /* VT_CY handling */
+ var d;
+ todo_wine_ok(getVT(v_cy(0)) === "VT_R8", "vt v_cy(0) = " + getVT(v_cy(0)));
+ todo_wine_ok(getVT(v_cy(10000)) === "VT_R8", "vt v_cy(10000) = " + getVT(v_cy(0)));
+ d = v_cy(0);
+ todo_wine_ok(getVT(d) === "VT_R8", "vt v_cy(0) = " + getVT(d));
+ todo_wine_ok(getVT(+d) === "VT_R8", "vt +v_cy(0) = " + getVT(d));
+ ok(d == 0, "v_cy(0) != 0\n");
+ ok(d === 0, "v_cy(0) !== 0\n");
+ ok("" + d === "0", "str(v_cy(0)) = " + d);
+ ok(d === d, "date d !== d");
+
+ d = v_cy(1000);
+ ok(getVT(d) === "VT_R8", "vt v_cy(1000) = " + getVT(d));
+ ok(getVT(+d) === "VT_R8", "vt +v_cy(1000) = " + getVT(d));
+ ok(d == 0.1, "v_cy(1000) != 0, d = " + d);
+ ok(d === 0.1, "v_cy(1000) !== 0.1\n");
+ ok("" + d === "0.1", "str(v_cy(1000)) = " + d);
+ ok(d === d, "date d !== d");
+
+ d = v_cy(25000);
+ ok(getVT(d) === "VT_R8", "vt v_cy(25000) = " + getVT(d));
+ ok(getVT(+d) === "VT_R8", "vt +v_cy(25000) = " + getVT(d));
+ ok(d === 2.5, "v_cy(25000) !== 2.5\n");
+ ok("" + d === "2.5", "str(v_cy(25000)) = " + d);
+})();
+
function testRecFunc(x) {
ok(testRecFunc.arguments === arguments, "testRecFunc.arguments = " + testRecFunc.arguments);
if(x) {
diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c
index 7837d5fee4d..281774cb2ba 100644
--- a/dlls/jscript/tests/run.c
+++ b/dlls/jscript/tests/run.c
@@ -167,6 +167,8 @@ DEFINE_EXPECT(BindHandler);
#define DISPID_GLOBAL_THROWINT 0x1021
#define DISPID_GLOBAL_THROWEI 0x1022
#define DISPID_GLOBAL_VDATE 0x1023
+#define DISPID_GLOBAL_VCY 0x1024
+#define DISPID_GLOBAL_TODOWINE 0x1025
#define DISPID_GLOBAL_TESTPROPDELETE 0x2000
#define DISPID_GLOBAL_TESTNOPROPDELETE 0x2001
@@ -809,6 +811,11 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
*pid = DISPID_GLOBAL_TRACE;
return S_OK;
}
+ if(!lstrcmpW(bstrName, L"todo_wine_ok")) {
+ test_grfdex(grfdex, fdexNameCaseSensitive);
+ *pid = DISPID_GLOBAL_TODOWINE;
+ return S_OK;
+ }
if(!lstrcmpW(bstrName, L"reportSuccess")) {
CHECK_EXPECT(global_success_d);
test_grfdex(grfdex, fdexNameCaseSensitive);
@@ -972,6 +979,11 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
return S_OK;
}
+ if(!lstrcmpW(bstrName, L"v_cy")) {
+ *pid = DISPID_GLOBAL_VCY;
+ return S_OK;
+ }
+
if(!lstrcmpW(bstrName, L"testArgTypes")) {
*pid = DISPID_GLOBAL_TESTARGTYPES;
return S_OK;
@@ -1052,6 +1064,25 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
return S_OK;
+ case DISPID_GLOBAL_TODOWINE:
+ ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
+ ok(pdp != NULL, "pdp == NULL\n");
+ ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
+ ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
+ ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
+ ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
+ if(wFlags & INVOKE_PROPERTYGET)
+ ok(pvarRes != NULL, "pvarRes == NULL\n");
+ else
+ ok(!pvarRes, "pvarRes != NULL\n");
+ ok(pei != NULL, "pei == NULL\n");
+
+ ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
+ ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
+ todo_wine ok(V_BOOL(pdp->rgvarg+1), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
+
+ return S_OK;
+
case DISPID_GLOBAL_TRACE:
ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
ok(pdp != NULL, "pdp == NULL\n");
@@ -1536,6 +1567,26 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
}
return S_OK;
+ case DISPID_GLOBAL_VCY:
+ ok(wFlags == (DISPATCH_METHOD|DISPATCH_PROPERTYGET), "wFlags = %x\n", wFlags);
+ ok(pdp != NULL, "pdp == NULL\n");
+ ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
+ ok(pvarRes != NULL, "pvarRes != NULL\n");
+ V_VT(pvarRes) = VT_CY;
+ switch(V_VT(pdp->rgvarg))
+ {
+ case VT_I4:
+ V_CY(pvarRes).int64 = V_I4(pdp->rgvarg);
+ break;
+ case VT_R8:
+ V_CY(pvarRes).int64 = V_R8(pdp->rgvarg);
+ break;
+ default:
+ ok(0, "vt = %u\n", V_VT(pdp->rgvarg));
+ return E_INVALIDARG;
+ }
+ return S_OK;
+
case DISPID_GLOBAL_INTPROP:
V_VT(pvarRes) = VT_INT;
V_INT(pvarRes) = 22;
More information about the wine-cvs
mailing list