JavascriptDate.cpp 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #include "RuntimeLibraryPch.h"
  6. #include "Library/EngineInterfaceObject.h"
  7. #include "Library/IntlEngineInterfaceExtensionObject.h"
  8. namespace Js
  9. {
  10. JavascriptDate::JavascriptDate(double value, DynamicType * type)
  11. : DynamicObject(type), m_date(value)
  12. {
  13. Assert(type->GetTypeId() == TypeIds_Date);
  14. }
  15. JavascriptDate::JavascriptDate(DynamicType * type)
  16. : DynamicObject(type), m_date(0)
  17. {
  18. Assert(type->GetTypeId() == TypeIds_Date);
  19. }
  20. Var JavascriptDate::GetDateData(JavascriptDate* date, DateImplementation::DateData dd, ScriptContext* scriptContext)
  21. {
  22. return JavascriptNumber::ToVarIntCheck(date->m_date.GetDateData(dd, false, scriptContext), scriptContext);
  23. }
  24. Var JavascriptDate::GetUTCDateData(JavascriptDate* date, DateImplementation::DateData dd, ScriptContext* scriptContext)
  25. {
  26. return JavascriptNumber::ToVarIntCheck(date->m_date.GetDateData(dd, true, scriptContext), scriptContext);
  27. }
  28. Var JavascriptDate::SetDateData(JavascriptDate* date, Arguments args, DateImplementation::DateData dd, ScriptContext* scriptContext)
  29. {
  30. return JavascriptNumber::ToVarNoCheck(date->m_date.SetDateData(args, dd, false, scriptContext), scriptContext);
  31. }
  32. Var JavascriptDate::SetUTCDateData(JavascriptDate* date, Arguments args, DateImplementation::DateData dd, ScriptContext* scriptContext)
  33. {
  34. return JavascriptNumber::ToVarNoCheck(date->m_date.SetDateData(args, dd, true, scriptContext), scriptContext);
  35. }
  36. Var JavascriptDate::NewInstance(RecyclableObject* function, CallInfo callInfo, ...)
  37. {
  38. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  39. ARGUMENTS(args, callInfo);
  40. ScriptContext* scriptContext = function->GetScriptContext();
  41. //
  42. // Determine if called as a constructor or a function.
  43. //
  44. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  45. // SkipDefaultNewObject function flag should have prevented the default object from
  46. // being created, except when call true a host dispatch.
  47. Var newTarget = args.GetNewTarget();
  48. bool isCtorSuperCall = JavascriptOperators::GetAndAssertIsConstructorSuperCall(args);
  49. if (!(callInfo.Flags & CallFlags_New))
  50. {
  51. //
  52. // Called as a function.
  53. //
  54. //
  55. // Be sure the latest time zone info is loaded
  56. //
  57. // ES5 15.9.2.1: Date() should returns a string exactly the same as (new Date().toString()).
  58. JavascriptDate* pDate = NewInstanceAsConstructor(args, scriptContext, /* forceCurrentDate */ true);
  59. JavascriptString* res = JavascriptDate::ToString(pDate, scriptContext);
  60. #if ENABLE_TTD
  61. if(scriptContext->ShouldPerformReplayAction())
  62. {
  63. scriptContext->GetThreadContext()->TTDLog->ReplayDateStringEvent(scriptContext, &res);
  64. }
  65. else if(scriptContext->ShouldPerformRecordAction())
  66. {
  67. scriptContext->GetThreadContext()->TTDLog->RecordDateStringEvent(res);
  68. }
  69. else
  70. {
  71. ;
  72. }
  73. #endif
  74. return res;
  75. }
  76. else
  77. {
  78. //
  79. // Called as a constructor.
  80. //
  81. RecyclableObject* pNew = NewInstanceAsConstructor(args, scriptContext);
  82. return isCtorSuperCall ?
  83. JavascriptOperators::OrdinaryCreateFromConstructor(VarTo<RecyclableObject>(newTarget), pNew, nullptr, scriptContext) :
  84. pNew;
  85. }
  86. }
  87. JavascriptDate* JavascriptDate::NewInstanceAsConstructor(Js::Arguments args, ScriptContext* scriptContext, bool forceCurrentDate)
  88. {
  89. Assert(scriptContext);
  90. double timeValue = 0;
  91. JavascriptDate* pDate;
  92. pDate = scriptContext->GetLibrary()->CreateDate();
  93. //
  94. // [15.9.3.3]
  95. // No arguments passed. Return the current time
  96. //
  97. if (forceCurrentDate || args.Info.Count == 1)
  98. {
  99. double resTime = DateImplementation::NowFromHiResTimer(scriptContext);
  100. #if ENABLE_TTD
  101. if(scriptContext->ShouldPerformReplayAction())
  102. {
  103. scriptContext->GetThreadContext()->TTDLog->ReplayDateTimeEvent(&resTime);
  104. }
  105. else if(scriptContext->ShouldPerformRecordAction())
  106. {
  107. scriptContext->GetThreadContext()->TTDLog->RecordDateTimeEvent(resTime);
  108. }
  109. else
  110. {
  111. ;
  112. }
  113. #endif
  114. pDate->m_date.SetTvUtc(resTime);
  115. return pDate;
  116. }
  117. //
  118. // [15.9.3.2]
  119. // One argument given
  120. // If string parse it and use that timeValue
  121. // Else convert to Number and use that as timeValue
  122. //
  123. if (args.Info.Count == 2)
  124. {
  125. if (VarIs<JavascriptDate>(args[1]))
  126. {
  127. JavascriptDate* dateObject = VarTo<JavascriptDate>(args[1]);
  128. timeValue = ((dateObject)->m_date).m_tvUtc;
  129. }
  130. else
  131. {
  132. Var value = JavascriptConversion::ToPrimitive<Js::JavascriptHint::None>(args[1], scriptContext);
  133. if (VarIs<JavascriptString>(value))
  134. {
  135. timeValue = ParseHelper(scriptContext, VarTo<JavascriptString>(value));
  136. }
  137. else
  138. {
  139. timeValue = JavascriptConversion::ToNumber(value, scriptContext);
  140. }
  141. }
  142. pDate->m_date.SetTvUtc(timeValue);
  143. return pDate;
  144. }
  145. //
  146. // [15.9.3.1]
  147. // Date called with two to seven arguments
  148. //
  149. const int parameterCount = 7;
  150. double values[parameterCount];
  151. for (uint i=1; i < args.Info.Count && i < parameterCount+1; i++)
  152. {
  153. double curr = JavascriptConversion::ToNumber(args[i], scriptContext);
  154. values[i-1] = curr;
  155. if (JavascriptNumber::IsNan(curr) || !NumberUtilities::IsFinite(curr))
  156. {
  157. pDate->m_date.SetTvUtc(curr);
  158. return pDate;
  159. }
  160. }
  161. for (uint i=0; i < parameterCount; i++)
  162. {
  163. if ( i >= args.Info.Count-1 )
  164. {
  165. values[i] = ( i == 2 );
  166. continue;
  167. }
  168. // MakeTime (ES5 15.9.1.11) && MakeDay (ES5 15.9.1.12) always
  169. // call ToInteger (which is same as JavascriptConversion::ToInteger) on arguments.
  170. // All are finite (not Inf or Nan) as we check them explicitly in the previous loop.
  171. // +-0 & +0 are same in this context.
  172. #pragma prefast(suppress:6001, "value index i < args.Info.Count - 1 are initialized")
  173. values[i] = JavascriptConversion::ToInteger(values[i]);
  174. }
  175. // adjust the year
  176. if (values[0] < 100 && values[0] >= 0)
  177. values[0] += 1900;
  178. // Get the local time value.
  179. timeValue = DateImplementation::TvFromDate(values[0], values[1], values[2] - 1,
  180. values[3] * 3600000 + values[4] * 60000 + values[5] * 1000 + values[6]);
  181. // Set the time.
  182. pDate->m_date.SetTvLcl(timeValue, scriptContext);
  183. return pDate;
  184. }
  185. // Date.prototype[@@toPrimitive] as described in ES6 spec (Draft May 22, 2014) 20.3.4.45
  186. Var JavascriptDate::EntrySymbolToPrimitive(RecyclableObject* function, CallInfo callInfo, ...)
  187. {
  188. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  189. ARGUMENTS(args, callInfo);
  190. ScriptContext* scriptContext = function->GetScriptContext();
  191. Assert(!(callInfo.Flags & CallFlags_New));
  192. // One argument given will be hint
  193. //The allowed values for hint are "default", "number", and "string"
  194. if (args.Info.Count == 2)
  195. {
  196. if (!JavascriptOperators::IsObjectType(JavascriptOperators::GetTypeId(args[0])))
  197. {
  198. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedObject, _u("Date[Symbol.toPrimitive]"));
  199. }
  200. if (VarIs<JavascriptString>(args[1]))
  201. {
  202. JavascriptString* StringObject = VarTo<JavascriptString>(args[1]);
  203. const char16 * str = StringObject->GetString();
  204. if (wcscmp(str, _u("default")) == 0 || wcscmp(str, _u("string")) == 0)
  205. {
  206. // Date objects, are unique among built-in ECMAScript object in that they treat "default" as being equivalent to "string"
  207. // If hint is the string value "string" or the string value "default", then
  208. // Let tryFirst be "string".
  209. return JavascriptConversion::OrdinaryToPrimitive<JavascriptHint::HintString>(UnsafeVarTo<RecyclableObject>(args[0]), scriptContext);
  210. }
  211. // Else if hint is the string value "number", then
  212. // Let tryFirst be "number".
  213. else if(wcscmp(str, _u("number")) == 0)
  214. {
  215. return JavascriptConversion::OrdinaryToPrimitive<JavascriptHint::HintNumber>(UnsafeVarTo<RecyclableObject>(args[0]), scriptContext);
  216. }
  217. //anything else should throw a type error
  218. }
  219. }
  220. JavascriptError::ThrowTypeError(scriptContext, JSERR_InvalidHint, _u("Date[Symbol.toPrimitive]"));
  221. }
  222. Var JavascriptDate::EntryGetDate(RecyclableObject* function, CallInfo callInfo, ...)
  223. {
  224. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  225. ARGUMENTS(args, callInfo);
  226. ScriptContext* scriptContext = function->GetScriptContext();
  227. Assert(!(callInfo.Flags & CallFlags_New));
  228. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  229. {
  230. Var result = nullptr;
  231. if (TryInvokeRemotely(EntryGetDate, scriptContext, args, &result))
  232. {
  233. return result;
  234. }
  235. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getDate"));
  236. }
  237. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  238. if (!date->m_date.IsNaN())
  239. {
  240. return date->m_date.GetDate(scriptContext);
  241. }
  242. return scriptContext->GetLibrary()->GetNaN();
  243. }
  244. Var JavascriptDate::EntryGetDay(RecyclableObject* function, CallInfo callInfo, ...)
  245. {
  246. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  247. ARGUMENTS(args, callInfo);
  248. ScriptContext* scriptContext = function->GetScriptContext();
  249. Assert(!(callInfo.Flags & CallFlags_New));
  250. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  251. {
  252. Var result = nullptr;
  253. if (TryInvokeRemotely(EntryGetDay, scriptContext, args, &result))
  254. {
  255. return result;
  256. }
  257. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getDay"));
  258. }
  259. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  260. if (!date->m_date.IsNaN())
  261. {
  262. return date->m_date.GetDay(scriptContext);
  263. }
  264. return scriptContext->GetLibrary()->GetNaN();
  265. }
  266. Var JavascriptDate::EntryGetFullYear(RecyclableObject* function, CallInfo callInfo, ...)
  267. {
  268. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  269. ARGUMENTS(args, callInfo);
  270. ScriptContext* scriptContext = function->GetScriptContext();
  271. Assert(!(callInfo.Flags & CallFlags_New));
  272. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  273. {
  274. Var result = nullptr;
  275. if (TryInvokeRemotely(EntryGetFullYear, scriptContext, args, &result))
  276. {
  277. return result;
  278. }
  279. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getFullYear"));
  280. }
  281. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  282. if (!date->m_date.IsNaN())
  283. {
  284. return date->m_date.GetFullYear(scriptContext);
  285. }
  286. return scriptContext->GetLibrary()->GetNaN();
  287. }
  288. Var JavascriptDate::EntryGetYear(RecyclableObject* function, CallInfo callInfo, ...)
  289. {
  290. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  291. ARGUMENTS(args, callInfo);
  292. ScriptContext* scriptContext = function->GetScriptContext();
  293. Assert(!(callInfo.Flags & CallFlags_New));
  294. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  295. {
  296. Var result = nullptr;
  297. if (TryInvokeRemotely(EntryGetYear, scriptContext, args, &result))
  298. {
  299. return result;
  300. }
  301. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getYear"));
  302. }
  303. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  304. if (!date->m_date.IsNaN())
  305. {
  306. return date->m_date.GetYear(scriptContext);
  307. }
  308. return scriptContext->GetLibrary()->GetNaN();
  309. }
  310. Var JavascriptDate::EntryGetHours(RecyclableObject* function, CallInfo callInfo, ...)
  311. {
  312. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  313. ARGUMENTS(args, callInfo);
  314. ScriptContext* scriptContext = function->GetScriptContext();
  315. Assert(!(callInfo.Flags & CallFlags_New));
  316. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  317. {
  318. Var result = nullptr;
  319. if (TryInvokeRemotely(EntryGetHours, scriptContext, args, &result))
  320. {
  321. return result;
  322. }
  323. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getHours"));
  324. }
  325. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  326. if (!date->m_date.IsNaN())
  327. {
  328. return date->m_date.GetHours(scriptContext);
  329. }
  330. return scriptContext->GetLibrary()->GetNaN();
  331. }
  332. Var JavascriptDate::EntryGetMilliseconds(RecyclableObject* function, CallInfo callInfo, ...)
  333. {
  334. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  335. ARGUMENTS(args, callInfo);
  336. ScriptContext* scriptContext = function->GetScriptContext();
  337. Assert(!(callInfo.Flags & CallFlags_New));
  338. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  339. {
  340. Var result = nullptr;
  341. if (TryInvokeRemotely(EntryGetMilliseconds, scriptContext, args, &result))
  342. {
  343. return result;
  344. }
  345. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getMilliseconds"));
  346. }
  347. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  348. if (!date->m_date.IsNaN())
  349. {
  350. return date->m_date.GetDateMilliSeconds(scriptContext);
  351. }
  352. return scriptContext->GetLibrary()->GetNaN();
  353. }
  354. Var JavascriptDate::EntryGetMinutes(RecyclableObject* function, CallInfo callInfo, ...)
  355. {
  356. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  357. ARGUMENTS(args, callInfo);
  358. ScriptContext* scriptContext = function->GetScriptContext();
  359. Assert(!(callInfo.Flags & CallFlags_New));
  360. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  361. {
  362. Var result = nullptr;
  363. if (TryInvokeRemotely(EntryGetMinutes, scriptContext, args, &result))
  364. {
  365. return result;
  366. }
  367. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getMinutes"));
  368. }
  369. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  370. if (!date->m_date.IsNaN())
  371. {
  372. return date->m_date.GetMinutes(scriptContext);
  373. }
  374. return scriptContext->GetLibrary()->GetNaN();
  375. }
  376. Var JavascriptDate::EntryGetMonth(RecyclableObject* function, CallInfo callInfo, ...)
  377. {
  378. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  379. ARGUMENTS(args, callInfo);
  380. ScriptContext* scriptContext = function->GetScriptContext();
  381. Assert(!(callInfo.Flags & CallFlags_New));
  382. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  383. {
  384. Var result = nullptr;
  385. if (TryInvokeRemotely(EntryGetMonth, scriptContext, args, &result))
  386. {
  387. return result;
  388. }
  389. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getMonth"));
  390. }
  391. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  392. if (!date->m_date.IsNaN())
  393. {
  394. return date->m_date.GetMonth(scriptContext);
  395. }
  396. return scriptContext->GetLibrary()->GetNaN();
  397. }
  398. Var JavascriptDate::EntryGetSeconds(RecyclableObject* function, CallInfo callInfo, ...)
  399. {
  400. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  401. ARGUMENTS(args, callInfo);
  402. ScriptContext* scriptContext = function->GetScriptContext();
  403. Assert(!(callInfo.Flags & CallFlags_New));
  404. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  405. {
  406. Var result = nullptr;
  407. if (TryInvokeRemotely(EntryGetSeconds, scriptContext, args, &result))
  408. {
  409. return result;
  410. }
  411. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getSeconds"));
  412. }
  413. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  414. if (!date->m_date.IsNaN())
  415. {
  416. return date->m_date.GetSeconds(scriptContext);
  417. }
  418. return scriptContext->GetLibrary()->GetNaN();
  419. }
  420. Var JavascriptDate::EntryGetTime(RecyclableObject* function, CallInfo callInfo, ...)
  421. {
  422. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  423. ARGUMENTS(args, callInfo);
  424. ScriptContext* scriptContext = function->GetScriptContext();
  425. Assert(!(callInfo.Flags & CallFlags_New));
  426. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  427. {
  428. Var result = nullptr;
  429. if (TryInvokeRemotely(EntryGetTime, scriptContext, args, &result))
  430. {
  431. return result;
  432. }
  433. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getTime"));
  434. }
  435. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  436. return JavascriptNumber::ToVarNoCheck(date->GetTime(), scriptContext);
  437. }
  438. Var JavascriptDate::EntryGetTimezoneOffset(RecyclableObject* function, CallInfo callInfo, ...)
  439. {
  440. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  441. ARGUMENTS(args, callInfo);
  442. ScriptContext* scriptContext = function->GetScriptContext();
  443. Assert(!(callInfo.Flags & CallFlags_New));
  444. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  445. {
  446. Var result = nullptr;
  447. if (TryInvokeRemotely(EntryGetTimezoneOffset, scriptContext, args, &result))
  448. {
  449. return result;
  450. }
  451. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getTimezoneOffset"));
  452. }
  453. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  454. return JavascriptDate::GetDateData(date, DateImplementation::DateData::TimezoneOffset, scriptContext);
  455. }
  456. Var JavascriptDate::EntryGetUTCDate(RecyclableObject* function, CallInfo callInfo, ...)
  457. {
  458. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  459. ARGUMENTS(args, callInfo);
  460. ScriptContext* scriptContext = function->GetScriptContext();
  461. Assert(!(callInfo.Flags & CallFlags_New));
  462. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  463. {
  464. Var result = nullptr;
  465. if (TryInvokeRemotely(EntryGetUTCDate, scriptContext, args, &result))
  466. {
  467. return result;
  468. }
  469. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCDate"));
  470. }
  471. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  472. return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Date, scriptContext);
  473. }
  474. Var JavascriptDate::EntryGetUTCDay(RecyclableObject* function, CallInfo callInfo, ...)
  475. {
  476. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  477. ARGUMENTS(args, callInfo);
  478. ScriptContext* scriptContext = function->GetScriptContext();
  479. Assert(!(callInfo.Flags & CallFlags_New));
  480. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  481. {
  482. Var result = nullptr;
  483. if (TryInvokeRemotely(EntryGetUTCDay, scriptContext, args, &result))
  484. {
  485. return result;
  486. }
  487. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCDay"));
  488. }
  489. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  490. return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Day, scriptContext);
  491. }
  492. Var JavascriptDate::EntryGetUTCFullYear(RecyclableObject* function, CallInfo callInfo, ...)
  493. {
  494. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  495. ARGUMENTS(args, callInfo);
  496. ScriptContext* scriptContext = function->GetScriptContext();
  497. Assert(!(callInfo.Flags & CallFlags_New));
  498. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  499. {
  500. Var result = nullptr;
  501. if (TryInvokeRemotely(EntryGetUTCFullYear, scriptContext, args, &result))
  502. {
  503. return result;
  504. }
  505. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCFullYear"));
  506. }
  507. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  508. return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::FullYear, scriptContext);
  509. }
  510. Var JavascriptDate::EntryGetUTCHours(RecyclableObject* function, CallInfo callInfo, ...)
  511. {
  512. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  513. ARGUMENTS(args, callInfo);
  514. ScriptContext* scriptContext = function->GetScriptContext();
  515. Assert(!(callInfo.Flags & CallFlags_New));
  516. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  517. {
  518. Var result = nullptr;
  519. if (TryInvokeRemotely(EntryGetUTCHours, scriptContext, args, &result))
  520. {
  521. return result;
  522. }
  523. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCHours"));
  524. }
  525. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  526. return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Hours, scriptContext);
  527. }
  528. Var JavascriptDate::EntryGetUTCMilliseconds(RecyclableObject* function, CallInfo callInfo, ...)
  529. {
  530. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  531. ARGUMENTS(args, callInfo);
  532. ScriptContext* scriptContext = function->GetScriptContext();
  533. Assert(!(callInfo.Flags & CallFlags_New));
  534. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  535. {
  536. Var result = nullptr;
  537. if (TryInvokeRemotely(EntryGetUTCMilliseconds, scriptContext, args, &result))
  538. {
  539. return result;
  540. }
  541. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCMilliseconds"));
  542. }
  543. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  544. return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Milliseconds, scriptContext);
  545. }
  546. Var JavascriptDate::EntryGetUTCMinutes(RecyclableObject* function, CallInfo callInfo, ...)
  547. {
  548. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  549. ARGUMENTS(args, callInfo);
  550. ScriptContext* scriptContext = function->GetScriptContext();
  551. Assert(!(callInfo.Flags & CallFlags_New));
  552. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  553. {
  554. Var result = nullptr;
  555. if (TryInvokeRemotely(EntryGetUTCMinutes, scriptContext, args, &result))
  556. {
  557. return result;
  558. }
  559. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCMinutes"));
  560. }
  561. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  562. return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Minutes, scriptContext);
  563. }
  564. Var JavascriptDate::EntryGetUTCMonth(RecyclableObject* function, CallInfo callInfo, ...)
  565. {
  566. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  567. ARGUMENTS(args, callInfo);
  568. ScriptContext* scriptContext = function->GetScriptContext();
  569. Assert(!(callInfo.Flags & CallFlags_New));
  570. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  571. {
  572. Var result = nullptr;
  573. if (TryInvokeRemotely(EntryGetUTCMonth, scriptContext, args, &result))
  574. {
  575. return result;
  576. }
  577. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCMonth"));
  578. }
  579. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  580. return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Month, scriptContext);
  581. }
  582. Var JavascriptDate::EntryGetUTCSeconds(RecyclableObject* function, CallInfo callInfo, ...)
  583. {
  584. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  585. ARGUMENTS(args, callInfo);
  586. ScriptContext* scriptContext = function->GetScriptContext();
  587. Assert(!(callInfo.Flags & CallFlags_New));
  588. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  589. {
  590. Var result = nullptr;
  591. if (TryInvokeRemotely(EntryGetUTCSeconds, scriptContext, args, &result))
  592. {
  593. return result;
  594. }
  595. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.getUTCSeconds"));
  596. }
  597. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  598. return JavascriptDate::GetUTCDateData(date, DateImplementation::DateData::Seconds, scriptContext);
  599. }
  600. Var JavascriptDate::EntryParse(RecyclableObject* function, CallInfo callInfo, ...)
  601. {
  602. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  603. ARGUMENTS(args, callInfo);
  604. ScriptContext* scriptContext = function->GetScriptContext();
  605. Assert(!(callInfo.Flags & CallFlags_New));
  606. double dblRetVal = JavascriptNumber::NaN;
  607. if (args.Info.Count > 1)
  608. {
  609. // We convert to primitive value based on hint == String, which JavascriptConversion::ToString does.
  610. JavascriptString *pParseString = JavascriptConversion::ToString(args[1], scriptContext);
  611. dblRetVal = ParseHelper(scriptContext, pParseString);
  612. }
  613. return JavascriptNumber::ToVarNoCheck(dblRetVal,scriptContext);
  614. }
  615. Var JavascriptDate::EntryNow(RecyclableObject* function, CallInfo callInfo, ...)
  616. {
  617. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  618. ScriptContext* scriptContext = function->GetScriptContext();
  619. Assert(!(callInfo.Flags & CallFlags_New));
  620. double dblRetVal = DateImplementation::NowInMilliSeconds(scriptContext);
  621. #if ENABLE_TTD
  622. if(scriptContext->ShouldPerformReplayAction())
  623. {
  624. scriptContext->GetThreadContext()->TTDLog->ReplayDateTimeEvent(&dblRetVal);
  625. }
  626. else if(scriptContext->ShouldPerformRecordAction())
  627. {
  628. scriptContext->GetThreadContext()->TTDLog->RecordDateTimeEvent(dblRetVal);
  629. }
  630. else
  631. {
  632. ;
  633. }
  634. #endif
  635. return JavascriptNumber::ToVarNoCheck(dblRetVal,scriptContext);
  636. }
  637. Var JavascriptDate::EntryUTC(RecyclableObject* function, CallInfo callInfo, ...)
  638. {
  639. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  640. ARGUMENTS(args, callInfo);
  641. ScriptContext* scriptContext = function->GetScriptContext();
  642. Assert(!(callInfo.Flags & CallFlags_New));
  643. double dblRetVal = DateImplementation::DateFncUTC(scriptContext, args);
  644. return JavascriptNumber::ToVarNoCheck(dblRetVal, scriptContext);
  645. }
  646. double JavascriptDate::ParseHelper(ScriptContext *scriptContext, JavascriptString *str)
  647. {
  648. return DateImplementation::UtcTimeFromStr(scriptContext, str);
  649. }
  650. Var JavascriptDate::EntrySetDate(RecyclableObject* function, CallInfo callInfo, ...)
  651. {
  652. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  653. ARGUMENTS(args, callInfo);
  654. ScriptContext* scriptContext = function->GetScriptContext();
  655. Assert(!(callInfo.Flags & CallFlags_New));
  656. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  657. {
  658. Var result = nullptr;
  659. if (TryInvokeRemotely(EntrySetDate, scriptContext, args, &result))
  660. {
  661. return result;
  662. }
  663. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setDate"));
  664. }
  665. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  666. return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Date, scriptContext);
  667. }
  668. Var JavascriptDate::EntrySetFullYear(RecyclableObject* function, CallInfo callInfo, ...)
  669. {
  670. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  671. ARGUMENTS(args, callInfo);
  672. ScriptContext* scriptContext = function->GetScriptContext();
  673. Assert(!(callInfo.Flags & CallFlags_New));
  674. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  675. {
  676. Var result = nullptr;
  677. if (TryInvokeRemotely(EntrySetFullYear, scriptContext, args, &result))
  678. {
  679. return result;
  680. }
  681. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setFullYear"));
  682. }
  683. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  684. return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::FullYear, scriptContext);
  685. }
  686. Var JavascriptDate::EntrySetYear(RecyclableObject* function, CallInfo callInfo, ...)
  687. {
  688. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  689. ARGUMENTS(args, callInfo);
  690. ScriptContext* scriptContext = function->GetScriptContext();
  691. Assert(!(callInfo.Flags & CallFlags_New));
  692. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  693. {
  694. Var result = nullptr;
  695. if (TryInvokeRemotely(EntrySetYear, scriptContext, args, &result))
  696. {
  697. return result;
  698. }
  699. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setYear"));
  700. }
  701. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  702. return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Year, scriptContext);
  703. }
  704. Var JavascriptDate::EntrySetHours(RecyclableObject* function, CallInfo callInfo, ...)
  705. {
  706. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  707. ARGUMENTS(args, callInfo);
  708. ScriptContext* scriptContext = function->GetScriptContext();
  709. Assert(!(callInfo.Flags & CallFlags_New));
  710. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  711. {
  712. Var result = nullptr;
  713. if (TryInvokeRemotely(EntrySetHours, scriptContext, args, &result))
  714. {
  715. return result;
  716. }
  717. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setHours"));
  718. }
  719. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  720. return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Hours, scriptContext);
  721. }
  722. Var JavascriptDate::EntrySetMilliseconds(RecyclableObject* function, CallInfo callInfo, ...)
  723. {
  724. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  725. ARGUMENTS(args, callInfo);
  726. ScriptContext* scriptContext = function->GetScriptContext();
  727. Assert(!(callInfo.Flags & CallFlags_New));
  728. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  729. {
  730. Var result = nullptr;
  731. if (TryInvokeRemotely(EntrySetMilliseconds, scriptContext, args, &result))
  732. {
  733. return result;
  734. }
  735. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setMilliseconds"));
  736. }
  737. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  738. return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Milliseconds, scriptContext);
  739. }
  740. Var JavascriptDate::EntrySetMinutes(RecyclableObject* function, CallInfo callInfo, ...)
  741. {
  742. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  743. ARGUMENTS(args, callInfo);
  744. ScriptContext* scriptContext = function->GetScriptContext();
  745. Assert(!(callInfo.Flags & CallFlags_New));
  746. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  747. {
  748. Var result = nullptr;
  749. if (TryInvokeRemotely(EntrySetMinutes, scriptContext, args, &result))
  750. {
  751. return result;
  752. }
  753. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setMinutes"));
  754. }
  755. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  756. return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Minutes, scriptContext);
  757. }
  758. Var JavascriptDate::EntrySetMonth(RecyclableObject* function, CallInfo callInfo, ...)
  759. {
  760. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  761. ARGUMENTS(args, callInfo);
  762. ScriptContext* scriptContext = function->GetScriptContext();
  763. Assert(!(callInfo.Flags & CallFlags_New));
  764. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  765. {
  766. Var result = nullptr;
  767. if (TryInvokeRemotely(EntrySetMonth, scriptContext, args, &result))
  768. {
  769. return result;
  770. }
  771. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setMonth"));
  772. }
  773. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  774. return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Month, scriptContext);
  775. }
  776. Var JavascriptDate::EntrySetSeconds(RecyclableObject* function, CallInfo callInfo, ...)
  777. {
  778. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  779. ARGUMENTS(args, callInfo);
  780. ScriptContext* scriptContext = function->GetScriptContext();
  781. Assert(!(callInfo.Flags & CallFlags_New));
  782. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  783. {
  784. Var result = nullptr;
  785. if (TryInvokeRemotely(EntrySetSeconds, scriptContext, args, &result))
  786. {
  787. return result;
  788. }
  789. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setSeconds"));
  790. }
  791. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  792. return JavascriptDate::SetDateData(date, args, DateImplementation::DateData::Seconds, scriptContext);
  793. }
  794. Var JavascriptDate::EntrySetTime(RecyclableObject* function, CallInfo callInfo, ...)
  795. {
  796. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  797. ARGUMENTS(args, callInfo);
  798. ScriptContext* scriptContext = function->GetScriptContext();
  799. Assert(!(callInfo.Flags & CallFlags_New));
  800. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  801. {
  802. Var result = nullptr;
  803. if (TryInvokeRemotely(EntrySetTime, scriptContext, args, &result))
  804. {
  805. return result;
  806. }
  807. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setTime"));
  808. }
  809. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  810. AssertMsg(args.Info.Count > 0, "Negative argument count");
  811. double value;
  812. if (args.Info.Count > 1)
  813. {
  814. value = JavascriptConversion::ToNumber(args[1], scriptContext);
  815. if (Js::NumberUtilities::IsFinite(value))
  816. {
  817. value = JavascriptConversion::ToInteger(value);
  818. }
  819. }
  820. else
  821. {
  822. value = JavascriptNumber::NaN;
  823. }
  824. date->m_date.SetTvUtc(value);
  825. return JavascriptNumber::ToVarNoCheck(value, scriptContext);
  826. }
  827. Var JavascriptDate::EntrySetUTCDate(RecyclableObject* function, CallInfo callInfo, ...)
  828. {
  829. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  830. ARGUMENTS(args, callInfo);
  831. ScriptContext* scriptContext = function->GetScriptContext();
  832. Assert(!(callInfo.Flags & CallFlags_New));
  833. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  834. {
  835. Var result = nullptr;
  836. if (TryInvokeRemotely(EntrySetUTCDate, scriptContext, args, &result))
  837. {
  838. return result;
  839. }
  840. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCDate"));
  841. }
  842. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  843. return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Date, scriptContext);
  844. }
  845. Var JavascriptDate::EntrySetUTCFullYear(RecyclableObject* function, CallInfo callInfo, ...)
  846. {
  847. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  848. ARGUMENTS(args, callInfo);
  849. ScriptContext* scriptContext = function->GetScriptContext();
  850. Assert(!(callInfo.Flags & CallFlags_New));
  851. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  852. {
  853. Var result = nullptr;
  854. if (TryInvokeRemotely(EntrySetUTCFullYear, scriptContext, args, &result))
  855. {
  856. return result;
  857. }
  858. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCFullYear"));
  859. }
  860. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  861. return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::FullYear, scriptContext);
  862. }
  863. Var JavascriptDate::EntrySetUTCHours(RecyclableObject* function, CallInfo callInfo, ...)
  864. {
  865. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  866. ARGUMENTS(args, callInfo);
  867. ScriptContext* scriptContext = function->GetScriptContext();
  868. Assert(!(callInfo.Flags & CallFlags_New));
  869. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  870. {
  871. Var result = nullptr;
  872. if (TryInvokeRemotely(EntrySetUTCHours, scriptContext, args, &result))
  873. {
  874. return result;
  875. }
  876. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCHours"));
  877. }
  878. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  879. return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Hours, scriptContext);
  880. }
  881. Var JavascriptDate::EntrySetUTCMilliseconds(RecyclableObject* function, CallInfo callInfo, ...)
  882. {
  883. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  884. ARGUMENTS(args, callInfo);
  885. ScriptContext* scriptContext = function->GetScriptContext();
  886. Assert(!(callInfo.Flags & CallFlags_New));
  887. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  888. {
  889. Var result = nullptr;
  890. if (TryInvokeRemotely(EntrySetUTCMilliseconds, scriptContext, args, &result))
  891. {
  892. return result;
  893. }
  894. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCMilliseconds"));
  895. }
  896. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  897. return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Milliseconds, scriptContext);
  898. }
  899. Var JavascriptDate::EntrySetUTCMinutes(RecyclableObject* function, CallInfo callInfo, ...)
  900. {
  901. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  902. ARGUMENTS(args, callInfo);
  903. ScriptContext* scriptContext = function->GetScriptContext();
  904. Assert(!(callInfo.Flags & CallFlags_New));
  905. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  906. {
  907. Var result = nullptr;
  908. if (TryInvokeRemotely(EntrySetUTCMinutes, scriptContext, args, &result))
  909. {
  910. return result;
  911. }
  912. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCMinutes"));
  913. }
  914. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  915. return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Minutes, scriptContext);
  916. }
  917. Var JavascriptDate::EntrySetUTCMonth(RecyclableObject* function, CallInfo callInfo, ...)
  918. {
  919. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  920. ARGUMENTS(args, callInfo);
  921. ScriptContext* scriptContext = function->GetScriptContext();
  922. Assert(!(callInfo.Flags & CallFlags_New));
  923. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  924. {
  925. Var result = nullptr;
  926. if (TryInvokeRemotely(EntrySetUTCMonth, scriptContext, args, &result))
  927. {
  928. return result;
  929. }
  930. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCMonth"));
  931. }
  932. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  933. return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Month, scriptContext);
  934. }
  935. Var JavascriptDate::EntrySetUTCSeconds(RecyclableObject* function, CallInfo callInfo, ...)
  936. {
  937. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  938. ARGUMENTS(args, callInfo);
  939. ScriptContext* scriptContext = function->GetScriptContext();
  940. Assert(!(callInfo.Flags & CallFlags_New));
  941. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  942. {
  943. Var result = nullptr;
  944. if (TryInvokeRemotely(EntrySetUTCSeconds, scriptContext, args, &result))
  945. {
  946. return result;
  947. }
  948. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.setUTCSeconds"));
  949. }
  950. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  951. return JavascriptDate::SetUTCDateData(date, args, DateImplementation::DateData::Seconds, scriptContext);
  952. }
  953. Var JavascriptDate::EntryToDateString(RecyclableObject* function, CallInfo callInfo, ...)
  954. {
  955. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  956. ARGUMENTS(args, callInfo);
  957. ScriptContext* scriptContext = function->GetScriptContext();
  958. Assert(!(callInfo.Flags & CallFlags_New));
  959. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  960. {
  961. Var result = nullptr;
  962. if (TryInvokeRemotely(EntryToDateString, scriptContext, args, &result))
  963. {
  964. return result;
  965. }
  966. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toDateString"));
  967. }
  968. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  969. AssertMsg(args.Info.Count > 0, "Negative argument count");
  970. return date->m_date.GetString(
  971. DateImplementation::DateStringFormat::Default, scriptContext,
  972. DateImplementation::DateTimeFlag::NoTime);
  973. }
  974. Var JavascriptDate::EntryToISOString(RecyclableObject* function, CallInfo callInfo, ...)
  975. {
  976. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  977. ARGUMENTS(args, callInfo);
  978. ScriptContext* scriptContext = function->GetScriptContext();
  979. Assert(!(callInfo.Flags & CallFlags_New));
  980. CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT(Date_Prototype_toISOString);
  981. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  982. {
  983. Var result = nullptr;
  984. if (TryInvokeRemotely(EntryToISOString, scriptContext, args, &result))
  985. {
  986. return result;
  987. }
  988. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toISOString"));
  989. }
  990. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  991. AssertMsg(args.Info.Count > 0, "Negative argument count");
  992. return date->m_date.GetISOString(scriptContext);
  993. }
  994. Var JavascriptDate::EntryToJSON(RecyclableObject* function, CallInfo callInfo, ...)
  995. {
  996. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  997. ARGUMENTS(args, callInfo);
  998. ScriptContext* scriptContext = function->GetScriptContext();
  999. Assert(!(callInfo.Flags & CallFlags_New));
  1000. if (args.Info.Count == 0)
  1001. {
  1002. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedObject, _u("Data.prototype.toJSON"));
  1003. }
  1004. RecyclableObject* thisObj = nullptr;
  1005. if (FALSE == JavascriptConversion::ToObject(args[0], scriptContext, &thisObj))
  1006. {
  1007. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NullOrUndefined, _u("Date.prototype.toJSON"));
  1008. }
  1009. Var result = nullptr;
  1010. if (TryInvokeRemotely(EntryToJSON, scriptContext, args, &result))
  1011. {
  1012. return result;
  1013. }
  1014. Var num = JavascriptConversion::ToPrimitive<JavascriptHint::HintNumber>(thisObj, scriptContext);
  1015. if (JavascriptNumber::Is(num)
  1016. && !NumberUtilities::IsFinite(JavascriptNumber::GetValue(num)))
  1017. {
  1018. return scriptContext->GetLibrary()->GetNull();
  1019. }
  1020. Var toISO = JavascriptOperators::GetProperty(thisObj, PropertyIds::toISOString, scriptContext, NULL);
  1021. if (!JavascriptConversion::IsCallable(toISO))
  1022. {
  1023. JavascriptError::ThrowTypeError(scriptContext, JSERR_Property_NeedFunction, scriptContext->GetPropertyName(PropertyIds::toISOString)->GetBuffer());
  1024. }
  1025. RecyclableObject* toISOFunc = VarTo<RecyclableObject>(toISO);
  1026. return scriptContext->GetThreadContext()->ExecuteImplicitCall(toISOFunc, Js::ImplicitCall_Accessor, [=]()->Js::Var
  1027. {
  1028. return CALL_FUNCTION(scriptContext->GetThreadContext(), toISOFunc, CallInfo(1), thisObj);
  1029. });
  1030. }
  1031. Var JavascriptDate::EntryToLocaleDateString(RecyclableObject* function, CallInfo callInfo, ...)
  1032. {
  1033. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  1034. ARGUMENTS(args, callInfo);
  1035. ScriptContext* scriptContext = function->GetScriptContext();
  1036. Assert(!(callInfo.Flags & CallFlags_New));
  1037. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  1038. {
  1039. Var result = nullptr;
  1040. if (TryInvokeRemotely(EntryToLocaleDateString, scriptContext, args, &result))
  1041. {
  1042. return result;
  1043. }
  1044. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toLocaleDateString"));
  1045. }
  1046. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  1047. #ifdef ENABLE_INTL_OBJECT
  1048. if (CONFIG_FLAG(IntlBuiltIns) && scriptContext->IsIntlEnabled()){
  1049. EngineInterfaceObject* nativeEngineInterfaceObj = scriptContext->GetLibrary()->GetEngineInterfaceObject();
  1050. if (nativeEngineInterfaceObj)
  1051. {
  1052. IntlEngineInterfaceExtensionObject* extensionObject = static_cast<IntlEngineInterfaceExtensionObject*>(nativeEngineInterfaceObj->GetEngineExtension(EngineInterfaceExtensionKind_Intl));
  1053. JavascriptFunction* func = extensionObject->GetDateToLocaleDateString();
  1054. if (func)
  1055. {
  1056. BEGIN_SAFE_REENTRANT_CALL(scriptContext->GetThreadContext())
  1057. {
  1058. return func->CallFunction(args);
  1059. }
  1060. END_SAFE_REENTRANT_CALL
  1061. }
  1062. // Initialize Date.prototype.toLocaleDateString
  1063. scriptContext->GetLibrary()->InitializeIntlForDatePrototype();
  1064. func = extensionObject->GetDateToLocaleDateString();
  1065. if (func)
  1066. {
  1067. BEGIN_SAFE_REENTRANT_CALL(scriptContext->GetThreadContext())
  1068. {
  1069. return func->CallFunction(args);
  1070. }
  1071. END_SAFE_REENTRANT_CALL
  1072. }
  1073. }
  1074. }
  1075. #endif
  1076. AssertMsg(args.Info.Count > 0, "Negative argument count");
  1077. return date->m_date.GetString(
  1078. DateImplementation::DateStringFormat::Locale, scriptContext,
  1079. DateImplementation::DateTimeFlag::NoTime);
  1080. }
  1081. Var JavascriptDate::EntryToLocaleString(RecyclableObject* function, CallInfo callInfo, ...)
  1082. {
  1083. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  1084. ARGUMENTS(args, callInfo);
  1085. ScriptContext* scriptContext = function->GetScriptContext();
  1086. Assert(!(callInfo.Flags & CallFlags_New));
  1087. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  1088. {
  1089. Var result = nullptr;
  1090. if (TryInvokeRemotely(EntryToLocaleString, scriptContext, args, &result))
  1091. {
  1092. return result;
  1093. }
  1094. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toLocaleString"));
  1095. }
  1096. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  1097. #ifdef ENABLE_INTL_OBJECT
  1098. if (CONFIG_FLAG(IntlBuiltIns) && scriptContext->IsIntlEnabled()){
  1099. EngineInterfaceObject* nativeEngineInterfaceObj = scriptContext->GetLibrary()->GetEngineInterfaceObject();
  1100. if (nativeEngineInterfaceObj)
  1101. {
  1102. IntlEngineInterfaceExtensionObject* extensionObject = static_cast<IntlEngineInterfaceExtensionObject*>(nativeEngineInterfaceObj->GetEngineExtension(EngineInterfaceExtensionKind_Intl));
  1103. JavascriptFunction* func = extensionObject->GetDateToLocaleString();
  1104. if (func)
  1105. {
  1106. BEGIN_SAFE_REENTRANT_CALL(scriptContext->GetThreadContext())
  1107. {
  1108. return func->CallFunction(args);
  1109. }
  1110. END_SAFE_REENTRANT_CALL
  1111. }
  1112. // Initialize Date.prototype.toLocaleString
  1113. scriptContext->GetLibrary()->InitializeIntlForDatePrototype();
  1114. func = extensionObject->GetDateToLocaleString();
  1115. if (func)
  1116. {
  1117. BEGIN_SAFE_REENTRANT_CALL(scriptContext->GetThreadContext())
  1118. {
  1119. return func->CallFunction(args);
  1120. }
  1121. END_SAFE_REENTRANT_CALL
  1122. }
  1123. }
  1124. }
  1125. #endif
  1126. AssertMsg(args.Info.Count > 0, "Negative argument count");
  1127. return JavascriptDate::ToLocaleString(date, scriptContext);
  1128. }
  1129. JavascriptString* JavascriptDate::ToLocaleString(JavascriptDate* date,
  1130. ScriptContext* requestContext)
  1131. {
  1132. return date->m_date.GetString(DateImplementation::DateStringFormat::Locale, requestContext);
  1133. }
  1134. JavascriptString* JavascriptDate::ToString(JavascriptDate* date,
  1135. ScriptContext* requestContext)
  1136. {
  1137. Assert(date);
  1138. return date->m_date.GetString(DateImplementation::DateStringFormat::Default, requestContext);
  1139. }
  1140. Var JavascriptDate::EntryToLocaleTimeString(RecyclableObject* function, CallInfo callInfo, ...)
  1141. {
  1142. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  1143. ARGUMENTS(args, callInfo);
  1144. ScriptContext* scriptContext = function->GetScriptContext();
  1145. Assert(!(callInfo.Flags & CallFlags_New));
  1146. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  1147. {
  1148. Var result = nullptr;
  1149. if (TryInvokeRemotely(EntryToLocaleTimeString, scriptContext, args, &result))
  1150. {
  1151. return result;
  1152. }
  1153. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toLocaleTimeString"));
  1154. }
  1155. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  1156. #ifdef ENABLE_INTL_OBJECT
  1157. if (CONFIG_FLAG(IntlBuiltIns) && scriptContext->IsIntlEnabled()){
  1158. EngineInterfaceObject* nativeEngineInterfaceObj = scriptContext->GetLibrary()->GetEngineInterfaceObject();
  1159. if (nativeEngineInterfaceObj)
  1160. {
  1161. IntlEngineInterfaceExtensionObject* extensionObject = static_cast<IntlEngineInterfaceExtensionObject*>(nativeEngineInterfaceObj->GetEngineExtension(EngineInterfaceExtensionKind_Intl));
  1162. JavascriptFunction* func = extensionObject->GetDateToLocaleTimeString();
  1163. if (func)
  1164. {
  1165. BEGIN_SAFE_REENTRANT_CALL(scriptContext->GetThreadContext())
  1166. {
  1167. return func->CallFunction(args);
  1168. }
  1169. END_SAFE_REENTRANT_CALL
  1170. }
  1171. // Initialize Date.prototype.toLocaleTimeString
  1172. scriptContext->GetLibrary()->InitializeIntlForDatePrototype();
  1173. func = extensionObject->GetDateToLocaleTimeString();
  1174. if (func)
  1175. {
  1176. BEGIN_SAFE_REENTRANT_CALL(scriptContext->GetThreadContext())
  1177. {
  1178. return func->CallFunction(args);
  1179. }
  1180. END_SAFE_REENTRANT_CALL
  1181. }
  1182. }
  1183. }
  1184. #endif
  1185. AssertMsg(args.Info.Count > 0, "Negative argument count");
  1186. return date->m_date.GetString(
  1187. DateImplementation::DateStringFormat::Locale, scriptContext,
  1188. DateImplementation::DateTimeFlag::NoDate);
  1189. }
  1190. Var JavascriptDate::EntryToTimeString(RecyclableObject* function, CallInfo callInfo, ...)
  1191. {
  1192. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  1193. ARGUMENTS(args, callInfo);
  1194. ScriptContext* scriptContext = function->GetScriptContext();
  1195. Assert(!(callInfo.Flags & CallFlags_New));
  1196. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  1197. {
  1198. Var result = nullptr;
  1199. if (TryInvokeRemotely(EntryToTimeString, scriptContext, args, &result))
  1200. {
  1201. return result;
  1202. }
  1203. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toTimeString"));
  1204. }
  1205. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  1206. AssertMsg(args.Info.Count > 0, "Negative argument count");
  1207. return date->m_date.GetString(
  1208. DateImplementation::DateStringFormat::Default, scriptContext,
  1209. DateImplementation::DateTimeFlag::NoDate);
  1210. }
  1211. Var JavascriptDate::EntryToUTCString(RecyclableObject* function, CallInfo callInfo, ...)
  1212. {
  1213. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  1214. ARGUMENTS(args, callInfo);
  1215. ScriptContext* scriptContext = function->GetScriptContext();
  1216. Assert(!(callInfo.Flags & CallFlags_New));
  1217. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  1218. {
  1219. Var result = nullptr;
  1220. if (TryInvokeRemotely(EntryToUTCString, scriptContext, args, &result))
  1221. {
  1222. return result;
  1223. }
  1224. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toUTCString"));
  1225. }
  1226. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  1227. AssertMsg(args.Info.Count > 0, "Negative argument count");
  1228. return date->m_date.GetString(
  1229. DateImplementation::DateStringFormat::GMT, scriptContext,
  1230. DateImplementation::DateTimeFlag::None);
  1231. }
  1232. Var JavascriptDate::EntryValueOf(RecyclableObject* function, CallInfo callInfo, ...)
  1233. {
  1234. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  1235. ARGUMENTS(args, callInfo);
  1236. ScriptContext* scriptContext = function->GetScriptContext();
  1237. Assert(!(callInfo.Flags & CallFlags_New));
  1238. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  1239. {
  1240. Var result = nullptr;
  1241. if (TryInvokeRemotely(EntryValueOf, scriptContext, args, &result))
  1242. {
  1243. return result;
  1244. }
  1245. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.valueOf"));
  1246. }
  1247. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  1248. AssertMsg(args.Info.Count > 0, "Negative argument count");
  1249. double value = date->m_date.GetMilliSeconds();
  1250. return JavascriptNumber::ToVarNoCheck(value, scriptContext);
  1251. }
  1252. Var JavascriptDate::EntryToString(RecyclableObject* function, CallInfo callInfo, ...)
  1253. {
  1254. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  1255. ARGUMENTS(args, callInfo);
  1256. ScriptContext* scriptContext = function->GetScriptContext();
  1257. Assert(!(callInfo.Flags & CallFlags_New));
  1258. if (args.Info.Count == 0 || !VarIs<JavascriptDate>(args[0]))
  1259. {
  1260. Var result = nullptr;
  1261. if (TryInvokeRemotely(EntryToString, scriptContext, args, &result))
  1262. {
  1263. return result;
  1264. }
  1265. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDate, _u("Date.prototype.toString"));
  1266. }
  1267. JavascriptDate* date = VarTo<JavascriptDate>(args[0]);
  1268. AssertMsg(args.Info.Count > 0, "Negative argument count");
  1269. return JavascriptDate::ToString(date, scriptContext);
  1270. }
  1271. BOOL JavascriptDate::TryInvokeRemotely(JavascriptMethod entryPoint, ScriptContext * scriptContext, Arguments & args, Var * result)
  1272. {
  1273. if (JavascriptOperators::GetTypeId(args[0]) == TypeIds_HostDispatch)
  1274. {
  1275. if (VarTo<RecyclableObject>(args[0])->InvokeBuiltInOperationRemotely(entryPoint, args, result))
  1276. {
  1277. return TRUE;
  1278. }
  1279. }
  1280. return FALSE;
  1281. }
  1282. #if ENABLE_TTD
  1283. TTD::NSSnapObjects::SnapObjectType JavascriptDate::GetSnapTag_TTD() const
  1284. {
  1285. return TTD::NSSnapObjects::SnapObjectType::SnapDateObject;
  1286. }
  1287. void JavascriptDate::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc)
  1288. {
  1289. TTDAssert(this->GetTypeId() == TypeIds_Date, "We don't handle WinRT or other types of dates yet!");
  1290. double* millis = alloc.SlabAllocateStruct<double>();
  1291. *millis = m_date.GetMilliSeconds();
  1292. TTD::NSSnapObjects::StdExtractSetKindSpecificInfo<double*, TTD::NSSnapObjects::SnapObjectType::SnapDateObject>(objData, millis);
  1293. }
  1294. #endif
  1295. BOOL JavascriptDate::ToPrimitive(JavascriptHint hint, Var* result, ScriptContext * requestContext)
  1296. {
  1297. if (hint == JavascriptHint::None)
  1298. {
  1299. hint = JavascriptHint::HintString;
  1300. }
  1301. return DynamicObject::ToPrimitive(hint, result, requestContext);
  1302. }
  1303. BOOL JavascriptDate::GetDiagValueString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext)
  1304. {
  1305. ENTER_PINNED_SCOPE(JavascriptString, valueStr);
  1306. valueStr = this->m_date.GetString(
  1307. DateImplementation::DateStringFormat::Default, requestContext);
  1308. stringBuilder->Append(valueStr->GetString(), valueStr->GetLength());
  1309. LEAVE_PINNED_SCOPE();
  1310. return TRUE;
  1311. }
  1312. BOOL JavascriptDate::GetDiagTypeString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext)
  1313. {
  1314. stringBuilder->AppendCppLiteral(_u("Object, (Date)"));
  1315. return TRUE;
  1316. }
  1317. } // namespace Js