From 7301ad4f7200052f71cccd7c5404c6e6f2ad1d54 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Mon, 22 Jun 2009 20:42:00 +0200 Subject: [PATCH] jscript: Added Date_setMonth and Date_setUTCMonth implementation. --- dlls/jscript/date.c | 90 +++++++++++++++++++++++++++++++++++++-- dlls/jscript/tests/api.js | 2 + 2 files changed, 88 insertions(+), 4 deletions(-) diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c index 89ec7b2d7cf..fe89989a5d4 100644 --- a/dlls/jscript/date.c +++ b/dlls/jscript/date.c @@ -1373,18 +1373,100 @@ static HRESULT Date_setUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.38 */ static HRESULT Date_setMonth(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, month, ddate; + + 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; + } + + date = (DateInstance*)dispex; + t = local_time(date->time, date); + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + month = num_val(&v); + + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + ddate = num_val(&v); + } + else ddate = date_from_time(t); + + t = make_date(make_day(year_from_time(t), month, ddate), + 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.39 */ static HRESULT Date_setUTCMonth(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, month, ddate; + + 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; + } + + date = (DateInstance*)dispex; + t = date->time; + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + month = num_val(&v); + + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + ddate = num_val(&v); + } + else ddate = date_from_time(t); + + t = make_date(make_day(year_from_time(t), month, ddate), + time_within_day(t)); + date->time = time_clip(t); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } static HRESULT Date_setFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index 36eb85bdab8..6a7e8304918 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -1017,6 +1017,8 @@ date.setUTCHours(20); ok(date.getUTCHours() === 20, "date.getUTCHours() = " + date.getUTCHours()); date.setUTCDate(32); ok(date.getUTCDate() === 1, "date.getUTCDate() = " + date.getUTCDate()); +date.setUTCMonth(22, 37); +ok(date.getTime() === 60987050010, "date.getTime() = " + date.getTime()); ok(typeof(Math.PI) === "number", "typeof(Math.PI) = " + typeof(Math.PI)); ok(Math.floor(Math.PI*100) === 314, "Math.PI = " + Math.PI);