162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// found in the LICENSE file. 462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/code-stub-assembler.h" 662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace v8 { 862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace internal { 962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef compiler::Node Node; 1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef compiler::CodeAssemblerState CodeAssemblerState; 1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef compiler::CodeAssemblerLabel CodeAssemblerLabel; 1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass ConstructorBuiltinsAssembler : public CodeStubAssembler { 1562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch explicit ConstructorBuiltinsAssembler(CodeAssemblerState* state) 1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch : CodeStubAssembler(state) {} 1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* EmitFastNewClosure(Node* shared_info, Node* feedback_vector, Node* slot, 2062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* context); 2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* EmitFastNewFunctionContext(Node* closure, Node* slots, Node* context, 2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ScopeType scope_type); 2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static int MaximumFunctionContextSlots(); 2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* EmitFastCloneRegExp(Node* closure, Node* literal_index, Node* pattern, 2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* flags, Node* context); 2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* EmitFastCloneShallowArray(Node* closure, Node* literal_index, 2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* context, 2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CodeAssemblerLabel* call_runtime, 3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch AllocationSiteMode allocation_site_mode); 3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Maximum number of elements in copied array (chosen so that even an array 3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // backed by a double backing store will fit into new-space). 3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kMaximumClonedShallowArrayElements = 3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch JSArray::kInitialMaxFastElementArray * kPointerSize / kDoubleSize; 3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void CreateFastCloneShallowArrayBuiltin( 3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch AllocationSiteMode allocation_site_mode); 3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Maximum number of properties in copied objects. 4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kMaximumClonedShallowObjectProperties = 6; 4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static int FastCloneShallowObjectPropertiesCount(int literal_length); 4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* EmitFastCloneShallowObject(CodeAssemblerLabel* call_runtime, 4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* closure, Node* literals_index, 4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* properties_count); 4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void CreateFastCloneShallowObjectBuiltin(int properties_count); 4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* EmitFastNewObject(Node* context, Node* target, Node* new_target); 4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* EmitFastNewObject(Node* context, Node* target, Node* new_target, 5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CodeAssemblerLabel* call_runtime); 5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kMaximumSlots = 0x8000; 5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kSmallMaximumSlots = 10; 5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* NonEmptyShallowClone(Node* boilerplate, Node* boilerplate_map, 5862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* boilerplate_elements, Node* allocation_site, 5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Node* capacity, ElementsKind kind); 6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // FastNewFunctionContext can only allocate closures which fit in the 6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // new space. 6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch STATIC_ASSERT(((kMaximumSlots + Context::MIN_CONTEXT_SLOTS) * kPointerSize + 6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FixedArray::kHeaderSize) < kMaxRegularHeapObjectSize); 6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} // namespace internal 6862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} // namespace v8 69