1 // Copyright 2017 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_BUILTINS_BUILTINS_ARRAY_GEN_H_ 6 #define V8_BUILTINS_BUILTINS_ARRAY_GEN_H_ 7 8 #include "torque-generated/builtins-base-from-dsl-gen.h" 9 10 namespace v8 { 11 namespace internal { 12 13 class ArrayBuiltinsAssembler : public BaseBuiltinsFromDSLAssembler { 14 public: 15 explicit ArrayBuiltinsAssembler(compiler::CodeAssemblerState* state); 16 17 typedef std::function<void(ArrayBuiltinsAssembler* masm)> 18 BuiltinResultGenerator; 19 20 typedef std::function<Node*(ArrayBuiltinsAssembler* masm, Node* k_value, 21 Node* k)> 22 CallResultProcessor; 23 24 typedef std::function<void(ArrayBuiltinsAssembler* masm)> PostLoopAction; 25 26 enum class MissingPropertyMode { kSkip, kUseUndefined }; 27 28 void FindResultGenerator(); 29 30 Node* FindProcessor(Node* k_value, Node* k); 31 32 void FindIndexResultGenerator(); 33 34 Node* FindIndexProcessor(Node* k_value, Node* k); 35 36 void ForEachResultGenerator(); 37 38 Node* ForEachProcessor(Node* k_value, Node* k); 39 40 void SomeResultGenerator(); 41 42 Node* SomeProcessor(Node* k_value, Node* k); 43 44 void EveryResultGenerator(); 45 46 Node* EveryProcessor(Node* k_value, Node* k); 47 48 void ReduceResultGenerator(); 49 50 Node* ReduceProcessor(Node* k_value, Node* k); 51 52 void ReducePostLoopAction(); 53 54 void FilterResultGenerator(); 55 56 Node* FilterProcessor(Node* k_value, Node* k); 57 58 void MapResultGenerator(); 59 60 void TypedArrayMapResultGenerator(); 61 62 Node* SpecCompliantMapProcessor(Node* k_value, Node* k); 63 64 Node* FastMapProcessor(Node* k_value, Node* k); 65 66 // See tc39.github.io/ecma262/#sec-%typedarray%.prototype.map. 67 Node* TypedArrayMapProcessor(Node* k_value, Node* k); 68 69 void NullPostLoopAction(); 70 71 // Uses memset to effectively initialize the given FixedArray with Smi zeroes. 72 void FillFixedArrayWithSmiZero(TNode<FixedArray> array, 73 TNode<Smi> smi_length); 74 75 protected: context()76 TNode<Context> context() { return context_; } receiver()77 TNode<Object> receiver() { return receiver_; } argc()78 TNode<IntPtrT> argc() { return argc_; } o()79 TNode<JSReceiver> o() { return o_; } len()80 TNode<Number> len() { return len_; } callbackfn()81 Node* callbackfn() { return callbackfn_; } this_arg()82 Node* this_arg() { return this_arg_; } k()83 TNode<Number> k() { return CAST(k_.value()); } a()84 Node* a() { return a_.value(); } 85 86 void ReturnFromBuiltin(Node* value); 87 88 void InitIteratingArrayBuiltinBody(TNode<Context> context, 89 TNode<Object> receiver, Node* callbackfn, 90 Node* this_arg, TNode<IntPtrT> argc); 91 92 void GenerateIteratingArrayBuiltinBody( 93 const char* name, const BuiltinResultGenerator& generator, 94 const CallResultProcessor& processor, const PostLoopAction& action, 95 const Callable& slow_case_continuation, 96 MissingPropertyMode missing_property_mode, 97 ForEachDirection direction = ForEachDirection::kForward); 98 void InitIteratingArrayBuiltinLoopContinuation( 99 TNode<Context> context, TNode<Object> receiver, Node* callbackfn, 100 Node* this_arg, Node* a, TNode<JSReceiver> o, Node* initial_k, 101 TNode<Number> len, Node* to); 102 103 void GenerateIteratingTypedArrayBuiltinBody( 104 const char* name, const BuiltinResultGenerator& generator, 105 const CallResultProcessor& processor, const PostLoopAction& action, 106 ForEachDirection direction = ForEachDirection::kForward); 107 108 void GenerateIteratingArrayBuiltinLoopContinuation( 109 const CallResultProcessor& processor, const PostLoopAction& action, 110 MissingPropertyMode missing_property_mode, 111 ForEachDirection direction = ForEachDirection::kForward); 112 113 void TailCallArrayConstructorStub( 114 const Callable& callable, TNode<Context> context, 115 TNode<JSFunction> target, TNode<HeapObject> allocation_site_or_undefined, 116 TNode<Int32T> argc); 117 118 void GenerateDispatchToArrayStub( 119 TNode<Context> context, TNode<JSFunction> target, TNode<Int32T> argc, 120 AllocationSiteOverrideMode mode, 121 TNode<AllocationSite> allocation_site = TNode<AllocationSite>()); 122 123 void CreateArrayDispatchNoArgument( 124 TNode<Context> context, TNode<JSFunction> target, TNode<Int32T> argc, 125 AllocationSiteOverrideMode mode, 126 TNode<AllocationSite> allocation_site = TNode<AllocationSite>()); 127 128 void CreateArrayDispatchSingleArgument( 129 TNode<Context> context, TNode<JSFunction> target, TNode<Int32T> argc, 130 AllocationSiteOverrideMode mode, 131 TNode<AllocationSite> allocation_site = TNode<AllocationSite>()); 132 133 void GenerateConstructor(Node* context, Node* array_function, Node* array_map, 134 Node* array_size, Node* allocation_site, 135 ElementsKind elements_kind, AllocationSiteMode mode); 136 void GenerateArrayNoArgumentConstructor(ElementsKind kind, 137 AllocationSiteOverrideMode mode); 138 void GenerateArraySingleArgumentConstructor(ElementsKind kind, 139 AllocationSiteOverrideMode mode); 140 void GenerateArrayNArgumentsConstructor( 141 TNode<Context> context, TNode<JSFunction> target, 142 TNode<Object> new_target, TNode<Int32T> argc, 143 TNode<HeapObject> maybe_allocation_site); 144 145 void GenerateInternalArrayNoArgumentConstructor(ElementsKind kind); 146 void GenerateInternalArraySingleArgumentConstructor(ElementsKind kind); 147 148 private: 149 static ElementsKind ElementsKindForInstanceType(InstanceType type); 150 151 void VisitAllTypedArrayElements(Node* array_buffer, 152 const CallResultProcessor& processor, 153 Label* detached, ForEachDirection direction, 154 TNode<JSTypedArray> typed_array); 155 156 void VisitAllFastElementsOneKind(ElementsKind kind, 157 const CallResultProcessor& processor, 158 Label* array_changed, ParameterMode mode, 159 ForEachDirection direction, 160 MissingPropertyMode missing_property_mode, 161 TNode<Smi> length); 162 163 void HandleFastElements(const CallResultProcessor& processor, 164 const PostLoopAction& action, Label* slow, 165 ForEachDirection direction, 166 MissingPropertyMode missing_property_mode); 167 168 // Perform ArraySpeciesCreate (ES6 #sec-arrayspeciescreate). 169 // This version is specialized to create a zero length array 170 // of the elements kind of the input array. 171 void GenerateArraySpeciesCreate(); 172 173 // Perform ArraySpeciesCreate (ES6 #sec-arrayspeciescreate). 174 void GenerateArraySpeciesCreate(TNode<Number> len); 175 176 Node* callbackfn_ = nullptr; 177 TNode<JSReceiver> o_; 178 Node* this_arg_ = nullptr; 179 TNode<Number> len_; 180 TNode<Context> context_; 181 TNode<Object> receiver_; 182 TNode<IntPtrT> argc_; 183 Node* fast_typed_array_target_ = nullptr; 184 const char* name_ = nullptr; 185 Variable k_; 186 Variable a_; 187 Variable to_; 188 Label fully_spec_compliant_; 189 ElementsKind source_elements_kind_ = ElementsKind::NO_ELEMENTS; 190 }; 191 192 } // namespace internal 193 } // namespace v8 194 195 #endif // V8_BUILTINS_BUILTINS_ARRAY_GEN_H_ 196