Author: [email protected]
Date: Thu Mar 19 02:40:38 2009
New Revision: 1544

Modified:
    branches/bleeding_edge/src/date-delay.js
    branches/bleeding_edge/src/dateparser-inl.h
    branches/bleeding_edge/src/dateparser.h
    branches/bleeding_edge/src/runtime.cc
    branches/bleeding_edge/src/runtime.h

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


Modified: branches/bleeding_edge/src/date-delay.js
==============================================================================
--- branches/bleeding_edge/src/date-delay.js    (original)
+++ branches/bleeding_edge/src/date-delay.js    Thu Mar 19 02:40:38 2009
@@ -228,7 +228,6 @@


  // 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 @@

  // -------------------------------------------------------------------

+// 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]);

Modified: branches/bleeding_edge/src/dateparser-inl.h
==============================================================================
--- branches/bleeding_edge/src/dateparser-inl.h (original)
+++ branches/bleeding_edge/src/dateparser-inl.h Thu Mar 19 02:40:38 2009
@@ -29,7 +29,7 @@

  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;

Modified: branches/bleeding_edge/src/dateparser.h
==============================================================================
--- branches/bleeding_edge/src/dateparser.h     (original)
+++ branches/bleeding_edge/src/dateparser.h     Thu Mar 19 02:40:38 2009
@@ -48,7 +48,9 @@
    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

Modified: branches/bleeding_edge/src/runtime.cc
==============================================================================
--- branches/bleeding_edge/src/runtime.cc       (original)
+++ branches/bleeding_edge/src/runtime.cc       Thu Mar 19 02:40:38 2009
@@ -4480,27 +4480,30 @@

  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 (StringShape(*str).IsAsciiRepresentation()) {
+    result = DateParser::Parse(str->ToAsciiVector(), output_array);
+  } else {
+    ASSERT(StringShape(*str).IsTwoByteRepresentation());
+    result = DateParser::Parse(str->ToUC16Vector(), output_array);
    }
+
    if (result) {
-    return *Factory::NewJSArrayWithElements(output);
+    return *output;
    } else {
-    return *Factory::null_value();
+    return Heap::null_value();
    }
  }


Modified: branches/bleeding_edge/src/runtime.h
==============================================================================
--- branches/bleeding_edge/src/runtime.h        (original)
+++ branches/bleeding_edge/src/runtime.h        Thu Mar 19 02:40:38 2009
@@ -185,7 +185,7 @@
    \
    /* Dates */ \
    F(DateCurrentTime, 0) \
-  F(DateParseString, 1) \
+  F(DateParseString, 2) \
    F(DateLocalTimezone, 1) \
    F(DateLocalTimeOffset, 0) \
    F(DateDaylightSavingsOffset, 1) \

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to