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