| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- #include "RuntimeLibraryPch.h"
- #include "Library/EngineInterfaceObject.h"
- #include "Library/IntlEngineInterfaceExtensionObject.h"
- namespace Js
- {
- JavascriptDate::JavascriptDate(double value, DynamicType * type)
- : DynamicObject(type), m_date(value)
- {
- Assert(IsDateTypeId(type->GetTypeId()));
- }
- JavascriptDate::JavascriptDate(DynamicType * type)
- : DynamicObject(type), m_date(0)
- {
- Assert(type->GetTypeId() == TypeIds_Date);
- }
- bool JavascriptDate::Is(Var aValue)
- {
- // All WinRT Date's are also implicitly Javascript dates
- return IsDateTypeId(JavascriptOperators::GetTypeId(aValue));
- }
- JavascriptDate* JavascriptDate::FromVar(Var aValue)
- {
- AssertOrFailFastMsg(Is(aValue), "Ensure var is actually a 'Date'");
- return static_cast<JavascriptDate *>(aValue);
- }
- JavascriptDate* JavascriptDate::UnsafeFromVar(Var aValue)
- {
- AssertMsg(Is(aValue), "Ensure var is actually a 'Date'");
- return static_cast<JavascriptDate *>(aValue);
- }
- Var JavascriptDate::GetDateData(JavascriptDate* date, DateImplementation::DateData dd, ScriptContext* scriptContext)
- {
- return JavascriptNumber::ToVarIntCheck(date->m_date.GetDateData(dd, false, scriptContext), scriptContext);
- }
- Var JavascriptDate::GetUTCDateData(JavascriptDate* date, DateImplementation::DateData dd, ScriptContext* scriptContext)
- {
- return JavascriptNumber::ToVarIntCheck(date->m_date.GetDateData(dd, true, scriptContext), scriptContext);
- }
- Var JavascriptDate::SetDateData(JavascriptDate* date, Arguments args, DateImplementation::DateData dd, ScriptContext* scriptContext)
- {
- return JavascriptNumber::ToVarNoCheck(date->m_date.SetDateData(args, dd, false, scriptContext), scriptContext);
- }
- Var JavascriptDate::SetUTCDateData(JavascriptDate* date, Arguments args, DateImplementation::DateData dd, ScriptContext* scriptContext)
- {
- return JavascriptNumber::ToVarNoCheck(date->m_date.SetDateData(args, dd, true, scriptContext), scriptContext);
- }
- Var JavascriptDate::NewInstance(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- //
- // Determine if called as a constructor or a function.
- //
- AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
- // SkipDefaultNewObject function flag should have prevented the default object from
- // being created, except when call true a host dispatch.
- Var newTarget = args.GetNewTarget();
- bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args);
- if (!(callInfo.Flags & CallFlags_New))
- {
- //
- // Called as a function.
- //
- //
- // Be sure the latest time zone info is loaded
- //
- // ES5 15.9.2.1: Date() should returns a string exactly the same as (new Date().toString()).
- JavascriptDate* pDate = NewInstanceAsConstructor(args, scriptContext, /* forceCurrentDate */ true);
- JavascriptString* res = JavascriptDate::ToString(pDate, scriptContext);
- #if ENABLE_TTD
- if(scriptContext->ShouldPerformReplayAction())
- {
- scriptContext->GetThreadContext()->TTDLog->ReplayDateStringEvent(scriptContext, &res);
- }
- else if(scriptContext->ShouldPerformRecordAction())
- {
- scriptContext->GetThreadContext()->TTDLog->RecordDateStringEvent(res);
- }
- else
- {
- ;
- }
- #endif
- return res;
- }
- else
- {
- //
- // Called as a constructor.
- //
- RecyclableObject* pNew = NewInstanceAsConstructor(args, scriptContext);
- return isCtorSuperCall ?
- JavascriptOperators::OrdinaryCreateFromConstructor(RecyclableObject::FromVar(newTarget), pNew, nullptr, scriptContext) :
- pNew;
- }
- }
- JavascriptDate* JavascriptDate::NewInstanceAsConstructor(Js::Arguments args, ScriptContext* scriptContext, bool forceCurrentDate)
- {
- Assert(scriptContext);
- double timeValue = 0;
- JavascriptDate* pDate;
- pDate = scriptContext->GetLibrary()->CreateDate();
- //
- // [15.9.3.3]
- // No arguments passed. Return the current time
- //
- if (forceCurrentDate || args.Info.Count == 1)
- {
- double resTime = DateImplementation::NowFromHiResTimer(scriptContext);
- #if ENABLE_TTD
- if(scriptContext->ShouldPerformReplayAction())
- {
- scriptContext->GetThreadContext()->TTDLog->ReplayDateTimeEvent(&resTime);
- }
- else if(scriptContext->ShouldPerformRecordAction())
- {
- scriptContext->GetThreadContext()->TTDLog->RecordDateTimeEvent(resTime);
- }
- else
- {
- ;
- }
- #endif
- pDate->m_date.SetTvUtc(resTime);
- return pDate;
- }
- //
- // [15.9.3.2]
- // One argument given
- // If string parse it and use that timeValue
- // Else convert to Number and use that as timeValue
- //
- if (args.Info.Count == 2)
- {
- if (JavascriptDate::Is(args[1]))
- {
- JavascriptDate* dateObject = JavascriptDate::FromVar(args[1]);
- timeValue = ((dateObject)->m_date).m_tvUtc;
- }
- else
- {
- Var value = JavascriptConversion::ToPrimitive<Js::JavascriptHint::None>(args[1], scriptContext);
- if (JavascriptString::Is(value))
- {
- timeValue = ParseHelper(scriptContext, JavascriptString::FromVar(value));
- }
- else
- {
- timeValue = JavascriptConversion::ToNumber(value, scriptContext);
- }
- }
- pDate->m_date.SetTvUtc(timeValue);
- return pDate;
- }
- //
- // [15.9.3.1]
- // Date called with two to seven arguments
- //
- const int parameterCount = 7;
- double values[parameterCount];
- for (uint i=1; i < args.Info.Count && i < parameterCount+1; i++)
- {
- double curr = JavascriptConversion::ToNumber(args[i], scriptContext);
- values[i-1] = curr;
- if (JavascriptNumber::IsNan(curr) || !NumberUtilities::IsFinite(curr))
- {
- pDate->m_date.SetTvUtc(curr);
- return pDate;
- }
- }
- for (uint i=0; i < parameterCount; i++)
- {
- if ( i >= args.Info.Count-1 )
- {
- values[i] = ( i == 2 );
- continue;
- }
- // MakeTime (ES5 15.9.1.11) && MakeDay (ES5 15.9.1.12) always
- // call ToInteger (which is same as JavascriptConversion::ToInteger) on arguments.
- // All are finite (not Inf or Nan) as we check them explicitly in the previous loop.
- // +-0 & +0 are same in this context.
- #pragma prefast(suppress:6001, "value index i < args.Info.Count - 1 are initialized")
- values[i] = JavascriptConversion::ToInteger(values[i]);
- }
- // adjust the year
- if (values[0] < 100 && values[0] >= 0)
- values[0] += 1900;
- // Get the local time value.
- timeValue = DateImplementation::TvFromDate(values[0], values[1], values[2] - 1,
- values[3] * 3600000 + values[4] * 60000 + values[5] * 1000 + values[6]);
- // Set the time.
- pDate->m_date.SetTvLcl(timeValue, scriptContext);
- return pDate;
- }
- // Date.prototype[@@toPrimitive] as described in ES6 spec (Draft May 22, 2014) 20.3.4.45
- Var JavascriptDate::EntrySymbolToPrimitive(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- // One argument given will be hint
- //The allowed values for hint are "default", "number", and "string"
- if (args.Info.Count == 2)
- {
- if (!JavascriptOperators::IsObjectType(JavascriptOperators::GetTypeId(args[0])))
- {
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedObject, _u("Date[Symbol.toPrimitive]"));
- }
- if (JavascriptString::Is(args[1]))
- {
- JavascriptString* StringObject = JavascriptString::FromVar(args[1]);
- const char16 * str = StringObject->GetString();
- if (wcscmp(str, _u("default")) == 0 || wcscmp(str, _u("string")) == 0)
- {
- // Date objects, are unique among built-in ECMAScript object in that they treat "default" as being equivalent to "string"
- // If hint is the string value "string" or the string value "default", then
- // Let tryFirst be "string".
- return JavascriptConversion::OrdinaryToPrimitive<JavascriptHint::HintString>(RecyclableObject::UnsafeFromVar(args[0]), scriptContext);
- }
- // Else if hint is the string value "number", then
- // Let tryFirst be "number".
- else if(wcscmp(str, _u("number")) == 0)
- {
- return JavascriptConversion::OrdinaryToPrimitive<JavascriptHint::HintNumber>(RecyclableObject::UnsafeFromVar(args[0]), scriptContext);
- }
- //anything else should throw a type error
- }
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_InvalidHint, _u("Date[Symbol.toPrimitive]"));
- }
- Var JavascriptDate::EntryGetDate(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetDate, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getDate"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- if (!date->m_date.IsNaN())
- {
- return date->m_date.GetDate(scriptContext);
- }
- return scriptContext->GetLibrary()->GetNaN();
- }
- Var JavascriptDate::EntryGetDay(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetDay, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getDay"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- if (!date->m_date.IsNaN())
- {
- return date->m_date.GetDay(scriptContext);
- }
- return scriptContext->GetLibrary()->GetNaN();
- }
- Var JavascriptDate::EntryGetFullYear(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetFullYear, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getFullYear"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- if (!date->m_date.IsNaN())
- {
- return date->m_date.GetFullYear(scriptContext);
- }
- return scriptContext->GetLibrary()->GetNaN();
- }
- Var JavascriptDate::EntryGetYear(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetYear, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getYear"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- if (!date->m_date.IsNaN())
- {
- return date->m_date.GetYear(scriptContext);
- }
- return scriptContext->GetLibrary()->GetNaN();
- }
- Var JavascriptDate::EntryGetHours(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetHours, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getHours"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- if (!date->m_date.IsNaN())
- {
- return date->m_date.GetHours(scriptContext);
- }
- return scriptContext->GetLibrary()->GetNaN();
- }
- Var JavascriptDate::EntryGetMilliseconds(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetMilliseconds, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getMilliseconds"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- if (!date->m_date.IsNaN())
- {
- return date->m_date.GetDateMilliSeconds(scriptContext);
- }
- return scriptContext->GetLibrary()->GetNaN();
- }
- Var JavascriptDate::EntryGetMinutes(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetMinutes, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getMinutes"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- if (!date->m_date.IsNaN())
- {
- return date->m_date.GetMinutes(scriptContext);
- }
- return scriptContext->GetLibrary()->GetNaN();
- }
- Var JavascriptDate::EntryGetMonth(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetMonth, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getMonth"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- if (!date->m_date.IsNaN())
- {
- return date->m_date.GetMonth(scriptContext);
- }
- return scriptContext->GetLibrary()->GetNaN();
- }
- Var JavascriptDate::EntryGetSeconds(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetSeconds, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getSeconds"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- if (!date->m_date.IsNaN())
- {
- return date->m_date.GetSeconds(scriptContext);
- }
- return scriptContext->GetLibrary()->GetNaN();
- }
- Var JavascriptDate::EntryGetTime(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetTime, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getTime"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptNumber::ToVarNoCheck(date->GetTime(), scriptContext);
- }
- Var JavascriptDate::EntryGetTimezoneOffset(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetTimezoneOffset, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getTimezoneOffset"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::GetDateData(date, DateImplementation::DateData::TimezoneOffset, scriptContext);
- }
- Var JavascriptDate::EntryGetUTCDate(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetUTCDate, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCDate"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Date, scriptContext);
- }
- Var JavascriptDate::EntryGetUTCDay(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetUTCDay, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCDay"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Day, scriptContext);
- }
- Var JavascriptDate::EntryGetUTCFullYear(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetUTCFullYear, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCFullYear"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::FullYear, scriptContext);
- }
- Var JavascriptDate::EntryGetUTCHours(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetUTCHours, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCHours"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Hours, scriptContext);
- }
- Var JavascriptDate::EntryGetUTCMilliseconds(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetUTCMilliseconds, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCMilliseconds"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Milliseconds, scriptContext);
- }
- Var JavascriptDate::EntryGetUTCMinutes(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetUTCMinutes, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCMinutes"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Minutes, scriptContext);
- }
- Var JavascriptDate::EntryGetUTCMonth(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetUTCMonth, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCMonth"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Month, scriptContext);
- }
- Var JavascriptDate::EntryGetUTCSeconds(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetUTCSeconds, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCSeconds"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Seconds, scriptContext);
- }
- Var JavascriptDate::EntryGetVarDate(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryGetVarDate, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getVarDate"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return scriptContext->GetLibrary()->CreateVariantDate(
- DateImplementation::VarDateFromJsUtcTime(date->GetTime(), scriptContext)
- );
- }
- Var JavascriptDate::EntryParse(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- double dblRetVal = JavascriptNumber::NaN;
- if (args.Info.Count > 1)
- {
- // We convert to primitive value based on hint == String, which JavascriptConversion::ToString does.
- JavascriptString *pParseString = JavascriptConversion::ToString(args[1], scriptContext);
- dblRetVal = ParseHelper(scriptContext, pParseString);
- }
- return JavascriptNumber::ToVarNoCheck(dblRetVal,scriptContext);
- }
- Var JavascriptDate::EntryNow(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- double dblRetVal = DateImplementation::NowInMilliSeconds(scriptContext);
- #if ENABLE_TTD
- if(scriptContext->ShouldPerformReplayAction())
- {
- scriptContext->GetThreadContext()->TTDLog->ReplayDateTimeEvent(&dblRetVal);
- }
- else if(scriptContext->ShouldPerformRecordAction())
- {
- scriptContext->GetThreadContext()->TTDLog->RecordDateTimeEvent(dblRetVal);
- }
- else
- {
- ;
- }
- #endif
- return JavascriptNumber::ToVarNoCheck(dblRetVal,scriptContext);
- }
- Var JavascriptDate::EntryUTC(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- double dblRetVal = DateImplementation::DateFncUTC(scriptContext, args);
- return JavascriptNumber::ToVarNoCheck(dblRetVal, scriptContext);
- }
- double JavascriptDate::ParseHelper(ScriptContext *scriptContext, JavascriptString *str)
- {
- return DateImplementation::UtcTimeFromStr(scriptContext, str);
- }
- Var JavascriptDate::EntrySetDate(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetDate, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setDate"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Date, scriptContext);
- }
- Var JavascriptDate::EntrySetFullYear(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetFullYear, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setFullYear"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::FullYear, scriptContext);
- }
- Var JavascriptDate::EntrySetYear(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetYear, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setYear"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Year, scriptContext);
- }
- Var JavascriptDate::EntrySetHours(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetHours, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setHours"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Hours, scriptContext);
- }
- Var JavascriptDate::EntrySetMilliseconds(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetMilliseconds, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setMilliseconds"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Milliseconds, scriptContext);
- }
- Var JavascriptDate::EntrySetMinutes(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetMinutes, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setMinutes"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Minutes, scriptContext);
- }
- Var JavascriptDate::EntrySetMonth(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetMonth, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setMonth"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Month, scriptContext);
- }
- Var JavascriptDate::EntrySetSeconds(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetSeconds, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setSeconds"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Seconds, scriptContext);
- }
- Var JavascriptDate::EntrySetTime(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetTime, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setTime"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- AssertMsg(args.Info.Count > 0, "Negative argument count");
- double value;
- if (args.Info.Count > 1)
- {
- value = JavascriptConversion::ToNumber(args[1], scriptContext);
- if (Js::NumberUtilities::IsFinite(value))
- {
- value = JavascriptConversion::ToInteger(value);
- }
- }
- else
- {
- value = JavascriptNumber::NaN;
- }
- date->m_date.SetTvUtc(value);
- return JavascriptNumber::ToVarNoCheck(value, scriptContext);
- }
- Var JavascriptDate::EntrySetUTCDate(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetUTCDate, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCDate"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Date, scriptContext);
- }
- Var JavascriptDate::EntrySetUTCFullYear(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetUTCFullYear, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCFullYear"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::FullYear, scriptContext);
- }
- Var JavascriptDate::EntrySetUTCHours(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetUTCHours, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCHours"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Hours, scriptContext);
- }
- Var JavascriptDate::EntrySetUTCMilliseconds(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetUTCMilliseconds, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCMilliseconds"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Milliseconds, scriptContext);
- }
- Var JavascriptDate::EntrySetUTCMinutes(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetUTCMinutes, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCMinutes"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Minutes, scriptContext);
- }
- Var JavascriptDate::EntrySetUTCMonth(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetUTCMonth, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCMonth"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Month, scriptContext);
- }
- Var JavascriptDate::EntrySetUTCSeconds(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntrySetUTCSeconds, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCSeconds"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Seconds, scriptContext);
- }
- Var JavascriptDate::EntryToDateString(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryToDateString, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toDateString"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- AssertMsg(args.Info.Count > 0, "Negative argument count");
- return date->m_date.GetString(
- DateImplementation::DateStringFormat::Default, scriptContext,
- DateImplementation::DateTimeFlag::NoTime);
- }
- Var JavascriptDate::EntryToISOString(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT(Date_Prototype_toISOString);
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryToISOString, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toISOString"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- AssertMsg(args.Info.Count > 0, "Negative argument count");
- return date->m_date.GetISOString(scriptContext);
- }
- Var JavascriptDate::EntryToJSON(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0)
- {
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedObject, _u("Data.prototype.toJSON"));
- }
- RecyclableObject* thisObj = nullptr;
- if (FALSE == JavascriptConversion::ToObject(args[0], scriptContext, &thisObj))
- {
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NullOrUndefined, _u("Date.prototype.toJSON"));
- }
- Var result = nullptr;
- if (TryInvokeRemotely(EntryToJSON, scriptContext, args, &result))
- {
- return result;
- }
- Var num = JavascriptConversion::ToPrimitive<JavascriptHint::HintNumber>(thisObj, scriptContext);
- if (JavascriptNumber::Is(num)
- && !NumberUtilities::IsFinite(JavascriptNumber::GetValue(num)))
- {
- return scriptContext->GetLibrary()->GetNull();
- }
- Var toISO = JavascriptOperators::GetProperty(thisObj, PropertyIds::toISOString, scriptContext, NULL);
- if (!JavascriptConversion::IsCallable(toISO))
- {
- JavascriptError::ThrowTypeError(scriptContext, JSERR_Property_NeedFunction, scriptContext->GetPropertyName(PropertyIds::toISOString)->GetBuffer());
- }
- RecyclableObject* toISOFunc = RecyclableObject::FromVar(toISO);
- return CALL_FUNCTION(scriptContext->GetThreadContext(), toISOFunc, CallInfo(1), thisObj);
- }
- Var JavascriptDate::EntryToLocaleDateString(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryToLocaleDateString, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toLocaleDateString"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- #ifdef ENABLE_INTL_OBJECT
- if (CONFIG_FLAG(IntlBuiltIns) && scriptContext->IsIntlEnabled()){
- EngineInterfaceObject* nativeEngineInterfaceObj = scriptContext->GetLibrary()->GetEngineInterfaceObject();
- if (nativeEngineInterfaceObj)
- {
- IntlEngineInterfaceExtensionObject* extensionObject = static_cast<IntlEngineInterfaceExtensionObject*>(nativeEngineInterfaceObj->GetEngineExtension(EngineInterfaceExtensionKind_Intl));
- JavascriptFunction* func = extensionObject->GetDateToLocaleDateString();
- if (func)
- {
- return func->CallFunction(args);
- }
- // Initialize Date.prototype.toLocaleDateString
- scriptContext->GetLibrary()->InitializeIntlForDatePrototype();
- func = extensionObject->GetDateToLocaleDateString();
- if (func)
- {
- return func->CallFunction(args);
- }
- }
- }
- #endif
- AssertMsg(args.Info.Count > 0, "Negative argument count");
- return date->m_date.GetString(
- DateImplementation::DateStringFormat::Locale, scriptContext,
- DateImplementation::DateTimeFlag::NoTime);
- }
- Var JavascriptDate::EntryToLocaleString(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryToLocaleString, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toLocaleString"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- #ifdef ENABLE_INTL_OBJECT
- if (CONFIG_FLAG(IntlBuiltIns) && scriptContext->IsIntlEnabled()){
- EngineInterfaceObject* nativeEngineInterfaceObj = scriptContext->GetLibrary()->GetEngineInterfaceObject();
- if (nativeEngineInterfaceObj)
- {
- IntlEngineInterfaceExtensionObject* extensionObject = static_cast<IntlEngineInterfaceExtensionObject*>(nativeEngineInterfaceObj->GetEngineExtension(EngineInterfaceExtensionKind_Intl));
- JavascriptFunction* func = extensionObject->GetDateToLocaleString();
- if (func)
- {
- return func->CallFunction(args);
- }
- // Initialize Date.prototype.toLocaleString
- scriptContext->GetLibrary()->InitializeIntlForDatePrototype();
- func = extensionObject->GetDateToLocaleString();
- if (func)
- {
- return func->CallFunction(args);
- }
- }
- }
- #endif
- AssertMsg(args.Info.Count > 0, "Negative argument count");
- return JavascriptDate::ToLocaleString(date, scriptContext);
- }
- JavascriptString* JavascriptDate::ToLocaleString(JavascriptDate* date,
- ScriptContext* requestContext)
- {
- return date->m_date.GetString(DateImplementation::DateStringFormat::Locale, requestContext);
- }
- JavascriptString* JavascriptDate::ToString(JavascriptDate* date,
- ScriptContext* requestContext)
- {
- Assert(date);
- return date->m_date.GetString(DateImplementation::DateStringFormat::Default, requestContext);
- }
- Var JavascriptDate::EntryToLocaleTimeString(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryToLocaleTimeString, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toLocaleTimeString"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- #ifdef ENABLE_INTL_OBJECT
- if (CONFIG_FLAG(IntlBuiltIns) && scriptContext->IsIntlEnabled()){
- EngineInterfaceObject* nativeEngineInterfaceObj = scriptContext->GetLibrary()->GetEngineInterfaceObject();
- if (nativeEngineInterfaceObj)
- {
- IntlEngineInterfaceExtensionObject* extensionObject = static_cast<IntlEngineInterfaceExtensionObject*>(nativeEngineInterfaceObj->GetEngineExtension(EngineInterfaceExtensionKind_Intl));
- JavascriptFunction* func = extensionObject->GetDateToLocaleTimeString();
- if (func)
- {
- return func->CallFunction(args);
- }
- // Initialize Date.prototype.toLocaleTimeString
- scriptContext->GetLibrary()->InitializeIntlForDatePrototype();
- func = extensionObject->GetDateToLocaleTimeString();
- if (func)
- {
- return func->CallFunction(args);
- }
- }
- }
- #endif
- AssertMsg(args.Info.Count > 0, "Negative argument count");
- return date->m_date.GetString(
- DateImplementation::DateStringFormat::Locale, scriptContext,
- DateImplementation::DateTimeFlag::NoDate);
- }
- Var JavascriptDate::EntryToTimeString(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryToTimeString, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toTimeString"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- AssertMsg(args.Info.Count > 0, "Negative argument count");
- return date->m_date.GetString(
- DateImplementation::DateStringFormat::Default, scriptContext,
- DateImplementation::DateTimeFlag::NoDate);
- }
- Var JavascriptDate::EntryToUTCString(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryToUTCString, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toUTCString"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- AssertMsg(args.Info.Count > 0, "Negative argument count");
- return date->m_date.GetString(
- DateImplementation::DateStringFormat::GMT, scriptContext,
- DateImplementation::DateTimeFlag::None);
- }
- Var JavascriptDate::EntryValueOf(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryValueOf, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.valueOf"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- AssertMsg(args.Info.Count > 0, "Negative argument count");
- double value = date->m_date.GetMilliSeconds();
- return JavascriptNumber::ToVarNoCheck(value, scriptContext);
- }
- Var JavascriptDate::EntryToString(RecyclableObject* function, CallInfo callInfo, ...)
- {
- PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
- ARGUMENTS(args, callInfo);
- ScriptContext* scriptContext = function->GetScriptContext();
- Assert(!(callInfo.Flags & CallFlags_New));
- if (args.Info.Count == 0 || !JavascriptDate::Is(args[0]))
- {
- Var result = nullptr;
- if (TryInvokeRemotely(EntryToString, scriptContext, args, &result))
- {
- return result;
- }
- JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toString"));
- }
- JavascriptDate* date = JavascriptDate::FromVar(args[0]);
- AssertMsg(args.Info.Count > 0, "Negative argument count");
- return JavascriptDate::ToString(date, scriptContext);
- }
- BOOL JavascriptDate::TryInvokeRemotely(JavascriptMethod entryPoint, ScriptContext * scriptContext, Arguments & args, Var * result)
- {
- if (JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch)
- {
- if (RecyclableObject::FromVar(args[0])->InvokeBuiltInOperationRemotely(entryPoint, args, result))
- {
- return TRUE;
- }
- }
- return FALSE;
- }
- #if ENABLE_TTD
- TTD::NSSnapObjects::SnapObjectType JavascriptDate::GetSnapTag_TTD() const
- {
- return TTD::NSSnapObjects::SnapObjectType::SnapDateObject;
- }
- void JavascriptDate::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc)
- {
- TTDAssert(this->GetTypeId() == TypeIds_Date, "We don't handle WinRT or other types of dates yet!");
- double* millis = alloc.SlabAllocateStruct<double>();
- *millis = m_date.GetMilliSeconds();
- TTD::NSSnapObjects::StdExtractSetKindSpecificInfo<double*, TTD::NSSnapObjects::SnapObjectType::SnapDateObject>(objData, millis);
- }
- #endif
- BOOL JavascriptDate::ToPrimitive(JavascriptHint hint, Var* result, ScriptContext * requestContext)
- {
- if (hint == JavascriptHint::None)
- {
- hint = JavascriptHint::HintString;
- }
- return DynamicObject::ToPrimitive(hint, result, requestContext);
- }
- BOOL JavascriptDate::GetDiagValueString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext)
- {
- ENTER_PINNED_SCOPE(JavascriptString, valueStr);
- valueStr = this->m_date.GetString(
- DateImplementation::DateStringFormat::Default, requestContext);
- stringBuilder->Append(valueStr->GetString(), valueStr->GetLength());
- LEAVE_PINNED_SCOPE();
- return TRUE;
- }
- BOOL JavascriptDate::GetDiagTypeString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext)
- {
- stringBuilder->AppendCppLiteral(_u("Object, (Date)"));
- return TRUE;
- }
- } // namespace Js
|