Commit b0f411c2 authored by kasperl@chromium.org's avatar kasperl@chromium.org

Fix issue 397 and issue 399.

Review URL: http://codereview.chromium.org/149247

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2372 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 8e0e670b
...@@ -427,6 +427,19 @@ function TimeClip(time) { ...@@ -427,6 +427,19 @@ function TimeClip(time) {
} }
// The Date cache is used to limit the cost of parsing the same Date
// strings over and over again.
var Date_cache = {
// Cached time value.
time: $NaN,
// Cached year when interpreting the time as a local time. Only
// valid when the time matches cached time.
year: $NaN,
// String input for which the cached time is valid.
string: null
};
%SetCode($Date, function(year, month, date, hours, minutes, seconds, ms) { %SetCode($Date, function(year, month, date, hours, minutes, seconds, ms) {
if (!%_IsConstructCall()) { if (!%_IsConstructCall()) {
// ECMA 262 - 15.9.2 // ECMA 262 - 15.9.2
...@@ -442,6 +455,20 @@ function TimeClip(time) { ...@@ -442,6 +455,20 @@ function TimeClip(time) {
} else if (argc == 1) { } else if (argc == 1) {
if (IS_NUMBER(year)) { if (IS_NUMBER(year)) {
value = TimeClip(year); value = TimeClip(year);
} else if (IS_STRING(year)) {
// Probe the Date cache. If we already have a time value for the
// given time, we re-use that instead of parsing the string again.
var cache = Date_cache;
if (cache.string === year) {
value = cache.time;
} else {
value = DateParse(year);
cache.time = value;
cache.year = YearFromTime(LocalTimeNoCheck(value));
cache.string = year;
}
} else { } else {
// According to ECMA 262, no hint should be given for this // According to ECMA 262, no hint should be given for this
// conversion. However, ToPrimitive defaults to STRING_HINT for // conversion. However, ToPrimitive defaults to STRING_HINT for
...@@ -537,8 +564,9 @@ function GetUTCHoursFrom(aDate) { ...@@ -537,8 +564,9 @@ function GetUTCHoursFrom(aDate) {
function GetFullYearFrom(aDate) { function GetFullYearFrom(aDate) {
var t = DATE_VALUE(aDate); var t = DATE_VALUE(aDate);
if (NUMBER_IS_NAN(t)) return t; if (NUMBER_IS_NAN(t)) return t;
// Ignore the DST offset for year computations. var cache = Date_cache;
return YearFromTime(t + local_time_offset); if (cache.time === t) return cache.year;
return YearFromTime(LocalTimeNoCheck(t));
} }
...@@ -634,7 +662,7 @@ function DatePrintString(time) { ...@@ -634,7 +662,7 @@ function DatePrintString(time) {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Reused output buffer. // Reused output buffer. Used when parsing date strings.
var parse_buffer = $Array(7); var parse_buffer = $Array(7);
// ECMA 262 - 15.9.4.2 // ECMA 262 - 15.9.4.2
......
...@@ -4155,16 +4155,21 @@ static Object* Runtime_Math_pow(Arguments args) { ...@@ -4155,16 +4155,21 @@ static Object* Runtime_Math_pow(Arguments args) {
} }
CONVERT_DOUBLE_CHECKED(y, args[1]); CONVERT_DOUBLE_CHECKED(y, args[1]);
if (y == 0.5) {
// It's not uncommon to use Math.pow(x, 0.5) to compute the square if (!isinf(x)) {
// root of a number. To speed up such computations, we explictly if (y == 0.5) {
// check for this case and use the sqrt() function which is faster // It's not uncommon to use Math.pow(x, 0.5) to compute the
// than pow(). // square root of a number. To speed up such computations, we
return Heap::AllocateHeapNumber(sqrt(x)); // explictly check for this case and use the sqrt() function
} else if (y == -0.5) { // which is faster than pow().
// Optimized using Math.pow(x, -0.5) == 1 / Math.pow(x, 0.5). return Heap::AllocateHeapNumber(sqrt(x));
return Heap::AllocateHeapNumber(1.0 / sqrt(x)); } else if (y == -0.5) {
} else if (y == 0) { // Optimized using Math.pow(x, -0.5) == 1 / Math.pow(x, 0.5).
return Heap::AllocateHeapNumber(1.0 / sqrt(x));
}
}
if (y == 0) {
return Smi::FromInt(1); return Smi::FromInt(1);
} else if (isnan(y) || ((x == 1 || x == -1) && isinf(y))) { } else if (isnan(y) || ((x == 1 || x == -1) && isinf(y))) {
return Heap::nan_value(); return Heap::nan_value();
......
// Copyright 2009 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// See http://code.google.com/p/v8/issues/detail?id=397
assertEquals("Infinity", String(Math.pow(Infinity, 0.5)));
assertEquals(0, Math.pow(Infinity, -0.5));
assertEquals("Infinity", String(Math.pow(-Infinity, 0.5)));
assertEquals(0, Math.pow(-Infinity, -0.5));
// Copyright 2009 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// See http://code.google.com/p/v8/issues/detail?id=399
var date = new Date(1.009804e12);
var year = String(date).match(/.*(200\d)/)[1];
assertEquals(year, date.getFullYear());
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment