Jacek Caban : jscript: Support VT_DATE to number conversion.

Alexandre Julliard julliard at winehq.org
Tue Jan 19 15:44:00 CST 2021


Module: wine
Branch: master
Commit: 3fb0e893b1ae72a2748e2b51ae75d6a053a52ccc
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=3fb0e893b1ae72a2748e2b51ae75d6a053a52ccc

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jan 19 14:33:39 2021 +0100

jscript: Support VT_DATE to number conversion.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/date.c        | 21 +++++++++++++++++++++
 dlls/jscript/jscript.h     |  1 +
 dlls/jscript/jsutils.c     | 13 ++++++++++---
 dlls/jscript/tests/lang.js | 11 +++++++++++
 4 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c
index ffd8e212693..c0264c26bb8 100644
--- a/dlls/jscript/date.c
+++ b/dlls/jscript/date.c
@@ -2462,3 +2462,24 @@ HRESULT create_date_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp
     jsdisp_release(&date->dispex);
     return hres;
 }
+
+HRESULT variant_date_to_number(double date, double *ret)
+{
+    SYSTEMTIME st;
+    UDATE udate;
+    HRESULT hres;
+
+    hres = VarUdateFromDate(date, 0, &udate);
+    if(FAILED(hres))
+        return hres;
+
+    if(!TzSpecificLocalTimeToSystemTime(NULL, &udate.st, &st))
+        return E_FAIL;
+
+    TRACE("%uy %um %u %ud %uh %um %u.%us\n", st.wYear, st.wMonth, st.wDayOfWeek, st.wDay, st.wHour, st.wMinute,
+        st.wSecond, st.wMilliseconds);
+
+    *ret = make_date(make_day(st.wYear, st.wMonth - 1, st.wDay),
+                     make_time(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds));
+    return S_OK;
+}
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index dfe087521db..7cc194b84b9 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -360,6 +360,7 @@ HRESULT to_object(script_ctx_t*,jsval_t,IDispatch**) DECLSPEC_HIDDEN;
 HRESULT jsval_strict_equal(jsval_t,jsval_t,BOOL*) DECLSPEC_HIDDEN;
 
 HRESULT variant_change_type(script_ctx_t*,VARIANT*,VARIANT*,VARTYPE) DECLSPEC_HIDDEN;
+HRESULT variant_date_to_number(double,double*) DECLSPEC_HIDDEN;
 
 HRESULT decode_source(WCHAR*) DECLSPEC_HIDDEN;
 
diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index a2ac53f64b9..a77c70ad01d 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -611,9 +611,16 @@ HRESULT to_number(script_ctx_t *ctx, jsval_t val, double *ret)
     case JSV_BOOL:
         *ret = get_bool(val) ? 1 : 0;
         return S_OK;
-    case JSV_VARIANT:
-        FIXME("unimplemented for variant %s\n", debugstr_variant(get_variant(val)));
-        return E_NOTIMPL;
+    case JSV_VARIANT: {
+        const VARIANT *v = get_variant(val);
+        switch(V_VT(v)) {
+        case VT_DATE:
+            return variant_date_to_number(V_DATE(v), ret);
+        default:
+            FIXME("unimplemented for variant %s\n", debugstr_variant(v));
+            return E_NOTIMPL;
+        }
+    }
     };
 
     assert(0);
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index dfe33f2f615..d6973099b7c 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -197,6 +197,17 @@ ok(tmp === 3, "tmp = " + tmp);
     d = v_date(0);
     e = Date.parse("Sat Dec 30 00:00:00 1899");
     ok(getVT(d) === "VT_DATE", "vt v_date(0) = " + getVT(d));
+    ok(getVT(+d) === "VT_R8", "vt +v_date(0) = " + getVT(d));
+    ok(getVT(d / d) === "VT_I4", "vt v_date(0) / v_date(0) = " + getVT(d / d));
+    ok((+d) === e, "+v_date(0) = " + (+d) + " expected " + e);
+
+    d = v_date(2.5);
+    e = Date.parse("Mon Jan 1 12:00:00 1900");
+    ok((+d) === e, "+v_date(2.5) = " + (+d));
+
+    d = v_date(42091);
+    e = Date.parse("Sat Mar 28 00:00:00 2015");
+    ok((+d) === e, "+v_date(2015y) = " + (+d) + " expected " + e);
 })();
 
 function testRecFunc(x) {




More information about the wine-cvs mailing list