From 84d8cddcae73b6a130fdae20636712ddb0f91c94 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 30 Sep 2008 17:48:18 +0200 Subject: [PATCH] jscript: Added Date constructor object implementation. --- dlls/jscript/Makefile.in | 1 + dlls/jscript/date.c | 494 +++++++++++++++++++++++++++++++++++++ dlls/jscript/global.c | 9 +- dlls/jscript/jscript.h | 3 + dlls/jscript/tests/lang.js | 2 + 5 files changed, 507 insertions(+), 2 deletions(-) create mode 100644 dlls/jscript/date.c diff --git a/dlls/jscript/Makefile.in b/dlls/jscript/Makefile.in index e87be626b3..5d4506a3ad 100644 --- a/dlls/jscript/Makefile.in +++ b/dlls/jscript/Makefile.in @@ -10,6 +10,7 @@ RC_SRCS = rsrc.rc C_SRCS = \ array.c \ bool.c \ + date.c \ dispex.c \ engine.c \ function.c \ diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c new file mode 100644 index 0000000000..3fee568e10 --- /dev/null +++ b/dlls/jscript/date.c @@ -0,0 +1,494 @@ +/* + * Copyright 2008 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "jscript.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(jscript); + +typedef struct { + DispatchEx dispex; +} DateInstance; + +static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0}; +static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0}; +static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0}; +static const WCHAR propertyIsEnumerableW[] = + {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0}; +static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0}; +static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0}; +static const WCHAR toUTCStringW[] = {'t','o','U','T','C','S','t','r','i','n','g',0}; +static const WCHAR toDateStringW[] = {'t','o','D','a','t','e','S','t','r','i','n','g',0}; +static const WCHAR toTimeStringW[] = {'t','o','T','i','m','e','S','t','r','i','n','g',0}; +static const WCHAR toLocaleDateStringW[] = {'t','o','L','o','c','a','l','e','D','a','t','e','S','t','r','i','n','g',0}; +static const WCHAR toLocaleTimeStringW[] = {'t','o','L','o','c','a','l','e','T','i','m','e','S','t','r','i','n','g',0}; +static const WCHAR getTimeW[] = {'g','e','t','T','i','m','e',0}; +static const WCHAR getFullYearW[] = {'g','e','t','F','u','l','l','Y','e','a','r',0}; +static const WCHAR getUTCFullYearW[] = {'g','e','t','U','T','C','F','u','l','l','Y','e','a','r',0}; +static const WCHAR getMonthW[] = {'g','e','t','M','o','n','t','h',0}; +static const WCHAR getUTCMonthW[] = {'g','e','t','U','T','C','M','o','n','t','h',0}; +static const WCHAR getDateW[] = {'g','e','t','D','a','t','e',0}; +static const WCHAR getUTCDateW[] = {'g','e','t','U','T','C','D','a','t','e',0}; +static const WCHAR getDayW[] = {'g','e','t','D','a','y',0}; +static const WCHAR getUTCDayW[] = {'g','e','t','U','T','C','D','a','y',0}; +static const WCHAR getHoursW[] = {'g','e','t','H','o','u','r','s',0}; +static const WCHAR getUTCHoursW[] = {'g','e','t','U','T','C','H','o','u','r','s',0}; +static const WCHAR getMinutesW[] = {'g','e','t','M','i','n','u','t','e','s',0}; +static const WCHAR getUTCMinutesW[] = {'g','e','t','U','T','C','M','i','n','u','t','e','s',0}; +static const WCHAR getSecondsW[] = {'g','e','t','S','e','c','o','n','d','s',0}; +static const WCHAR getUTCSecondsW[] = {'g','e','t','U','T','C','S','e','c','o','n','d','s',0}; +static const WCHAR getMilisecondsW[] = {'g','e','t','M','i','l','i','s','e','c','o','n','d','s',0}; +static const WCHAR getUTCMilisecondsW[] = {'g','e','t','U','T','C','M','i','l','i','s','e','c','o','n','d','s',0}; +static const WCHAR getTimezoneOffsetW[] = {'g','e','t','T','i','m','e','z','o','n','e','O','f','f','s','e','t',0}; +static const WCHAR setTimeW[] = {'s','e','t','T','i','m','e',0}; +static const WCHAR setMilisecondsW[] = {'s','e','t','M','i','l','i','s','e','c','o','n','d','s',0}; +static const WCHAR setUTCMilisecondsW[] = {'s','e','t','U','T','C','M','i','l','i','s','e','c','o','n','d','s',0}; +static const WCHAR setSecondsW[] = {'s','e','t','S','e','c','o','n','d','s',0}; +static const WCHAR setUTCSecondsW[] = {'s','e','t','U','T','C','S','e','c','o','n','d','s',0}; +static const WCHAR setMinutesW[] = {'s','e','t','M','i','n','u','t','e','s',0}; +static const WCHAR setUTCMinutesW[] = {'s','e','t','U','T','C','M','i','n','u','t','e','s',0}; +static const WCHAR setHoursW[] = {'s','e','t','H','o','u','r','s',0}; +static const WCHAR setUTCHoursW[] = {'s','e','t','H','o','u','r','s',0}; +static const WCHAR setDateW[] = {'s','e','t','D','a','t','e',0}; +static const WCHAR setUTCDateW[] = {'s','e','t','U','T','C','D','a','t','e',0}; +static const WCHAR setMonthW[] = {'s','e','t','M','o','n','t','h',0}; +static const WCHAR setUTCMonthW[] = {'s','e','t','U','T','C','M','o','n','t','h',0}; +static const WCHAR setFullYearW[] = {'s','e','t','F','u','l','l','Y','e','a','r',0}; +static const WCHAR setUTCFullYearW[] = {'s','e','t','U','T','C','F','u','l','l','Y','e','a','r',0}; + +static inline HRESULT systime_to_time(const SYSTEMTIME *st, FILETIME *time) +{ + return SystemTimeToFileTime(st, time) ? S_OK : HRESULT_FROM_WIN32(GetLastError()); +} + +static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_toUTCString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_toDateString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_toTimeString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_toLocaleDateString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_toLocaleTimeString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getUTCDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getUTCMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_getTimezoneOffset(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setUTCMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_setUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT Date_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static const builtin_prop_t Date_props[] = { + {getDateW, Date_getDate, PROPF_METHOD}, + {getDayW, Date_getDay, PROPF_METHOD}, + {getFullYearW, Date_getFullYear, PROPF_METHOD}, + {getHoursW, Date_getHours, PROPF_METHOD}, + {getMilisecondsW, Date_getMiliseconds, PROPF_METHOD}, + {getMinutesW, Date_getMinutes, PROPF_METHOD}, + {getMonthW, Date_getMonth, PROPF_METHOD}, + {getSecondsW, Date_getSeconds, PROPF_METHOD}, + {getTimeW, Date_getTime, PROPF_METHOD}, + {getTimezoneOffsetW, Date_getTimezoneOffset, PROPF_METHOD}, + {getUTCDateW, Date_getUTCDate, PROPF_METHOD}, + {getUTCDayW, Date_getUTCDay, PROPF_METHOD}, + {getUTCFullYearW, Date_getUTCFullYear, PROPF_METHOD}, + {getUTCHoursW, Date_getUTCHours, PROPF_METHOD}, + {getUTCMilisecondsW, Date_getUTCMiliseconds, PROPF_METHOD}, + {getUTCMinutesW, Date_getUTCMinutes, PROPF_METHOD}, + {getUTCMonthW, Date_getUTCMonth, PROPF_METHOD}, + {getUTCSecondsW, Date_getUTCSeconds, PROPF_METHOD}, + {hasOwnPropertyW, Date_hasOwnProperty, PROPF_METHOD}, + {isPrototypeOfW, Date_isPrototypeOf, PROPF_METHOD}, + {propertyIsEnumerableW, Date_propertyIsEnumerable, PROPF_METHOD}, + {setDateW, Date_setDate, PROPF_METHOD}, + {setFullYearW, Date_setFullYear, PROPF_METHOD}, + {setHoursW, Date_setHours, PROPF_METHOD}, + {setMilisecondsW, Date_setMiliseconds, PROPF_METHOD}, + {setMinutesW, Date_setMinutes, PROPF_METHOD}, + {setMonthW, Date_setMonth, PROPF_METHOD}, + {setSecondsW, Date_setSeconds, PROPF_METHOD}, + {setTimeW, Date_setTime, PROPF_METHOD}, + {setUTCDateW, Date_setUTCDate, PROPF_METHOD}, + {setUTCFullYearW, Date_setUTCFullYear, PROPF_METHOD}, + {setUTCHoursW, Date_setUTCHours, PROPF_METHOD}, + {setUTCMilisecondsW, Date_setUTCMiliseconds, PROPF_METHOD}, + {setUTCMinutesW, Date_setUTCMinutes, PROPF_METHOD}, + {setUTCMonthW, Date_setUTCMonth, PROPF_METHOD}, + {setUTCSecondsW, Date_setUTCSeconds, PROPF_METHOD}, + {toDateStringW, Date_toDateString, PROPF_METHOD}, + {toLocaleDateStringW, Date_toLocaleDateString, PROPF_METHOD}, + {toLocaleStringW, Date_toLocaleString, PROPF_METHOD}, + {toLocaleTimeStringW, Date_toLocaleTimeString, PROPF_METHOD}, + {toStringW, Date_toString, PROPF_METHOD}, + {toTimeStringW, Date_toTimeString, PROPF_METHOD}, + {toUTCStringW, Date_toUTCString, PROPF_METHOD}, + {valueOfW, Date_valueOf, PROPF_METHOD}, +}; + +static const builtin_info_t Date_info = { + JSCLASS_DATE, + {NULL, Date_value, 0}, + sizeof(Date_props)/sizeof(*Date_props), + Date_props, + NULL, + NULL +}; + +static HRESULT create_date(script_ctx_t *ctx, BOOL use_constr, DispatchEx **ret) +{ + DateInstance *date; + HRESULT hres; + + date = heap_alloc_zero(sizeof(DateInstance)); + if(!date) + return E_OUTOFMEMORY; + + if(use_constr) + hres = init_dispex_from_constr(&date->dispex, ctx, &Date_info, ctx->date_constr); + else + hres = init_dispex(&date->dispex, ctx, &Date_info, NULL); + if(FAILED(hres)) { + heap_free(date); + return hres; + } + + *ret = &date->dispex; + return S_OK; +} + +static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT create_date_constr(script_ctx_t *ctx, DispatchEx **ret) +{ + DispatchEx *date; + HRESULT hres; + + hres = create_date(ctx, FALSE, &date); + if(FAILED(hres)) + return hres; + + hres = create_builtin_function(ctx, DateConstr_value, PROPF_CONSTR, date, ret); + + jsdisp_release(date); + return hres; +} + diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c index 30e2bd54a2..01d92dde71 100644 --- a/dlls/jscript/global.c +++ b/dlls/jscript/global.c @@ -99,8 +99,9 @@ static HRESULT JSGlobal_Boolean(DispatchEx *dispex, LCID lcid, WORD flags, DISPP static HRESULT JSGlobal_Date(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + return constructor_call(dispex->ctx->date_constr, lcid, flags, dp, retv, ei, sp); } static HRESULT JSGlobal_Function(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -418,6 +419,10 @@ static HRESULT init_constructors(script_ctx_t *ctx) if(FAILED(hres)) return hres; + hres = create_date_constr(ctx, &ctx->date_constr); + if(FAILED(hres)) + return hres; + hres = create_number_constr(ctx, &ctx->number_constr); if(FAILED(hres)) return hres; diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 15e4b359f3..2e77d43fa7 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -67,6 +67,7 @@ typedef enum { JSCLASS_NONE, JSCLASS_ARRAY, JSCLASS_BOOLEAN, + JSCLASS_DATE, JSCLASS_FUNCTION, JSCLASS_GLOBAL, JSCLASS_MATH, @@ -170,6 +171,7 @@ struct _script_ctx_t { DispatchEx *function_constr; DispatchEx *array_constr; DispatchEx *bool_constr; + DispatchEx *date_constr; DispatchEx *number_constr; DispatchEx *object_constr; DispatchEx *regexp_constr; @@ -188,6 +190,7 @@ HRESULT init_function_constr(script_ctx_t*); HRESULT create_array_constr(script_ctx_t*,DispatchEx**); HRESULT create_bool_constr(script_ctx_t*,DispatchEx**); +HRESULT create_date_constr(script_ctx_t*,DispatchEx**); HRESULT create_number_constr(script_ctx_t*,DispatchEx**); HRESULT create_object_constr(script_ctx_t*,DispatchEx**); HRESULT create_regexp_constr(script_ctx_t*,DispatchEx**); diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index de45d591db..148dfede14 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -81,6 +81,8 @@ ok(Math !== undefined, "Math is undefined"); ok(Math.prototype === undefined, "Math.prototype is not undefined"); ok(Function.prototype !== undefined, "Function.prototype is undefined"); ok(Function.prototype.prototype === undefined, "Function.prototype is not undefined"); +ok(Date.prototype !== undefined, "Date.prototype is undefined"); +ok(Date.prototype.prototype === undefined, "Date.prototype is not undefined"); Function.prototype.test = true; ok(testFunc1.test === true, "testFunc1.test !== true");