// ECMA 15.9.3 JSObject* constructDate(ExecState* exec, JSGlobalObject* globalObject, JSValue newTarget, const ArgList& args) { VM& vm = exec->vm(); int numArgs = args.size(); double value; if (numArgs == 0) // new Date() ECMA 15.9.3.3 value = NORMAL_OR_DETERMINISTIC_FUNCTION(jsCurrentTime(), deterministicCurrentTime(globalObject)); else if (numArgs == 1) { if (args.at(0).inherits(DateInstance::info())) value = asDateInstance(args.at(0))->internalNumber(); else { JSValue primitive = args.at(0).toPrimitive(exec); if (primitive.isString()) value = parseDate(vm, primitive.getString(exec)); else value = primitive.toNumber(exec); } } else value = millisecondsFromComponents(exec, args, WTF::LocalTime); Structure* dateStructure = InternalFunction::createSubclassStructure(exec, newTarget, globalObject->dateStructure()); return DateInstance::create(vm, dateStructure, value); }
static inline int minimumYearForDST() { // Because of the 2038 issue (see maximumYearForDST) if the current year is // greater than the max year minus 27 (2010), we want to use the max year // minus 27 instead, to ensure there is a range of 28 years that all years // can map to. return std::min(msToYear(jsCurrentTime()), maximumYearForDST() - 27) ; }
EncodedJSValue JSC_HOST_CALL dateNow(ExecState* exec) { #if !ENABLE(WEB_REPLAY) UNUSED_PARAM(exec); #endif return JSValue::encode(jsNumber(NORMAL_OR_DETERMINISTIC_FUNCTION(jsCurrentTime(), deterministicCurrentTime(exec->lexicalGlobalObject())))); }
// ECMA 15.9.3 JSObject* constructDate(ExecState* exec, JSGlobalObject* globalObject, const ArgList& args) { VM& vm = exec->vm(); int numArgs = args.size(); double value; if (numArgs == 0) // new Date() ECMA 15.9.3.3 value = jsCurrentTime(); else if (numArgs == 1) { if (args.at(0).inherits(DateInstance::info())) value = asDateInstance(args.at(0))->internalNumber(); else { JSValue primitive = args.at(0).toPrimitive(exec); if (primitive.isString()) value = parseDate(vm, primitive.getString(exec)); else value = primitive.toNumber(exec); } } else { double doubleArguments[7] = { args.at(0).toNumber(exec), args.at(1).toNumber(exec), args.at(2).toNumber(exec), args.at(3).toNumber(exec), args.at(4).toNumber(exec), args.at(5).toNumber(exec), args.at(6).toNumber(exec) }; if (!std::isfinite(doubleArguments[0]) || !std::isfinite(doubleArguments[1]) || (numArgs >= 3 && !std::isfinite(doubleArguments[2])) || (numArgs >= 4 && !std::isfinite(doubleArguments[3])) || (numArgs >= 5 && !std::isfinite(doubleArguments[4])) || (numArgs >= 6 && !std::isfinite(doubleArguments[5])) || (numArgs >= 7 && !std::isfinite(doubleArguments[6]))) value = QNaN; else { GregorianDateTime t; int year = JSC::toInt32(doubleArguments[0]); t.setYear((year >= 0 && year <= 99) ? (year + 1900) : year); t.setMonth(JSC::toInt32(doubleArguments[1])); t.setMonthDay((numArgs >= 3) ? JSC::toInt32(doubleArguments[2]) : 1); t.setHour(JSC::toInt32(doubleArguments[3])); t.setMinute(JSC::toInt32(doubleArguments[4])); t.setSecond(JSC::toInt32(doubleArguments[5])); t.setIsDST(-1); double ms = (numArgs >= 7) ? doubleArguments[6] : 0; value = gregorianDateTimeToMS(vm, t, ms, false); } } return DateInstance::create(vm, globalObject->dateStructure(), value); }
// ECMA 15.9.3 JSObject* constructDate(ExecState* exec, JSGlobalObject* globalObject, const ArgList& args) { int numArgs = args.size(); double value; if (numArgs == 0) // new Date() ECMA 15.9.3.3 value = jsCurrentTime(); else if (numArgs == 1) { if (args.at(0).inherits(&DateInstance::s_info)) value = asDateInstance(args.at(0))->internalNumber(); else { JSValue primitive = args.at(0).toPrimitive(exec); if (primitive.isString()) value = parseDate(exec, primitive.getString(exec)); else value = primitive.toNumber(exec); } } else { double doubleArguments[7] = { args.at(0).toNumber(exec), args.at(1).toNumber(exec), args.at(2).toNumber(exec), args.at(3).toNumber(exec), args.at(4).toNumber(exec), args.at(5).toNumber(exec), args.at(6).toNumber(exec) }; if (isnan(doubleArguments[0]) || isnan(doubleArguments[1]) || (numArgs >= 3 && isnan(doubleArguments[2])) || (numArgs >= 4 && isnan(doubleArguments[3])) || (numArgs >= 5 && isnan(doubleArguments[4])) || (numArgs >= 6 && isnan(doubleArguments[5])) || (numArgs >= 7 && isnan(doubleArguments[6]))) value = NaN; else { GregorianDateTime t; int year = JSC::toInt32(doubleArguments[0]); t.year = (year >= 0 && year <= 99) ? year : year - 1900; t.month = JSC::toInt32(doubleArguments[1]); t.monthDay = (numArgs >= 3) ? JSC::toInt32(doubleArguments[2]) : 1; t.hour = JSC::toInt32(doubleArguments[3]); t.minute = JSC::toInt32(doubleArguments[4]); t.second = JSC::toInt32(doubleArguments[5]); t.isDST = -1; double ms = (numArgs >= 7) ? doubleArguments[6] : 0; value = gregorianDateTimeToMS(exec, t, ms, false); } } return new (exec) DateInstance(exec, globalObject->dateStructure(), value); }
static double deterministicCurrentTime(JSGlobalObject* globalObject) { double currentTime = jsCurrentTime(); InputCursor& cursor = globalObject->inputCursor(); if (cursor.isCapturing()) cursor.appendInput<GetCurrentTime>(currentTime); if (cursor.isReplaying()) { if (GetCurrentTime* input = cursor.fetchInput<GetCurrentTime>()) currentTime = input->currentTime(); } return currentTime; }
// ECMA 15.9.3 AJObject* constructDate(ExecState* exec, const ArgList& args) { int numArgs = args.size(); double value; if (numArgs == 0) // new Date() ECMA 15.9.3.3 value = jsCurrentTime(); else if (numArgs == 1) { if (args.at(0).inherits(&DateInstance::info)) value = asDateInstance(args.at(0))->internalNumber(); else { AJValue primitive = args.at(0).toPrimitive(exec); if (primitive.isString()) value = parseDate(exec, primitive.getString(exec)); else value = primitive.toNumber(exec); } } else { if (isnan(args.at(0).toNumber(exec)) || isnan(args.at(1).toNumber(exec)) || (numArgs >= 3 && isnan(args.at(2).toNumber(exec))) || (numArgs >= 4 && isnan(args.at(3).toNumber(exec))) || (numArgs >= 5 && isnan(args.at(4).toNumber(exec))) || (numArgs >= 6 && isnan(args.at(5).toNumber(exec))) || (numArgs >= 7 && isnan(args.at(6).toNumber(exec)))) value = NaN; else { GregorianDateTime t; int year = args.at(0).toInt32(exec); t.year = (year >= 0 && year <= 99) ? year : year - 1900; t.month = args.at(1).toInt32(exec); t.monthDay = (numArgs >= 3) ? args.at(2).toInt32(exec) : 1; t.hour = args.at(3).toInt32(exec); t.minute = args.at(4).toInt32(exec); t.second = args.at(5).toInt32(exec); t.isDST = -1; double ms = (numArgs >= 7) ? args.at(6).toNumber(exec) : 0; value = gregorianDateTimeToMS(exec, t, ms, false); } } return new (exec) DateInstance(exec, value); }
static EncodedJSValue JSC_HOST_CALL dateNow(ExecState*) { return JSValue::encode(jsNumber(jsCurrentTime())); }
static AJValue JSC_HOST_CALL dateNow(ExecState* exec, AJObject*, AJValue, const ArgList&) { return jsNumber(exec, jsCurrentTime()); }
static TiValue JSC_HOST_CALL dateNow(TiExcState* exec, TiObject*, TiValue, const ArgList&) { return jsNumber(exec, jsCurrentTime()); }