Module: wine Branch: master Commit: 233ded05b7bcf3a5176e0403e8d14be96974f761 URL: http://source.winehq.org/git/wine.git/?a=commit;h=233ded05b7bcf3a5176e0403e8...
Author: Piotr Caban piotr.caban@gmail.com Date: Mon Jun 22 20:41:50 2009 +0200
jscript: Added Date_setDate and Date_setUTCDate implementation.
---
dlls/jscript/date.c | 80 ++++++++++++++++++++++++++++++++++++++++++-- dlls/jscript/tests/api.js | 16 ++++---- 2 files changed, 84 insertions(+), 12 deletions(-)
diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c index 4c377eb..89ec7b2 100644 --- a/dlls/jscript/date.c +++ b/dlls/jscript/date.c @@ -98,6 +98,18 @@ static inline DOUBLE day(DOUBLE time) return floor(time / MS_PER_DAY); }
+/* ECMA-262 3rd Edition 15.9.1.2 */ +static inline DOUBLE time_within_day(DOUBLE time) +{ + DOUBLE ret; + + ret = fmod(time, MS_PER_DAY); + if(ret < 0) + ret += MS_PER_DAY; + + return ret; +} + /* ECMA-262 3rd Edition 15.9.1.3 */ static inline DOUBLE days_in_year(DOUBLE year) { @@ -1289,16 +1301,76 @@ static HRESULT Date_setUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPP static HRESULT Date_setDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + date = (DateInstance*)dispex; + t = local_time(date->time, date); + t = make_date(make_day(year_from_time(t), month_from_time(t), + num_val(&v)), time_within_day(t)); + date->time = time_clip(utc(t, date)); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; }
/* ECMA-262 3rd Edition 15.9.5.37 */ static HRESULT Date_setUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + date = (DateInstance*)dispex; + t = date->time; + t = make_date(make_day(year_from_time(t), month_from_time(t), + num_val(&v)), time_within_day(t)); + date->time = time_clip(t); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; }
static HRESULT Date_setMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index a865e9f..36eb85b 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -1001,22 +1001,22 @@ ok(isNaN(date.getUTCMilliseconds()), "date.getUTCMilliseconds() is not NaN"); ok(isNaN(date.setMilliseconds(0)), "date.setMilliseconds() is not NaN");
date.setTime(0); -date.setMilliseconds(-10, 2); +date.setUTCMilliseconds(-10, 2); ok(date.getUTCMilliseconds() === 990, "date.getUTCMilliseconds() = " + date.getUTCMilliseconds()); date.setUTCMilliseconds(10); ok(date.getUTCMilliseconds() === 10, "date.getUTCMilliseconds() = " + date.getUTCMilliseconds()); -date.setSeconds(-10); +date.setUTCSeconds(-10); ok(date.getUTCSeconds() === 50, "date.getUTCSeconds() = " + date.getUTCSeconds()); -ok(date.setSeconds(10) === date.setUTCSeconds(10), "date.setUTCSeconds(10) !== date.setUTCSeconds(10)"); -date.setMinutes(-10); +date.setUTCMinutes(-10); ok(date.getUTCMinutes() === 50, "date.getUTCMinutes() = " + date.getUTCMinutes()); -ok(date.setMinutes(10) === date.setUTCMinutes(10), "date.setUTCMinutes(10) !== date.setUTCMinutes(10)"); date.setUTCHours(-10); ok(date.getUTCHours() === 14, "date.getUTCHours() = " + date.getUTCHours()); date.setUTCHours(-123); -ok(date.getTime() === -614989990, "date.getTime() = " + date.getTime()); -date.setHours(20); -ok(date.getHours() === 20, "date.getHours() = " + date.getHours()); +ok(date.getTime() === -612549990, "date.getTime() = " + date.getTime()); +date.setUTCHours(20); +ok(date.getUTCHours() === 20, "date.getUTCHours() = " + date.getUTCHours()); +date.setUTCDate(32); +ok(date.getUTCDate() === 1, "date.getUTCDate() = " + date.getUTCDate());
ok(typeof(Math.PI) === "number", "typeof(Math.PI) = " + typeof(Math.PI)); ok(Math.floor(Math.PI*100) === 314, "Math.PI = " + Math.PI);