From cab07f55237edc9ddb6862a6d39978e6fbc82d43 Mon Sep 17 00:00:00 2001 From: "danno@chromium.org" Date: Thu, 29 Dec 2011 12:19:34 +0000 Subject: [PATCH] Add InternalArrayCodeGeneric R=whesse@chromium.org BUG=none TEST=none Review URL: http://codereview.chromium.org/9006051 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10308 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/builtins-arm.cc | 2 +- src/builtins.cc | 45 +++++++++++++++++++++++++++++---------------- src/builtins.h | 1 + src/ia32/builtins-ia32.cc | 2 +- src/x64/builtins-x64.cc | 2 +- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc index 71fa82d..c452821 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 array_code = - masm->isolate()->builtins()->ArrayCodeGeneric(); + masm->isolate()->builtins()->InternalArrayCodeGeneric(); __ Jump(array_code, RelocInfo::CODE_TARGET); } diff --git a/src/builtins.cc b/src/builtins.cc index 4d874c5..9167994 100644 --- a/src/builtins.cc +++ b/src/builtins.cc @@ -184,17 +184,17 @@ BUILTIN(EmptyFunction) { } -BUILTIN(ArrayCodeGeneric) { +static MaybeObject* ArrayCodeGenericCommon(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,13 +202,10 @@ 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) { - Object* obj = args[1]; + if (args->length() == 2) { + Object* obj = (*args)[1]; if (obj->IsSmi()) { int len = Smi::cast(obj)->value(); if (len >= 0 && len < JSObject::kInitialMaxFastElementArray) { @@ -225,18 +222,18 @@ BUILTIN(ArrayCodeGeneric) { { MaybeObject* maybe_obj = array->Initialize(0); if (!maybe_obj->ToObject(&obj)) return maybe_obj; } - return array->SetElementsLength(args[1]); + return array->SetElementsLength((*args)[1]); } // Optimize the case where there are no parameters passed. - if (args.length() == 1) { + if (args->length() == 1) { return array->Initialize(JSArray::kPreallocatedArrayElements); } // Set length and elements on the array. - int number_of_elements = args.length() - 1; + 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; @@ -257,7 +254,7 @@ BUILTIN(ArrayCodeGeneric) { case FAST_SMI_ONLY_ELEMENTS: { FixedArray* smi_elms = FixedArray::cast(elms); for (int index = 0; index < number_of_elements; index++) { - smi_elms->set(index, args[index+1], SKIP_WRITE_BARRIER); + smi_elms->set(index, (*args)[index+1], SKIP_WRITE_BARRIER); } break; } @@ -266,14 +263,14 @@ BUILTIN(ArrayCodeGeneric) { WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc); FixedArray* object_elms = FixedArray::cast(elms); for (int index = 0; index < number_of_elements; index++) { - object_elms->set(index, args[index+1], mode); + object_elms->set(index, (*args)[index+1], mode); } break; } case FAST_DOUBLE_ELEMENTS: { FixedDoubleArray* double_elms = FixedDoubleArray::cast(elms); for (int index = 0; index < number_of_elements; index++) { - double_elms->set(index, args[index+1]->Number()); + double_elms->set(index, (*args)[index+1]->Number()); } break; } @@ -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(); diff --git a/src/builtins.h b/src/builtins.h index a85797b..6a84f2d 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) \ diff --git a/src/ia32/builtins-ia32.cc b/src/ia32/builtins-ia32.cc index 1d6064f..3d274f2 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 array_code = - masm->isolate()->builtins()->ArrayCodeGeneric(); + masm->isolate()->builtins()->InternalArrayCodeGeneric(); __ jmp(array_code, RelocInfo::CODE_TARGET); } diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc index 74c7add..dff55fb 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 array_code = - masm->isolate()->builtins()->ArrayCodeGeneric(); + masm->isolate()->builtins()->InternalArrayCodeGeneric(); __ Jump(array_code, RelocInfo::CODE_TARGET); } -- 2.7.4