Author: [EMAIL PROTECTED]
Date: Thu Oct  9 06:34:17 2008
New Revision: 479

Modified:
    branches/bleeding_edge/src/factory.cc
    branches/bleeding_edge/src/handles.cc
    branches/bleeding_edge/src/jsregexp.cc
    branches/bleeding_edge/src/objects.cc

Log:
- Optimized JSArray allocation in runtime system by using  
NewJSArrayWithElements.

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

Modified: branches/bleeding_edge/src/factory.cc
==============================================================================
--- branches/bleeding_edge/src/factory.cc       (original)
+++ branches/bleeding_edge/src/factory.cc       Thu Oct  9 06:34:17 2008
@@ -283,10 +283,12 @@
  Handle<Object> Factory::NewError(const char* maker, const char* type,
      Vector< Handle<Object> > args) {
    HandleScope scope;
-  Handle<JSArray> array = NewJSArray(args.length());
-  for (int i = 0; i < args.length(); i++)
-    SetElement(array, i, args[i]);
-  Handle<Object> result = NewError(maker, type, array);
+  Handle<FixedArray> array = Factory::NewFixedArray(args.length());
+  for (int i = 0; i < args.length(); i++) {
+    array->set(i, *args[i]);
+  }
+  Handle<JSArray> object = Factory::NewJSArrayWithElements(array);
+  Handle<Object> result = NewError(maker, type, object);
    return result.EscapeFrom(&scope);
  }


Modified: branches/bleeding_edge/src/handles.cc
==============================================================================
--- branches/bleeding_edge/src/handles.cc       (original)
+++ branches/bleeding_edge/src/handles.cc       Thu Oct  9 06:34:17 2008
@@ -391,13 +391,8 @@

  Handle<JSArray> GetKeysFor(Handle<JSObject> object) {
    Counters::for_in.Increment();
-
-  Handle<FixedArray> content = GetKeysInFixedArrayFor(object);
-
-  // Allocate the JSArray with the result.
-  Handle<JSArray> obj = Factory::NewJSArray(content->length());
-  Handle<JSArray>::cast(obj)->SetContent(*content);
-  return Handle<JSArray>::cast(obj);
+  Handle<FixedArray> elements = GetKeysInFixedArrayFor(object);
+  return Factory::NewJSArrayWithElements(elements);
  }



Modified: branches/bleeding_edge/src/jsregexp.cc
==============================================================================
--- branches/bleeding_edge/src/jsregexp.cc      (original)
+++ branches/bleeding_edge/src/jsregexp.cc      Thu Oct  9 06:34:17 2008
@@ -220,10 +220,11 @@
    LOG(RegExpExecEvent(re, start_index, subject));
    int value = Runtime::StringMatch(subject, needle, start_index);
    if (value == -1) return Factory::null_value();
-  Handle<JSArray> result = Factory::NewJSArray(2);
-  SetElement(result, 0, Handle<Smi>(Smi::FromInt(value)));
-  SetElement(result, 1, Handle<Smi>(Smi::FromInt(value +  
needle->length())));
-  return result;
+
+  Handle<FixedArray> array = Factory::NewFixedArray(2);
+  array->set(0, Smi::FromInt(value));
+  array->set(1, Smi::FromInt(value + needle->length()));
+  return Factory::NewJSArrayWithElements(array);
  }


@@ -244,14 +245,15 @@
      if (value == -1) break;
      HandleScope scope;
      int end = value + needle_length;
-    Handle<JSArray> pair = Factory::NewJSArray(2);
-    SetElement(pair, 0, Handle<Smi>(Smi::FromInt(value)));
-    SetElement(pair, 1, Handle<Smi>(Smi::FromInt(end)));
+
+    Handle<FixedArray> array = Factory::NewFixedArray(2);
+    array->set(0, Smi::FromInt(value));
+    array->set(1, Smi::FromInt(end));
+    Handle<JSArray> pair = Factory::NewJSArrayWithElements(array);
      SetElement(result, match_count, pair);
      match_count++;
      index = end;
-    if (needle_length == 0)
-      index++;
+    if (needle_length == 0) index++;
    }
    return result;
  }
@@ -311,7 +313,6 @@
      }

      ASSERT(code != NULL);
-
      // Convert the return address to a ByteArray pointer.
      Handle<ByteArray> internal(
          ByteArray::FromDataStartAddress(reinterpret_cast<Address>(code)));
@@ -368,14 +369,13 @@
      return Handle<Object>(Top::Throw(*regexp_err));
    }

-  Handle<JSArray> result = Factory::NewJSArray(2 * (num_captures+1));
-
+  Handle<FixedArray> array = Factory::NewFixedArray(2 * (num_captures+1));
    // The captures come in (start, end+1) pairs.
    for (int i = 0; i < 2 * (num_captures+1); i += 2) {
-    SetElement(result, i, Handle<Object>(Smi::FromInt(offsets_vector[i])));
-    SetElement(result, i+1,  
Handle<Object>(Smi::FromInt(offsets_vector[i+1])));
+    array->set(i, Smi::FromInt(offsets_vector[i]));
+    array->set(i+1, Smi::FromInt(offsets_vector[i+1]));
    }
-  return result;
+  return Factory::NewJSArrayWithElements(array);
  }


@@ -450,7 +450,7 @@

    int previous_index = 0;

-  Handle<JSArray> result =  Factory::NewJSArray(0);
+  Handle<JSArray> result = Factory::NewJSArray(0);
    int i = 0;
    Handle<Object> matches;


Modified: branches/bleeding_edge/src/objects.cc
==============================================================================
--- branches/bleeding_edge/src/objects.cc       (original)
+++ branches/bleeding_edge/src/objects.cc       Thu Oct  9 06:34:17 2008
@@ -4695,7 +4695,6 @@
    return SetElement(index, value);
  }

-
  Object* JSObject::SetElement(uint32_t index, Object* value) {
    // Check access rights if needed.
    if (IsAccessCheckNeeded() &&

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

Reply via email to