in lib/VM/JSLib/Date.cpp [104:376]
Handle<JSObject> createDateConstructor(Runtime &runtime) {
auto datePrototype = Handle<JSObject>::vmcast(&runtime.datePrototype);
auto cons = defineSystemConstructor<JSDate>(
runtime,
Predefined::getSymbolID(Predefined::Date),
dateConstructor,
datePrototype,
7,
CellKind::JSDateKind);
// Date.prototype.xxx() methods.
defineMethod(
runtime,
datePrototype,
Predefined::getSymbolID(Predefined::valueOf),
nullptr,
datePrototypeGetTime,
0);
defineMethod(
runtime,
datePrototype,
Predefined::getSymbolID(Predefined::getTime),
nullptr,
datePrototypeGetTime,
0);
auto defineToStringMethod = [&](SymbolID name, ToStringKind kind) {
defineMethod(
runtime,
datePrototype,
name,
(void *)kind,
datePrototypeToStringHelper,
0);
};
defineToStringMethod(
Predefined::getSymbolID(Predefined::toString),
ToStringKind::DatetimeToString);
defineToStringMethod(
Predefined::getSymbolID(Predefined::toDateString),
ToStringKind::DateToString);
defineToStringMethod(
Predefined::getSymbolID(Predefined::toTimeString),
ToStringKind::TimeToString);
defineToStringMethod(
Predefined::getSymbolID(Predefined::toISOString),
ToStringKind::ISOToString);
defineToStringMethod(
Predefined::getSymbolID(Predefined::toUTCString),
ToStringKind::UTCToString);
defineToStringMethod(
Predefined::getSymbolID(Predefined::toGMTString),
ToStringKind::UTCToString);
auto defineToLocaleStringMethod = [&](SymbolID name,
ToLocaleStringKind kind) {
defineMethod(
runtime,
datePrototype,
name,
(void *)kind,
datePrototypeToLocaleStringHelper,
0);
};
defineToLocaleStringMethod(
Predefined::getSymbolID(Predefined::toLocaleString),
ToLocaleStringKind::DatetimeToLocaleString);
defineToLocaleStringMethod(
Predefined::getSymbolID(Predefined::toLocaleDateString),
ToLocaleStringKind::DateToLocaleString);
defineToLocaleStringMethod(
Predefined::getSymbolID(Predefined::toLocaleTimeString),
ToLocaleStringKind::TimeToLocaleString);
auto defineGetterMethod = [&](SymbolID name, GetterKind kind) {
defineMethod(
runtime,
datePrototype,
name,
(void *)kind,
datePrototypeGetterHelper,
0);
};
defineGetterMethod(
Predefined::getSymbolID(Predefined::getFullYear),
GetterKind::GetFullYear);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getYear), GetterKind::GetYear);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getMonth), GetterKind::GetMonth);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getDate), GetterKind::GetDate);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getDay), GetterKind::GetDay);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getHours), GetterKind::GetHours);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getMinutes), GetterKind::GetMinutes);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getSeconds), GetterKind::GetSeconds);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getMilliseconds),
GetterKind::GetMilliseconds);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getUTCFullYear),
GetterKind::GetUTCFullYear);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getUTCMonth),
GetterKind::GetUTCMonth);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getUTCDate), GetterKind::GetUTCDate);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getUTCDay), GetterKind::GetUTCDay);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getUTCHours),
GetterKind::GetUTCHours);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getUTCMinutes),
GetterKind::GetUTCMinutes);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getUTCSeconds),
GetterKind::GetUTCSeconds);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getUTCMilliseconds),
GetterKind::GetUTCMilliseconds);
defineGetterMethod(
Predefined::getSymbolID(Predefined::getTimezoneOffset),
GetterKind::GetTimezoneOffset);
defineMethod(
runtime,
datePrototype,
Predefined::getSymbolID(Predefined::setTime),
nullptr,
datePrototypeSetTime,
1);
auto defineSetterMethod =
[&](SymbolID name, uint32_t length, bool isUTC, NativeFunctionPtr func) {
defineMethod(
runtime,
datePrototype,
name,
reinterpret_cast<void *>(isUTC),
func,
length);
};
defineSetterMethod(
Predefined::getSymbolID(Predefined::setMilliseconds),
1,
false,
datePrototypeSetMilliseconds);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setUTCMilliseconds),
1,
true,
datePrototypeSetMilliseconds);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setSeconds),
2,
false,
datePrototypeSetSeconds);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setUTCSeconds),
2,
true,
datePrototypeSetSeconds);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setMinutes),
3,
false,
datePrototypeSetMinutes);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setUTCMinutes),
3,
true,
datePrototypeSetMinutes);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setHours),
4,
false,
datePrototypeSetHours);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setUTCHours),
4,
true,
datePrototypeSetHours);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setDate),
1,
false,
datePrototypeSetDate);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setUTCDate),
1,
true,
datePrototypeSetDate);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setMonth),
2,
false,
datePrototypeSetMonth);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setUTCMonth),
2,
true,
datePrototypeSetMonth);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setFullYear),
3,
false,
datePrototypeSetFullYear);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setUTCFullYear),
3,
true,
datePrototypeSetFullYear);
defineSetterMethod(
Predefined::getSymbolID(Predefined::setYear),
1,
false,
datePrototypeSetYear);
defineMethod(
runtime,
datePrototype,
Predefined::getSymbolID(Predefined::toJSON),
nullptr,
datePrototypeToJSON,
1);
DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
dpf.writable = 0;
dpf.enumerable = 0;
(void)defineMethod(
runtime,
datePrototype,
Predefined::getSymbolID(Predefined::SymbolToPrimitive),
Predefined::getSymbolID(Predefined::squareSymbolToPrimitive),
nullptr,
datePrototypeSymbolToPrimitive,
1,
dpf);
// Date.xxx() methods.
defineMethod(
runtime,
cons,
Predefined::getSymbolID(Predefined::parse),
nullptr,
dateParse,
1);
defineMethod(
runtime,
cons,
Predefined::getSymbolID(Predefined::UTC),
nullptr,
dateUTC,
7);
defineMethod(
runtime,
cons,
Predefined::getSymbolID(Predefined::now),
nullptr,
dateNow,
0);
return cons;
}