Reuse output array instead of creating a new one for each call in Date.parse

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1544 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
lrn@chromium.org 2009-03-19 09:40:38 +00:00
parent b37b9af182
commit c918bec9df
5 changed files with 28 additions and 22 deletions

View File

@ -228,7 +228,6 @@ function TimeInYear(year) {
// Compute modified Julian day from year, month, date.
// The missing days in 1582 are ignored for JavaScript compatibility.
function ToJulianDay(year, month, date) {
var jy = (month > 1) ? year : year - 1;
var jm = (month > 1) ? month + 2 : month + 14;
@ -568,10 +567,12 @@ function DatePrintString(time) {
// -------------------------------------------------------------------
// Reused output buffer.
var parse_buffer = $Array(7);
// ECMA 262 - 15.9.4.2
function DateParse(string) {
var arr = %DateParseString(ToString(string));
var arr = %DateParseString(ToString(string), parse_buffer);
if (IS_NULL(arr)) return $NaN;
var day = MakeDay(arr[0], arr[1], arr[2]);

View File

@ -29,7 +29,7 @@ namespace v8 { namespace internal {
template <typename Char>
bool DateParser::Parse(Vector<Char> str, FixedArray* out) {
ASSERT(out->length() == OUTPUT_SIZE);
ASSERT(out->length() >= OUTPUT_SIZE);
InputReader<Char> in(str);
TimeZoneComposer tz;
TimeComposer time;

View File

@ -48,7 +48,9 @@ class DateParser : public AllStatic {
template <typename Char>
static bool Parse(Vector<Char> str, FixedArray* output);
enum {YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, UTC_OFFSET, OUTPUT_SIZE};
enum {
YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, UTC_OFFSET, OUTPUT_SIZE
};
private:
// Range testing

View File

@ -4480,27 +4480,30 @@ static Object* Runtime_DateCurrentTime(Arguments args) {
static Object* Runtime_DateParseString(Arguments args) {
HandleScope scope;
ASSERT(args.length() == 1);
ASSERT(args.length() == 2);
CONVERT_CHECKED(String, string_object, args[0]);
Handle<String> str(string_object);
CONVERT_ARG_CHECKED(String, str, 0);
FlattenString(str);
Handle<FixedArray> output = Factory::NewFixedArray(DateParser::OUTPUT_SIZE);
CONVERT_ARG_CHECKED(JSArray, output, 1);
RUNTIME_ASSERT(output->HasFastElements());
AssertNoAllocation no_allocation;
FixedArray* output_array = output->elements();
RUNTIME_ASSERT(output_array->length() >= DateParser::OUTPUT_SIZE);
bool result;
{
AssertNoAllocation no_allocation;
if (StringShape(*str).IsAsciiRepresentation()) {
result = DateParser::Parse(str->ToAsciiVector(), *output);
} else {
ASSERT(StringShape(*str).IsTwoByteRepresentation());
result = DateParser::Parse(str->ToUC16Vector(), *output);
}
}
if (result) {
return *Factory::NewJSArrayWithElements(output);
if (StringShape(*str).IsAsciiRepresentation()) {
result = DateParser::Parse(str->ToAsciiVector(), output_array);
} else {
return *Factory::null_value();
ASSERT(StringShape(*str).IsTwoByteRepresentation());
result = DateParser::Parse(str->ToUC16Vector(), output_array);
}
if (result) {
return *output;
} else {
return Heap::null_value();
}
}

View File

@ -185,7 +185,7 @@ namespace v8 { namespace internal {
\
/* Dates */ \
F(DateCurrentTime, 0) \
F(DateParseString, 1) \
F(DateParseString, 2) \
F(DateLocalTimezone, 1) \
F(DateLocalTimeOffset, 0) \
F(DateDaylightSavingsOffset, 1) \