| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/builtins/builtins.h" |
| #include "src/builtins/builtins-utils.h" |
| #include "src/interface-descriptors.h" |
| #include "src/macro-assembler.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| BUILTIN(Illegal) { |
| UNREACHABLE(); |
| return isolate->heap()->undefined_value(); // Make compiler happy. |
| } |
| |
| BUILTIN(EmptyFunction) { return isolate->heap()->undefined_value(); } |
| |
| BUILTIN(UnsupportedThrower) { |
| HandleScope scope(isolate); |
| THROW_NEW_ERROR_RETURN_FAILURE(isolate, |
| NewError(MessageTemplate::kUnsupported)); |
| } |
| |
| // ----------------------------------------------------------------------------- |
| // Throwers for restricted function properties and strict arguments object |
| // properties |
| |
| BUILTIN(RestrictedFunctionPropertiesThrower) { |
| HandleScope scope(isolate); |
| THROW_NEW_ERROR_RETURN_FAILURE( |
| isolate, NewTypeError(MessageTemplate::kRestrictedFunctionProperties)); |
| } |
| |
| BUILTIN(RestrictedStrictArgumentsPropertiesThrower) { |
| HandleScope scope(isolate); |
| THROW_NEW_ERROR_RETURN_FAILURE( |
| isolate, NewTypeError(MessageTemplate::kStrictPoisonPill)); |
| } |
| |
| // ----------------------------------------------------------------------------- |
| // Interrupt and stack checks. |
| |
| void Builtins::Generate_InterruptCheck(MacroAssembler* masm) { |
| masm->TailCallRuntime(Runtime::kInterrupt); |
| } |
| |
| void Builtins::Generate_StackCheck(MacroAssembler* masm) { |
| masm->TailCallRuntime(Runtime::kStackGuard); |
| } |
| |
| // ----------------------------------------------------------------------------- |
| // TurboFan support builtins. |
| |
| void Builtins::Generate_CopyFastSmiOrObjectElements( |
| CodeStubAssembler* assembler) { |
| typedef CodeStubAssembler::Label Label; |
| typedef compiler::Node Node; |
| typedef CopyFastSmiOrObjectElementsDescriptor Descriptor; |
| |
| Node* object = assembler->Parameter(Descriptor::kObject); |
| |
| // Load the {object}s elements. |
| Node* source = assembler->LoadObjectField(object, JSObject::kElementsOffset); |
| |
| CodeStubAssembler::ParameterMode mode = assembler->OptimalParameterMode(); |
| Node* length = assembler->UntagParameter( |
| assembler->LoadFixedArrayBaseLength(source), mode); |
| |
| // Check if we can allocate in new space. |
| ElementsKind kind = FAST_ELEMENTS; |
| int max_elements = FixedArrayBase::GetMaxLengthForNewSpaceAllocation(kind); |
| Label if_newspace(assembler), if_oldspace(assembler); |
| assembler->Branch( |
| assembler->UintPtrLessThan( |
| length, assembler->IntPtrOrSmiConstant(max_elements, mode)), |
| &if_newspace, &if_oldspace); |
| |
| assembler->Bind(&if_newspace); |
| { |
| Node* target = assembler->AllocateFixedArray(kind, length, mode); |
| assembler->CopyFixedArrayElements(kind, source, target, length, |
| SKIP_WRITE_BARRIER, mode); |
| assembler->StoreObjectField(object, JSObject::kElementsOffset, target); |
| assembler->Return(target); |
| } |
| |
| assembler->Bind(&if_oldspace); |
| { |
| Node* target = assembler->AllocateFixedArray( |
| kind, length, mode, CodeStubAssembler::kPretenured); |
| assembler->CopyFixedArrayElements(kind, source, target, length, |
| UPDATE_WRITE_BARRIER, mode); |
| assembler->StoreObjectField(object, JSObject::kElementsOffset, target); |
| assembler->Return(target); |
| } |
| } |
| |
| void Builtins::Generate_GrowFastDoubleElements(CodeStubAssembler* assembler) { |
| typedef CodeStubAssembler::Label Label; |
| typedef compiler::Node Node; |
| typedef GrowArrayElementsDescriptor Descriptor; |
| |
| Node* object = assembler->Parameter(Descriptor::kObject); |
| Node* key = assembler->Parameter(Descriptor::kKey); |
| Node* context = assembler->Parameter(Descriptor::kContext); |
| |
| Label runtime(assembler, CodeStubAssembler::Label::kDeferred); |
| Node* elements = assembler->LoadElements(object); |
| elements = assembler->TryGrowElementsCapacity( |
| object, elements, FAST_DOUBLE_ELEMENTS, key, &runtime); |
| assembler->Return(elements); |
| |
| assembler->Bind(&runtime); |
| assembler->TailCallRuntime(Runtime::kGrowArrayElements, context, object, key); |
| } |
| |
| void Builtins::Generate_GrowFastSmiOrObjectElements( |
| CodeStubAssembler* assembler) { |
| typedef CodeStubAssembler::Label Label; |
| typedef compiler::Node Node; |
| typedef GrowArrayElementsDescriptor Descriptor; |
| |
| Node* object = assembler->Parameter(Descriptor::kObject); |
| Node* key = assembler->Parameter(Descriptor::kKey); |
| Node* context = assembler->Parameter(Descriptor::kContext); |
| |
| Label runtime(assembler, CodeStubAssembler::Label::kDeferred); |
| Node* elements = assembler->LoadElements(object); |
| elements = assembler->TryGrowElementsCapacity(object, elements, FAST_ELEMENTS, |
| key, &runtime); |
| assembler->Return(elements); |
| |
| assembler->Bind(&runtime); |
| assembler->TailCallRuntime(Runtime::kGrowArrayElements, context, object, key); |
| } |
| |
| } // namespace internal |
| } // namespace v8 |