- Optimized JSArray allocation in runtime system by using NewJSArrayWithElements.
authorbak@chromium.org <bak@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 9 Oct 2008 13:34:17 +0000 (13:34 +0000)
committerbak@chromium.org <bak@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 9 Oct 2008 13:34:17 +0000 (13:34 +0000)
Review URL: http://codereview.chromium.org/7013

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@479 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/factory.cc
src/handles.cc
src/jsregexp.cc
src/objects.cc

index 2ef40c4..2eeb3b9 100644 (file)
@@ -283,10 +283,12 @@ Handle<Object> Factory::NewReferenceError(Handle<String> message) {
 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);
 }
 
index 4f7c0d1..5f86792 100644 (file)
@@ -391,13 +391,8 @@ Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSObject> object) {
 
 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);
 }
 
 
index 854c136..768c719 100644 (file)
@@ -220,10 +220,11 @@ Handle<Object> RegExpImpl::AtomExec(Handle<JSRegExp> re,
   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 @@ Handle<Object> RegExpImpl::AtomExecGlobal(Handle<JSRegExp> re,
     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 @@ Handle<Object> RegExpImpl::JsreCompile(Handle<JSRegExp> re,
     }
 
     ASSERT(code != NULL);
-
     // Convert the return address to a ByteArray pointer.
     Handle<ByteArray> internal(
         ByteArray::FromDataStartAddress(reinterpret_cast<Address>(code)));
@@ -368,14 +369,13 @@ Handle<Object> RegExpImpl::JsreExecOnce(Handle<JSRegExp> regexp,
     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 @@ Handle<Object> RegExpImpl::JsreExecGlobal(Handle<JSRegExp> regexp,
 
   int previous_index = 0;
 
-  Handle<JSArray> result =  Factory::NewJSArray(0);
+  Handle<JSArray> result = Factory::NewJSArray(0);
   int i = 0;
   Handle<Object> matches;
 
index 69e7df2..1bc6f42 100644 (file)
@@ -4695,7 +4695,6 @@ Object* JSObject::SetFastElement(uint32_t index, Object* value) {
   return SetElement(index, value);
 }
 
-
 Object* JSObject::SetElement(uint32_t index, Object* value) {
   // Check access rights if needed.
   if (IsAccessCheckNeeded() &&