| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/code-stubs.h" | 5 #include "src/code-stubs.h" | 
| 6 | 6 | 
| 7 #include <sstream> | 7 #include <sstream> | 
| 8 | 8 | 
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" | 
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" | 
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 414   CodeStubAssembler assembler(isolate(), &zone, descriptor, GetCodeFlags(), | 414   CodeStubAssembler assembler(isolate(), &zone, descriptor, GetCodeFlags(), | 
| 415                               name); | 415                               name); | 
| 416   GenerateAssembly(&assembler); | 416   GenerateAssembly(&assembler); | 
| 417   return assembler.GenerateCode(); | 417   return assembler.GenerateCode(); | 
| 418 } | 418 } | 
| 419 | 419 | 
| 420 void LoadICTrampolineTFStub::GenerateAssembly( | 420 void LoadICTrampolineTFStub::GenerateAssembly( | 
| 421     CodeStubAssembler* assembler) const { | 421     CodeStubAssembler* assembler) const { | 
| 422   typedef compiler::Node Node; | 422   typedef compiler::Node Node; | 
| 423 | 423 | 
| 424   Node* receiver = assembler->Parameter(0); | 424   Node* receiver = assembler->Parameter(Descriptor::kReceiver); | 
| 425   Node* name = assembler->Parameter(1); | 425   Node* name = assembler->Parameter(Descriptor::kName); | 
| 426   Node* slot = assembler->Parameter(2); | 426   Node* slot = assembler->Parameter(Descriptor::kSlot); | 
| 427   Node* context = assembler->Parameter(3); | 427   Node* context = assembler->Parameter(Descriptor::kContext); | 
| 428   Node* vector = assembler->LoadTypeFeedbackVectorForStub(); | 428   Node* vector = assembler->LoadTypeFeedbackVectorForStub(); | 
| 429 | 429 | 
| 430   CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); | 430   CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); | 
| 431   assembler->LoadIC(&p); | 431   assembler->LoadIC(&p); | 
| 432 } | 432 } | 
| 433 | 433 | 
| 434 void LoadICTFStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 434 void LoadICTFStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 
| 435   typedef compiler::Node Node; | 435   typedef compiler::Node Node; | 
| 436 | 436 | 
| 437   Node* receiver = assembler->Parameter(0); | 437   Node* receiver = assembler->Parameter(Descriptor::kReceiver); | 
| 438   Node* name = assembler->Parameter(1); | 438   Node* name = assembler->Parameter(Descriptor::kName); | 
| 439   Node* slot = assembler->Parameter(2); | 439   Node* slot = assembler->Parameter(Descriptor::kSlot); | 
| 440   Node* vector = assembler->Parameter(3); | 440   Node* vector = assembler->Parameter(Descriptor::kVector); | 
| 441   Node* context = assembler->Parameter(4); | 441   Node* context = assembler->Parameter(Descriptor::kContext); | 
| 442 | 442 | 
| 443   CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); | 443   CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); | 
| 444   assembler->LoadIC(&p); | 444   assembler->LoadIC(&p); | 
| 445 } | 445 } | 
| 446 | 446 | 
| 447 void LoadGlobalICTrampolineStub::GenerateAssembly( | 447 void LoadGlobalICTrampolineStub::GenerateAssembly( | 
| 448     CodeStubAssembler* assembler) const { | 448     CodeStubAssembler* assembler) const { | 
| 449   typedef compiler::Node Node; | 449   typedef compiler::Node Node; | 
| 450 | 450 | 
| 451   Node* slot = assembler->Parameter(0); | 451   Node* slot = assembler->Parameter(Descriptor::kSlot); | 
| 452   Node* context = assembler->Parameter(1); | 452   Node* context = assembler->Parameter(Descriptor::kContext); | 
| 453   Node* vector = assembler->LoadTypeFeedbackVectorForStub(); | 453   Node* vector = assembler->LoadTypeFeedbackVectorForStub(); | 
| 454 | 454 | 
| 455   CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, | 455   CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, | 
| 456                                         vector); | 456                                         vector); | 
| 457   assembler->LoadGlobalIC(&p); | 457   assembler->LoadGlobalIC(&p); | 
| 458 } | 458 } | 
| 459 | 459 | 
| 460 void LoadGlobalICStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 460 void LoadGlobalICStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 
| 461   typedef compiler::Node Node; | 461   typedef compiler::Node Node; | 
| 462 | 462 | 
| 463   Node* slot = assembler->Parameter(0); | 463   Node* slot = assembler->Parameter(Descriptor::kSlot); | 
| 464   Node* vector = assembler->Parameter(1); | 464   Node* vector = assembler->Parameter(Descriptor::kVector); | 
| 465   Node* context = assembler->Parameter(2); | 465   Node* context = assembler->Parameter(Descriptor::kContext); | 
| 466 | 466 | 
| 467   CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, | 467   CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, | 
| 468                                         vector); | 468                                         vector); | 
| 469   assembler->LoadGlobalIC(&p); | 469   assembler->LoadGlobalIC(&p); | 
| 470 } | 470 } | 
| 471 | 471 | 
| 472 void AllocateHeapNumberStub::GenerateAssembly( | 472 void AllocateHeapNumberStub::GenerateAssembly( | 
| 473     CodeStubAssembler* assembler) const { | 473     CodeStubAssembler* assembler) const { | 
| 474   typedef compiler::Node Node; | 474   typedef compiler::Node Node; | 
| 475 | 475 | 
| (...skipping 3076 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3552   assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); | 3552   assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); | 
| 3553 | 3553 | 
| 3554   assembler->Bind(&if_notequal); | 3554   assembler->Bind(&if_notequal); | 
| 3555   assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); | 3555   assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); | 
| 3556 } | 3556 } | 
| 3557 | 3557 | 
| 3558 }  // namespace | 3558 }  // namespace | 
| 3559 | 3559 | 
| 3560 void LoadApiGetterStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 3560 void LoadApiGetterStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 
| 3561   typedef compiler::Node Node; | 3561   typedef compiler::Node Node; | 
| 3562   Node* context = assembler->Parameter(3); | 3562   Node* context = assembler->Parameter(Descriptor::kContext); | 
| 3563   Node* receiver = assembler->Parameter(0); | 3563   Node* receiver = assembler->Parameter(Descriptor::kReceiver); | 
| 3564   // For now we only support receiver_is_holder. | 3564   // For now we only support receiver_is_holder. | 
| 3565   DCHECK(receiver_is_holder()); | 3565   DCHECK(receiver_is_holder()); | 
| 3566   Node* holder = receiver; | 3566   Node* holder = receiver; | 
| 3567   Node* map = assembler->LoadMap(receiver); | 3567   Node* map = assembler->LoadMap(receiver); | 
| 3568   Node* descriptors = assembler->LoadMapDescriptors(map); | 3568   Node* descriptors = assembler->LoadMapDescriptors(map); | 
| 3569   Node* offset = | 3569   Node* offset = | 
| 3570       assembler->Int32Constant(DescriptorArray::ToValueIndex(index())); | 3570       assembler->Int32Constant(DescriptorArray::ToValueIndex(index())); | 
| 3571   Node* callback = assembler->LoadFixedArrayElement(descriptors, offset); | 3571   Node* callback = assembler->LoadFixedArrayElement(descriptors, offset); | 
| 3572   assembler->TailCallStub(CodeFactory::ApiGetter(isolate()), context, receiver, | 3572   assembler->TailCallStub(CodeFactory::ApiGetter(isolate()), context, receiver, | 
| 3573                           holder, callback); | 3573                           holder, callback); | 
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3798     assembler->Return(var_arg.value()); | 3798     assembler->Return(var_arg.value()); | 
| 3799 | 3799 | 
| 3800     assembler->Bind(&return_zero); | 3800     assembler->Bind(&return_zero); | 
| 3801     assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); | 3801     assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); | 
| 3802   } | 3802   } | 
| 3803 } | 3803 } | 
| 3804 | 3804 | 
| 3805 void StoreInterceptorStub::GenerateAssembly( | 3805 void StoreInterceptorStub::GenerateAssembly( | 
| 3806     CodeStubAssembler* assembler) const { | 3806     CodeStubAssembler* assembler) const { | 
| 3807   typedef compiler::Node Node; | 3807   typedef compiler::Node Node; | 
| 3808   Node* receiver = assembler->Parameter(0); | 3808 | 
| 3809   Node* name = assembler->Parameter(1); | 3809   Node* receiver = assembler->Parameter(Descriptor::kReceiver); | 
| 3810   Node* value = assembler->Parameter(2); | 3810   Node* name = assembler->Parameter(Descriptor::kName); | 
| 3811   // Node* slot = assembler->Parameter(3); | 3811   Node* value = assembler->Parameter(Descriptor::kValue); | 
| 3812   // Node* vector = assembler->Parameter(4); | 3812   Node* context = assembler->Parameter(Descriptor::kContext); | 
| 3813   Node* context = assembler->Parameter(5); |  | 
| 3814   assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, | 3813   assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, | 
| 3815                              receiver, name, value); | 3814                              receiver, name, value); | 
| 3816 } | 3815 } | 
| 3817 | 3816 | 
| 3818 void LoadIndexedInterceptorStub::GenerateAssembly( | 3817 void LoadIndexedInterceptorStub::GenerateAssembly( | 
| 3819     CodeStubAssembler* assembler) const { | 3818     CodeStubAssembler* assembler) const { | 
| 3820   typedef compiler::Node Node; | 3819   typedef compiler::Node Node; | 
| 3821   typedef CodeStubAssembler::Label Label; | 3820   typedef CodeStubAssembler::Label Label; | 
| 3822   Node* receiver = assembler->Parameter(0); | 3821 | 
| 3823   Node* key = assembler->Parameter(1); | 3822   Node* receiver = assembler->Parameter(Descriptor::kReceiver); | 
| 3824   Node* slot = assembler->Parameter(2); | 3823   Node* key = assembler->Parameter(Descriptor::kName); | 
| 3825   Node* vector = assembler->Parameter(3); | 3824   Node* slot = assembler->Parameter(Descriptor::kSlot); | 
| 3826   Node* context = assembler->Parameter(4); | 3825   Node* vector = assembler->Parameter(Descriptor::kVector); | 
|  | 3826   Node* context = assembler->Parameter(Descriptor::kContext); | 
| 3827 | 3827 | 
| 3828   Label if_keyispositivesmi(assembler), if_keyisinvalid(assembler); | 3828   Label if_keyispositivesmi(assembler), if_keyisinvalid(assembler); | 
| 3829   assembler->Branch(assembler->WordIsPositiveSmi(key), &if_keyispositivesmi, | 3829   assembler->Branch(assembler->WordIsPositiveSmi(key), &if_keyispositivesmi, | 
| 3830                     &if_keyisinvalid); | 3830                     &if_keyisinvalid); | 
| 3831   assembler->Bind(&if_keyispositivesmi); | 3831   assembler->Bind(&if_keyispositivesmi); | 
| 3832   assembler->TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, | 3832   assembler->TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, | 
| 3833                              receiver, key); | 3833                              receiver, key); | 
| 3834 | 3834 | 
| 3835   assembler->Bind(&if_keyisinvalid); | 3835   assembler->Bind(&if_keyisinvalid); | 
| 3836   assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, | 3836   assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, | 
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4058     CodeStubDescriptor* descriptor) { | 4058     CodeStubDescriptor* descriptor) { | 
| 4059   descriptor->Initialize( | 4059   descriptor->Initialize( | 
| 4060       FUNCTION_ADDR(Runtime_ElementsTransitionAndStoreIC_Miss)); | 4060       FUNCTION_ADDR(Runtime_ElementsTransitionAndStoreIC_Miss)); | 
| 4061 } | 4061 } | 
| 4062 | 4062 | 
| 4063 | 4063 | 
| 4064 void ToObjectStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | 4064 void ToObjectStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | 
| 4065   descriptor->Initialize(Runtime::FunctionForId(Runtime::kToObject)->entry); | 4065   descriptor->Initialize(Runtime::FunctionForId(Runtime::kToObject)->entry); | 
| 4066 } | 4066 } | 
| 4067 | 4067 | 
| 4068 | 4068 void StoreTransitionStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | 
| 4069 CallInterfaceDescriptor StoreTransitionStub::GetCallInterfaceDescriptor() | 4069   descriptor->Initialize( | 
| 4070     const { | 4070       FUNCTION_ADDR(Runtime_TransitionStoreIC_MissFromStubFailure)); | 
| 4071   return VectorStoreTransitionDescriptor(isolate()); |  | 
| 4072 } |  | 
| 4073 |  | 
| 4074 |  | 
| 4075 CallInterfaceDescriptor |  | 
| 4076 ElementsTransitionAndStoreStub::GetCallInterfaceDescriptor() const { |  | 
| 4077   return VectorStoreTransitionDescriptor(isolate()); |  | 
| 4078 } | 4071 } | 
| 4079 | 4072 | 
| 4080 void TypeofStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {} | 4073 void TypeofStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {} | 
| 4081 | 4074 | 
| 4082 void NumberToStringStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | 4075 void NumberToStringStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | 
| 4083   descriptor->Initialize( | 4076   descriptor->Initialize( | 
| 4084       Runtime::FunctionForId(Runtime::kNumberToString)->entry); | 4077       Runtime::FunctionForId(Runtime::kNumberToString)->entry); | 
| 4085 } | 4078 } | 
| 4086 | 4079 | 
| 4087 | 4080 | 
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4492 } | 4485 } | 
| 4493 | 4486 | 
| 4494 void FastNewFunctionContextStub::GenerateAssembly( | 4487 void FastNewFunctionContextStub::GenerateAssembly( | 
| 4495     CodeStubAssembler* assembler) const { | 4488     CodeStubAssembler* assembler) const { | 
| 4496   typedef compiler::Node Node; | 4489   typedef compiler::Node Node; | 
| 4497 | 4490 | 
| 4498   int length = slots() + Context::MIN_CONTEXT_SLOTS; | 4491   int length = slots() + Context::MIN_CONTEXT_SLOTS; | 
| 4499   int size = length * kPointerSize + FixedArray::kHeaderSize; | 4492   int size = length * kPointerSize + FixedArray::kHeaderSize; | 
| 4500 | 4493 | 
| 4501   // Get the function | 4494   // Get the function | 
| 4502   Node* function = | 4495   Node* function = assembler->Parameter(Descriptor::kFunction); | 
| 4503       assembler->Parameter(FastNewFunctionContextDescriptor::kFunctionIndex); | 4496   Node* context = assembler->Parameter(Descriptor::kContext); | 
| 4504   Node* context = |  | 
| 4505       assembler->Parameter(FastNewFunctionContextDescriptor::kContextIndex); |  | 
| 4506 | 4497 | 
| 4507   // Create a new closure from the given function info in new space | 4498   // Create a new closure from the given function info in new space | 
| 4508   Node* function_context = assembler->Allocate(size); | 4499   Node* function_context = assembler->Allocate(size); | 
| 4509 | 4500 | 
| 4510   assembler->StoreMapNoWriteBarrier( | 4501   assembler->StoreMapNoWriteBarrier( | 
| 4511       function_context, | 4502       function_context, | 
| 4512       assembler->HeapConstant(isolate()->factory()->function_context_map())); | 4503       assembler->HeapConstant(isolate()->factory()->function_context_map())); | 
| 4513   assembler->StoreObjectFieldNoWriteBarrier( | 4504   assembler->StoreObjectFieldNoWriteBarrier( | 
| 4514       function_context, Context::kLengthOffset, | 4505       function_context, Context::kLengthOffset, | 
| 4515       assembler->SmiConstant(Smi::FromInt(length))); | 4506       assembler->SmiConstant(Smi::FromInt(length))); | 
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4685                                                Isolate* isolate) { | 4676                                                Isolate* isolate) { | 
| 4686   FunctionEntryHook entry_hook = isolate->function_entry_hook(); | 4677   FunctionEntryHook entry_hook = isolate->function_entry_hook(); | 
| 4687   DCHECK(entry_hook != NULL); | 4678   DCHECK(entry_hook != NULL); | 
| 4688   entry_hook(function, stack_pointer); | 4679   entry_hook(function, stack_pointer); | 
| 4689 } | 4680 } | 
| 4690 | 4681 | 
| 4691 void ArrayNoArgumentConstructorStub::GenerateAssembly( | 4682 void ArrayNoArgumentConstructorStub::GenerateAssembly( | 
| 4692     CodeStubAssembler* assembler) const { | 4683     CodeStubAssembler* assembler) const { | 
| 4693   typedef compiler::Node Node; | 4684   typedef compiler::Node Node; | 
| 4694   Node* native_context = assembler->LoadObjectField( | 4685   Node* native_context = assembler->LoadObjectField( | 
| 4695       assembler->Parameter( | 4686       assembler->Parameter(Descriptor::kFunction), JSFunction::kContextOffset); | 
| 4696           ArrayNoArgumentConstructorDescriptor::kFunctionIndex), |  | 
| 4697       JSFunction::kContextOffset); |  | 
| 4698   bool track_allocation_site = | 4687   bool track_allocation_site = | 
| 4699       AllocationSite::GetMode(elements_kind()) == TRACK_ALLOCATION_SITE && | 4688       AllocationSite::GetMode(elements_kind()) == TRACK_ALLOCATION_SITE && | 
| 4700       override_mode() != DISABLE_ALLOCATION_SITES; | 4689       override_mode() != DISABLE_ALLOCATION_SITES; | 
| 4701   Node* allocation_site = | 4690   Node* allocation_site = | 
| 4702       track_allocation_site | 4691       track_allocation_site ? assembler->Parameter(Descriptor::kAllocationSite) | 
| 4703           ? assembler->Parameter( | 4692                             : nullptr; | 
| 4704                 ArrayNoArgumentConstructorDescriptor::kAllocationSiteIndex) |  | 
| 4705           : nullptr; |  | 
| 4706   Node* array_map = | 4693   Node* array_map = | 
| 4707       assembler->LoadJSArrayElementsMap(elements_kind(), native_context); | 4694       assembler->LoadJSArrayElementsMap(elements_kind(), native_context); | 
| 4708   Node* array = assembler->AllocateJSArray( | 4695   Node* array = assembler->AllocateJSArray( | 
| 4709       elements_kind(), array_map, | 4696       elements_kind(), array_map, | 
| 4710       assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), | 4697       assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), | 
| 4711       assembler->IntPtrConstant(0), allocation_site); | 4698       assembler->IntPtrConstant(0), allocation_site); | 
| 4712   assembler->Return(array); | 4699   assembler->Return(array); | 
| 4713 } | 4700 } | 
| 4714 | 4701 | 
| 4715 void InternalArrayNoArgumentConstructorStub::GenerateAssembly( | 4702 void InternalArrayNoArgumentConstructorStub::GenerateAssembly( | 
| 4716     CodeStubAssembler* assembler) const { | 4703     CodeStubAssembler* assembler) const { | 
| 4717   typedef compiler::Node Node; | 4704   typedef compiler::Node Node; | 
| 4718   Node* array_map = assembler->LoadObjectField( | 4705   Node* array_map = | 
| 4719       assembler->Parameter( | 4706       assembler->LoadObjectField(assembler->Parameter(Descriptor::kFunction), | 
| 4720           ArrayNoArgumentConstructorDescriptor::kFunctionIndex), | 4707                                  JSFunction::kPrototypeOrInitialMapOffset); | 
| 4721       JSFunction::kPrototypeOrInitialMapOffset); |  | 
| 4722   Node* array = assembler->AllocateJSArray( | 4708   Node* array = assembler->AllocateJSArray( | 
| 4723       elements_kind(), array_map, | 4709       elements_kind(), array_map, | 
| 4724       assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), | 4710       assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), | 
| 4725       assembler->IntPtrConstant(0), nullptr); | 4711       assembler->IntPtrConstant(0), nullptr); | 
| 4726   assembler->Return(array); | 4712   assembler->Return(array); | 
| 4727 } | 4713 } | 
| 4728 | 4714 | 
| 4729 namespace { | 4715 namespace { | 
| 4730 | 4716 | 
|  | 4717 template <typename Descriptor> | 
| 4731 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, | 4718 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, | 
| 4732                                      ElementsKind elements_kind, | 4719                                      ElementsKind elements_kind, | 
| 4733                                      compiler::Node* array_map, | 4720                                      compiler::Node* array_map, | 
| 4734                                      compiler::Node* allocation_site, | 4721                                      compiler::Node* allocation_site, | 
| 4735                                      AllocationSiteMode mode) { | 4722                                      AllocationSiteMode mode) { | 
| 4736   typedef compiler::Node Node; | 4723   typedef compiler::Node Node; | 
| 4737   typedef CodeStubAssembler::Label Label; | 4724   typedef CodeStubAssembler::Label Label; | 
| 4738 | 4725 | 
| 4739   Label ok(assembler); | 4726   Label ok(assembler); | 
| 4740   Label smi_size(assembler); | 4727   Label smi_size(assembler); | 
| 4741   Label small_smi_size(assembler); | 4728   Label small_smi_size(assembler); | 
| 4742   Label call_runtime(assembler, Label::kDeferred); | 4729   Label call_runtime(assembler, Label::kDeferred); | 
| 4743 | 4730 | 
| 4744   Node* size = assembler->Parameter( | 4731   Node* size = assembler->Parameter(Descriptor::kArraySizeSmiParameter); | 
| 4745       ArraySingleArgumentConstructorDescriptor::kArraySizeSmiParameterIndex); |  | 
| 4746   assembler->Branch(assembler->WordIsSmi(size), &smi_size, &call_runtime); | 4732   assembler->Branch(assembler->WordIsSmi(size), &smi_size, &call_runtime); | 
| 4747 | 4733 | 
| 4748   assembler->Bind(&smi_size); | 4734   assembler->Bind(&smi_size); | 
| 4749 | 4735 | 
| 4750   if (IsFastPackedElementsKind(elements_kind)) { | 4736   if (IsFastPackedElementsKind(elements_kind)) { | 
| 4751     Label abort(assembler, Label::kDeferred); | 4737     Label abort(assembler, Label::kDeferred); | 
| 4752     assembler->Branch( | 4738     assembler->Branch( | 
| 4753         assembler->SmiEqual(size, assembler->SmiConstant(Smi::FromInt(0))), | 4739         assembler->SmiEqual(size, assembler->SmiConstant(Smi::FromInt(0))), | 
| 4754         &small_smi_size, &abort); | 4740         &small_smi_size, &abort); | 
| 4755 | 4741 | 
| 4756     assembler->Bind(&abort); | 4742     assembler->Bind(&abort); | 
| 4757     Node* reason = | 4743     Node* reason = | 
| 4758         assembler->SmiConstant(Smi::FromInt(kAllocatingNonEmptyPackedArray)); | 4744         assembler->SmiConstant(Smi::FromInt(kAllocatingNonEmptyPackedArray)); | 
| 4759     Node* context = assembler->Parameter( | 4745     Node* context = assembler->Parameter(Descriptor::kContext); | 
| 4760         ArraySingleArgumentConstructorDescriptor::kContextIndex); |  | 
| 4761     assembler->TailCallRuntime(Runtime::kAbort, context, reason); | 4746     assembler->TailCallRuntime(Runtime::kAbort, context, reason); | 
| 4762   } else { | 4747   } else { | 
| 4763     int element_size = | 4748     int element_size = | 
| 4764         IsFastDoubleElementsKind(elements_kind) ? kDoubleSize : kPointerSize; | 4749         IsFastDoubleElementsKind(elements_kind) ? kDoubleSize : kPointerSize; | 
| 4765     int max_fast_elements = | 4750     int max_fast_elements = | 
| 4766         (Page::kMaxRegularHeapObjectSize - FixedArray::kHeaderSize - | 4751         (Page::kMaxRegularHeapObjectSize - FixedArray::kHeaderSize - | 
| 4767          JSArray::kSize - AllocationMemento::kSize) / | 4752          JSArray::kSize - AllocationMemento::kSize) / | 
| 4768         element_size; | 4753         element_size; | 
| 4769     assembler->Branch( | 4754     assembler->Branch( | 
| 4770         assembler->SmiAboveOrEqual( | 4755         assembler->SmiAboveOrEqual( | 
| 4771             size, assembler->SmiConstant(Smi::FromInt(max_fast_elements))), | 4756             size, assembler->SmiConstant(Smi::FromInt(max_fast_elements))), | 
| 4772         &call_runtime, &small_smi_size); | 4757         &call_runtime, &small_smi_size); | 
| 4773   } | 4758   } | 
| 4774 | 4759 | 
| 4775   assembler->Bind(&small_smi_size); | 4760   assembler->Bind(&small_smi_size); | 
| 4776   { | 4761   { | 
| 4777     Node* array = assembler->AllocateJSArray( | 4762     Node* array = assembler->AllocateJSArray( | 
| 4778         elements_kind, array_map, size, size, | 4763         elements_kind, array_map, size, size, | 
| 4779         mode == DONT_TRACK_ALLOCATION_SITE ? nullptr : allocation_site, | 4764         mode == DONT_TRACK_ALLOCATION_SITE ? nullptr : allocation_site, | 
| 4780         CodeStubAssembler::SMI_PARAMETERS); | 4765         CodeStubAssembler::SMI_PARAMETERS); | 
| 4781     assembler->Return(array); | 4766     assembler->Return(array); | 
| 4782   } | 4767   } | 
| 4783 | 4768 | 
| 4784   assembler->Bind(&call_runtime); | 4769   assembler->Bind(&call_runtime); | 
| 4785   { | 4770   { | 
| 4786     Node* context = assembler->Parameter( | 4771     Node* context = assembler->Parameter(Descriptor::kContext); | 
| 4787         ArraySingleArgumentConstructorDescriptor::kContextIndex); | 4772     Node* function = assembler->Parameter(Descriptor::kFunction); | 
| 4788     Node* function = assembler->Parameter( | 4773     Node* array_size = assembler->Parameter(Descriptor::kArraySizeSmiParameter); | 
| 4789         ArraySingleArgumentConstructorDescriptor::kFunctionIndex); | 4774     Node* allocation_site = assembler->Parameter(Descriptor::kAllocationSite); | 
| 4790     Node* array_size = assembler->Parameter( |  | 
| 4791         ArraySingleArgumentConstructorDescriptor::kArraySizeSmiParameterIndex); |  | 
| 4792     Node* allocation_site = assembler->Parameter( |  | 
| 4793         ArraySingleArgumentConstructorDescriptor::kAllocationSiteIndex); |  | 
| 4794     assembler->TailCallRuntime(Runtime::kNewArray, context, function, | 4775     assembler->TailCallRuntime(Runtime::kNewArray, context, function, | 
| 4795                                array_size, function, allocation_site); | 4776                                array_size, function, allocation_site); | 
| 4796   } | 4777   } | 
| 4797 } | 4778 } | 
| 4798 }  // namespace | 4779 }  // namespace | 
| 4799 | 4780 | 
| 4800 void ArraySingleArgumentConstructorStub::GenerateAssembly( | 4781 void ArraySingleArgumentConstructorStub::GenerateAssembly( | 
| 4801     CodeStubAssembler* assembler) const { | 4782     CodeStubAssembler* assembler) const { | 
| 4802   typedef compiler::Node Node; | 4783   typedef compiler::Node Node; | 
| 4803   Node* function = assembler->Parameter( | 4784   Node* function = assembler->Parameter(Descriptor::kFunction); | 
| 4804       ArraySingleArgumentConstructorDescriptor::kFunctionIndex); |  | 
| 4805   Node* native_context = | 4785   Node* native_context = | 
| 4806       assembler->LoadObjectField(function, JSFunction::kContextOffset); | 4786       assembler->LoadObjectField(function, JSFunction::kContextOffset); | 
| 4807   Node* array_map = | 4787   Node* array_map = | 
| 4808       assembler->LoadJSArrayElementsMap(elements_kind(), native_context); | 4788       assembler->LoadJSArrayElementsMap(elements_kind(), native_context); | 
| 4809   AllocationSiteMode mode = override_mode() == DISABLE_ALLOCATION_SITES | 4789   AllocationSiteMode mode = override_mode() == DISABLE_ALLOCATION_SITES | 
| 4810                                 ? DONT_TRACK_ALLOCATION_SITE | 4790                                 ? DONT_TRACK_ALLOCATION_SITE | 
| 4811                                 : AllocationSite::GetMode(elements_kind()); | 4791                                 : AllocationSite::GetMode(elements_kind()); | 
| 4812   Node* allocation_site = assembler->Parameter( | 4792   Node* allocation_site = assembler->Parameter(Descriptor::kAllocationSite); | 
| 4813       ArrayNoArgumentConstructorDescriptor::kAllocationSiteIndex); | 4793   SingleArgumentConstructorCommon<Descriptor>(assembler, elements_kind(), | 
| 4814   SingleArgumentConstructorCommon(assembler, elements_kind(), array_map, | 4794                                               array_map, allocation_site, mode); | 
| 4815                                   allocation_site, mode); |  | 
| 4816 } | 4795 } | 
| 4817 | 4796 | 
| 4818 void InternalArraySingleArgumentConstructorStub::GenerateAssembly( | 4797 void InternalArraySingleArgumentConstructorStub::GenerateAssembly( | 
| 4819     CodeStubAssembler* assembler) const { | 4798     CodeStubAssembler* assembler) const { | 
| 4820   typedef compiler::Node Node; | 4799   typedef compiler::Node Node; | 
| 4821   Node* function = assembler->Parameter( | 4800   Node* function = assembler->Parameter(Descriptor::kFunction); | 
| 4822       ArraySingleArgumentConstructorDescriptor::kFunctionIndex); |  | 
| 4823   Node* array_map = assembler->LoadObjectField( | 4801   Node* array_map = assembler->LoadObjectField( | 
| 4824       function, JSFunction::kPrototypeOrInitialMapOffset); | 4802       function, JSFunction::kPrototypeOrInitialMapOffset); | 
| 4825   SingleArgumentConstructorCommon(assembler, elements_kind(), array_map, | 4803   SingleArgumentConstructorCommon<Descriptor>( | 
| 4826                                   assembler->UndefinedConstant(), | 4804       assembler, elements_kind(), array_map, assembler->UndefinedConstant(), | 
| 4827                                   DONT_TRACK_ALLOCATION_SITE); | 4805       DONT_TRACK_ALLOCATION_SITE); | 
| 4828 } | 4806 } | 
| 4829 | 4807 | 
| 4830 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 4808 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 
| 4831     : PlatformCodeStub(isolate) { | 4809     : PlatformCodeStub(isolate) { | 
| 4832   minor_key_ = ArgumentCountBits::encode(ANY); | 4810   minor_key_ = ArgumentCountBits::encode(ANY); | 
| 4833 } | 4811 } | 
| 4834 | 4812 | 
| 4835 | 4813 | 
| 4836 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate, | 4814 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate, | 
| 4837                                            int argument_count) | 4815                                            int argument_count) | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 4862   if (type->Is(Type::UntaggedPointer())) { | 4840   if (type->Is(Type::UntaggedPointer())) { | 
| 4863     return Representation::External(); | 4841     return Representation::External(); | 
| 4864   } | 4842   } | 
| 4865 | 4843 | 
| 4866   DCHECK(!type->Is(Type::Untagged())); | 4844   DCHECK(!type->Is(Type::Untagged())); | 
| 4867   return Representation::Tagged(); | 4845   return Representation::Tagged(); | 
| 4868 } | 4846 } | 
| 4869 | 4847 | 
| 4870 }  // namespace internal | 4848 }  // namespace internal | 
| 4871 }  // namespace v8 | 4849 }  // namespace v8 | 
| OLD | NEW | 
|---|