Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(187)

Side by Side Diff: src/date-delay.js

Issue 661366: Rewrite MakeDay function from JS to C++. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/macros.py » ('j') | src/runtime.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 106
107 function EquivalentTime(t) { 107 function EquivalentTime(t) {
108 // The issue here is that some library calls don't work right for dates 108 // The issue here is that some library calls don't work right for dates
109 // that cannot be represented using a non-negative signed 32 bit integer 109 // that cannot be represented using a non-negative signed 32 bit integer
110 // (measured in whole seconds based on the 1970 epoch). 110 // (measured in whole seconds based on the 1970 epoch).
111 // We solve this by mapping the time to a year with same leap-year-ness 111 // We solve this by mapping the time to a year with same leap-year-ness
112 // and same starting day for the year. The ECMAscript specification says 112 // and same starting day for the year. The ECMAscript specification says
113 // we must do this, but for compatibility with other browsers, we use 113 // we must do this, but for compatibility with other browsers, we use
114 // the actual year if it is in the range 1970..2037 114 // the actual year if it is in the range 1970..2037
115 if (t >= 0 && t <= 2.1e12) return t; 115 if (t >= 0 && t <= 2.1e12) return t;
116 var day = MakeDay(EquivalentYear(YEAR_FROM_TIME(t)), MONTH_FROM_TIME(t), DATE_ FROM_TIME(t)); 116
117 return TimeClip(MakeDate(day, TimeWithinDay(t))); 117 // We call function from runtime.cc to avoid extra checks which are unneeded.
118 var day = %DateMakeDay(EquivalentYear(YEAR_FROM_TIME(t)),
119 MONTH_FROM_TIME(t),
120 DATE_FROM_TIME(t));
121 return MakeDate(day, TimeWithinDay(t));
118 } 122 }
119 123
120 124
121 // Because computing the DST offset is a pretty expensive operation 125 // Because computing the DST offset is a pretty expensive operation
122 // we keep a cache of last computed offset along with a time interval 126 // we keep a cache of last computed offset along with a time interval
123 // where we know the cache is valid. 127 // where we know the cache is valid.
124 var DST_offset_cache = { 128 var DST_offset_cache = {
125 // Cached DST offset. 129 // Cached DST offset.
126 offset: 0, 130 offset: 0,
127 // Time interval where the cached offset is valid. 131 // Time interval where the cached offset is valid.
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 + TO_INTEGER(ms); 254 + TO_INTEGER(ms);
251 } 255 }
252 256
253 257
254 // ECMA 262 - 15.9.1.12 258 // ECMA 262 - 15.9.1.12
255 function TimeInYear(year) { 259 function TimeInYear(year) {
256 return DaysInYear(year) * msPerDay; 260 return DaysInYear(year) * msPerDay;
257 } 261 }
258 262
259 263
260 // Compute modified Julian day from year, month, date.
261 function ToJulianDay(year, month, date) {
262 var jy = (month > 1) ? year : year - 1;
263 var jm = (month > 1) ? month + 2 : month + 14;
264 var ja = FLOOR(jy / 100);
265 return FLOOR(FLOOR(365.25*jy) + FLOOR(30.6001*jm) + date + 1720995) + 2 - ja + FLOOR(0.25*ja);
266 }
267
268 var four_year_cycle_table = CalculateDateTable(); 264 var four_year_cycle_table = CalculateDateTable();
269 265
270 266
271 function CalculateDateTable() { 267 function CalculateDateTable() {
272 var month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 268 var month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
273 var four_year_cycle_table = new $Array(1461); 269 var four_year_cycle_table = new $Array(1461);
274 270
275 var cumulative = 0; 271 var cumulative = 0;
276 var position = 0; 272 var position = 0;
277 var leap_position = 0; 273 var leap_position = 0;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 348
353 // Compute number of days given a year, month, date. 349 // Compute number of days given a year, month, date.
354 // Note that month and date can lie outside the normal range. 350 // Note that month and date can lie outside the normal range.
355 // For example: 351 // For example:
356 // MakeDay(2007, -4, 20) --> MakeDay(2006, 8, 20) 352 // MakeDay(2007, -4, 20) --> MakeDay(2006, 8, 20)
357 // MakeDay(2007, -33, 1) --> MakeDay(2004, 3, 1) 353 // MakeDay(2007, -33, 1) --> MakeDay(2004, 3, 1)
358 // MakeDay(2007, 14, -50) --> MakeDay(2007, 8, 11) 354 // MakeDay(2007, 14, -50) --> MakeDay(2007, 8, 11)
359 function MakeDay(year, month, date) { 355 function MakeDay(year, month, date) {
360 if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) return $NaN; 356 if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) return $NaN;
361 357
362 // Conversion to integers.
363 year = TO_INTEGER(year); 358 year = TO_INTEGER(year);
364 month = TO_INTEGER(month); 359 month = TO_INTEGER(month);
365 date = TO_INTEGER(date); 360 date = TO_INTEGER(date);
366 361
367 // Overflow months into year. 362 if (year < kMinYear || year > kMaxYear ||
368 year = year + FLOOR(month/12); 363 month < kMinMonth || month > kMaxMonth ||
369 month = month % 12; 364 date < kMinDate || date > kMaxDate) {
370 if (month < 0) { 365 return $NaN;
371 month += 12;
372 } 366 }
373 367
374 // Return days relative to Jan 1 1970. 368 // Now we presume that year, month and date are actually SMIs.
Mads Ager (chromium) 2010/03/02 13:04:08 Since the runtime function probably relies on year
Oleg Eterevsky 2010/03/02 13:28:23 Done.
375 return ToJulianDay(year, month, date) - kDayZeroInJulianDay; 369 return %DateMakeDay(year, month, date);
376 } 370 }
377 371
378 372
379 // ECMA 262 - 15.9.1.13 373 // ECMA 262 - 15.9.1.13
380 function MakeDate(day, time) { 374 function MakeDate(day, time) {
381 if (!$isFinite(day)) return $NaN; 375 if (!$isFinite(day)) return $NaN;
382 if (!$isFinite(time)) return $NaN; 376 if (!$isFinite(time)) return $NaN;
383 return day * msPerDay + time; 377 return day * msPerDay + time;
384 } 378 }
385 379
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 "toGMTString", DateToGMTString, 1123 "toGMTString", DateToGMTString,
1130 "toUTCString", DateToUTCString, 1124 "toUTCString", DateToUTCString,
1131 "getYear", DateGetYear, 1125 "getYear", DateGetYear,
1132 "setYear", DateSetYear, 1126 "setYear", DateSetYear,
1133 "toISOString", DateToISOString, 1127 "toISOString", DateToISOString,
1134 "toJSON", DateToJSON 1128 "toJSON", DateToJSON
1135 )); 1129 ));
1136 } 1130 }
1137 1131
1138 SetupDate(); 1132 SetupDate();
OLDNEW
« no previous file with comments | « no previous file | src/macros.py » ('j') | src/runtime.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698