Reviewers: William Hesse,

Description:
Add InternalArrayCodeGeneric

[email protected]
BUG=none
TEST=none


Please review this at http://codereview.chromium.org/9006051/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/arguments.h
  M src/arm/builtins-arm.cc
  M src/builtins.h
  M src/builtins.cc
  M src/ia32/builtins-ia32.cc
  M src/objects-inl.h
  M src/objects.h
  M src/objects.cc
  M src/v8natives.js
  M src/x64/builtins-x64.cc


Index: src/arguments.h
diff --git a/src/arguments.h b/src/arguments.h
index e9a32702cfeea70225cac7540a5c129c4bf14cd9..d142902d22750f8b8db8114ef2c10ebb70979993 100644
--- a/src/arguments.h
+++ b/src/arguments.h
@@ -1,4 +1,4 @@
-// Copyright 2006-2008 the V8 project authors. All rights reserved.
+// Copyright 2011 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:
@@ -55,19 +55,25 @@ class Arguments BASE_EMBEDDED {
     return arguments_[-index];
   }

-  template <class S> Handle<S> at(int index) {
-    Object** value = &((*this)[index]);
+  Object* operator[] (int index) const {
+    ASSERT(0 <= index && index < length_);
+    return arguments_[-index];
+  }
+
+  template <class S> Handle<S> at(int index) const {
+    ASSERT(0 <= index && index < length_);
+    Object** value = arguments_ - index;
// This cast checks that the object we're accessing does indeed have the
     // expected type.
     S::cast(*value);
     return Handle<S>(reinterpret_cast<S**>(value));
   }

-  int smi_at(int index) {
+  int smi_at(int index) const {
     return Smi::cast((*this)[index])->value();
   }

-  double number_at(int index) {
+  double number_at(int index) const {
     return (*this)[index]->Number();
   }

@@ -76,6 +82,8 @@ class Arguments BASE_EMBEDDED {

   Object** arguments() { return arguments_; }

+  Object* const * arguments() const { return arguments_; }
+
  private:
   int length_;
   Object** arguments_;
Index: src/arm/builtins-arm.cc
diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc
index 71fa82d42cebfb686b8d47c6e80c27c7f4222f6d..c452821ff64d20b9a2092d0242db424306a9b858 100644
--- a/src/arm/builtins-arm.cc
+++ b/src/arm/builtins-arm.cc
@@ -463,7 +463,7 @@ void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) {
   __ bind(&generic_array_code);

   Handle<Code> array_code =
-      masm->isolate()->builtins()->ArrayCodeGeneric();
+      masm->isolate()->builtins()->InternalArrayCodeGeneric();
   __ Jump(array_code, RelocInfo::CODE_TARGET);
 }

Index: src/builtins.cc
diff --git a/src/builtins.cc b/src/builtins.cc
index 4d874c54ff5fa986c12aa2822205888a6338d05b..d7baa2a0416093edf69213db746908d95f577502 100644
--- a/src/builtins.cc
+++ b/src/builtins.cc
@@ -184,17 +184,17 @@ BUILTIN(EmptyFunction) {
 }


-BUILTIN(ArrayCodeGeneric) {
+static MaybeObject* ArrayCodeGenericCommon(const Arguments& args,
+                                           Isolate* isolate,
+                                           JSFunction* constructor) {
   Heap* heap = isolate->heap();
   isolate->counters()->array_function_runtime()->Increment();

   JSArray* array;
   if (CalledAsConstructor(isolate)) {
-    array = JSArray::cast(*args.receiver());
+    array = JSArray::cast(args[0]);
   } else {
     // Allocate the JS Array
-    JSFunction* constructor =
-        isolate->context()->global_context()->array_function();
     Object* obj;
     { MaybeObject* maybe_obj = heap->AllocateJSObject(constructor);
       if (!maybe_obj->ToObject(&obj)) return maybe_obj;
@@ -202,9 +202,6 @@ BUILTIN(ArrayCodeGeneric) {
     array = JSArray::cast(obj);
   }

-  // 'array' now contains the JSArray we should initialize.
-  ASSERT(array->HasFastTypeElements());
-
   // Optimize the case where there is one argument and the argument is a
   // small smi.
   if (args.length() == 2) {
@@ -236,7 +233,7 @@ BUILTIN(ArrayCodeGeneric) {
   // Set length and elements on the array.
   int number_of_elements = args.length() - 1;
   MaybeObject* maybe_object =
-      array->EnsureCanContainElements(&args, 1, number_of_elements,
+      array->EnsureCanContainElements(args, 1, number_of_elements,
                                       ALLOW_CONVERTED_DOUBLE_ELEMENTS);
   if (maybe_object->IsFailure()) return maybe_object;

@@ -288,6 +285,22 @@ BUILTIN(ArrayCodeGeneric) {
 }


+BUILTIN(InternalArrayCodeGeneric) {
+  return ArrayCodeGenericCommon(
+      args,
+      isolate,
+      isolate->context()->global_context()->internal_array_function());
+}
+
+
+BUILTIN(ArrayCodeGeneric) {
+  return ArrayCodeGenericCommon(
+      args,
+      isolate,
+      isolate->context()->global_context()->array_function());
+}
+
+
 MUST_USE_RESULT static MaybeObject* AllocateJSArray(Heap* heap) {
   JSFunction* array_function =
       heap->isolate()->context()->global_context()->array_function();
@@ -424,7 +437,7 @@ static bool ArrayPrototypeHasNoElements(Heap* heap,

 MUST_USE_RESULT
 static inline MaybeObject* EnsureJSArrayWithWritableFastElements(
-    Heap* heap, Object* receiver, Arguments* args, int first_added_arg) {
+ Heap* heap, Object* receiver, const Arguments* args, int first_added_arg) {
   if (!receiver->IsJSArray()) return NULL;
   JSArray* array = JSArray::cast(receiver);
   HeapObject* elms = array->elements();
@@ -449,7 +462,7 @@ static inline MaybeObject* EnsureJSArrayWithWritableFastElements(
   if (first_added_arg >= args_length) return array->elements();

   MaybeObject* maybe_array = array->EnsureCanContainElements(
-      args,
+      *args,
       first_added_arg,
       args_length - first_added_arg,
       DONT_ALLOW_DOUBLE_ELEMENTS);
@@ -655,7 +668,7 @@ BUILTIN(ArrayUnshift) {
   ASSERT(to_add <= (Smi::kMaxValue - len));

   MaybeObject* maybe_object =
-      array->EnsureCanContainElements(&args, 1, to_add,
+      array->EnsureCanContainElements(args, 1, to_add,
                                       DONT_ALLOW_DOUBLE_ELEMENTS);
   if (maybe_object->IsFailure()) return maybe_object;

Index: src/builtins.h
diff --git a/src/builtins.h b/src/builtins.h
index a85797b17872eef5c7674c0dc9ad429c0ac1edc9..6a84f2ddd19f805b4a42c6a083d5279d3f9ded05 100644
--- a/src/builtins.h
+++ b/src/builtins.h
@@ -44,6 +44,7 @@ enum BuiltinExtraArguments {
                                                                     \
   V(EmptyFunction, NO_EXTRA_ARGUMENTS)                              \
                                                                     \
+  V(InternalArrayCodeGeneric, NO_EXTRA_ARGUMENTS)                   \
   V(ArrayCodeGeneric, NO_EXTRA_ARGUMENTS)                           \
                                                                     \
   V(ArrayPush, NO_EXTRA_ARGUMENTS)                                  \
Index: src/ia32/builtins-ia32.cc
diff --git a/src/ia32/builtins-ia32.cc b/src/ia32/builtins-ia32.cc
index 1d6064facd87d3123bc96b000c4be057bc477c38..3d274f2e6b8130ab671634b9ab0856b195af519b 100644
--- a/src/ia32/builtins-ia32.cc
+++ b/src/ia32/builtins-ia32.cc
@@ -1337,7 +1337,7 @@ void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) {
   // the construction.
   __ bind(&generic_array_code);
   Handle<Code> array_code =
-      masm->isolate()->builtins()->ArrayCodeGeneric();
+      masm->isolate()->builtins()->InternalArrayCodeGeneric();
   __ jmp(array_code, RelocInfo::CODE_TARGET);
 }

Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index 7c7f0940067ad7500c80d1ed416f38c818e7f192..ab3cbeb43f4718fd0b5ed90b0598e219b197c9bd 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -1238,7 +1238,7 @@ MaybeObject* JSObject::EnsureCanContainHeapObjectElements() {
 }


-MaybeObject* JSObject::EnsureCanContainElements(Object** objects,
+MaybeObject* JSObject::EnsureCanContainElements(Object* const * objects,
                                                 uint32_t count,
                                                 EnsureElementsMode mode) {
   ElementsKind current_kind = map()->elements_kind();
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index ae5aa78cae57fc078a87ed41d290a3c9b10a1597..ccbf017f0267bb30bc3fa357f2154391d447e2e1 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -8526,7 +8526,7 @@ MaybeObject* JSReceiver::SetPrototype(Object* value,
 }


-MaybeObject* JSObject::EnsureCanContainElements(Arguments* args,
+MaybeObject* JSObject::EnsureCanContainElements(const Arguments& args,
                                                 uint32_t first_arg,
                                                 uint32_t arg_count,
                                                 EnsureElementsMode mode) {
@@ -8534,7 +8534,7 @@ MaybeObject* JSObject::EnsureCanContainElements(Arguments* args, // stack), but the method that's called here iterates over them in forward
   // direction.
   return EnsureCanContainElements(
-      args->arguments() - first_arg - (arg_count - 1),
+      args.arguments() - first_arg - (arg_count - 1),
       arg_count, mode);
 }

Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index 5346585bd3e0aad0e7bcf6b2b49cdc6680ecb315..f7cfecc4f7456626eb71c3bd322b6c999b74345a 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -1625,12 +1625,12 @@ class JSObject: public JSReceiver {
   inline MaybeObject* EnsureCanContainHeapObjectElements();

   // Makes sure that this object can contain the specified elements.
-  inline MaybeObject* EnsureCanContainElements(Object** elements,
+  inline MaybeObject* EnsureCanContainElements(Object* const * elements,
                                                uint32_t count,
                                                EnsureElementsMode mode);
   inline MaybeObject* EnsureCanContainElements(FixedArrayBase* elements,
                                                EnsureElementsMode mode);
-  MaybeObject* EnsureCanContainElements(Arguments* arguments,
+  MaybeObject* EnsureCanContainElements(const Arguments& arguments,
                                         uint32_t first_arg,
                                         uint32_t arg_count,
                                         EnsureElementsMode mode);
Index: src/v8natives.js
diff --git a/src/v8natives.js b/src/v8natives.js
index 1d54e28e97687ca981372b41525ffbed6b150e3a..9dae36b7fe2db75d905d0131b481eec512a3fde8 100644
--- a/src/v8natives.js
+++ b/src/v8natives.js
@@ -1,3 +1,4 @@
+
 // Copyright 2011 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
Index: src/x64/builtins-x64.cc
diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc
index 74c7add97306bca3420a333ff0b23644d5e2200b..dff55fb74de9fe3b67203d935c922b83d7227205 100644
--- a/src/x64/builtins-x64.cc
+++ b/src/x64/builtins-x64.cc
@@ -1357,7 +1357,7 @@ void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) {
   // the construction.
   __ bind(&generic_array_code);
   Handle<Code> array_code =
-      masm->isolate()->builtins()->ArrayCodeGeneric();
+      masm->isolate()->builtins()->InternalArrayCodeGeneric();
   __ Jump(array_code, RelocInfo::CODE_TARGET);
 }



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

Reply via email to