// Copyright 2018 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. #ifndef V8_BUILTINS_BUILTINS_TYPED_ARRAY_GEN_H_ #define V8_BUILTINS_BUILTINS_TYPED_ARRAY_GEN_H_ #include "torque-generated/builtins-base-from-dsl-gen.h" namespace v8 { namespace internal { class TypedArrayBuiltinsAssembler : public BaseBuiltinsFromDSLAssembler { public: explicit TypedArrayBuiltinsAssembler(compiler::CodeAssemblerState* state) : BaseBuiltinsFromDSLAssembler(state) {} TNode SpeciesCreateByLength(TNode context, TNode exemplar, TNode len, const char* method_name); protected: void GenerateTypedArrayPrototypeGetter(Node* context, Node* receiver, const char* method_name, int object_offset); void GenerateTypedArrayPrototypeIterationMethod(TNode context, TNode receiver, const char* method_name, IterationKind iteration_kind); void ConstructByLength(TNode context, TNode holder, TNode length, TNode element_size); void ConstructByArrayBuffer(TNode context, TNode holder, TNode buffer, TNode byte_offset, TNode length, TNode element_size); void ConstructByTypedArray(TNode context, TNode holder, TNode typed_array, TNode element_size); void ConstructByArrayLike(TNode context, TNode holder, TNode array_like, TNode initial_length, TNode element_size, TNode buffer_constructor); void ConstructByIterable(TNode context, TNode holder, TNode iterable, TNode iterator_fn, TNode element_size); void SetupTypedArray(TNode holder, TNode length, TNode byte_offset, TNode byte_length); void AttachBuffer(TNode holder, TNode buffer, TNode map, TNode length, TNode byte_offset); TNode LoadMapForType(TNode array); TNode CalculateExternalPointer(TNode backing_store, TNode byte_offset); Node* LoadDataPtr(Node* typed_array); TNode ByteLengthIsValid(TNode byte_length); // Returns true if kind is either UINT8_ELEMENTS or UINT8_CLAMPED_ELEMENTS. TNode IsUint8ElementsKind(TNode kind); // Returns true if kind is either BIGINT64_ELEMENTS or BIGUINT64_ELEMENTS. TNode IsBigInt64ElementsKind(TNode kind); // Returns the byte size of an element for a TypedArray elements kind. TNode GetTypedArrayElementSize(TNode elements_kind); TNode LoadTypedArrayBuffer(TNode typed_array) { return LoadObjectField(typed_array, JSTypedArray::kBufferOffset); } TNode GetDefaultConstructor(TNode context, TNode exemplar); TNode TypedArraySpeciesConstructor(TNode context, TNode exemplar); TNode SpeciesCreateByArrayBuffer(TNode context, TNode exemplar, TNode buffer, TNode byte_offset, TNode len, const char* method_name); TNode CreateByLength(TNode context, TNode constructor, TNode len, const char* method_name); TNode GetBuffer(TNode context, TNode array); TNode ValidateTypedArray(TNode context, TNode obj, const char* method_name); // Fast path for setting a TypedArray (source) onto another TypedArray // (target) at an element offset. void SetTypedArraySource(TNode context, TNode source, TNode target, TNode offset, Label* call_runtime, Label* if_source_too_large); void SetJSArraySource(TNode context, TNode source, TNode target, TNode offset, Label* call_runtime, Label* if_source_too_large); void CallCMemmove(TNode dest_ptr, TNode src_ptr, TNode byte_length); void CallCCopyFastNumberJSArrayElementsToTypedArray( TNode context, TNode source, TNode dest, TNode source_length, TNode offset); void CallCCopyTypedArrayElementsToTypedArray(TNode source, TNode dest, TNode source_length, TNode offset); void CallCCopyTypedArrayElementsSlice(TNode source, TNode dest, TNode start, TNode end); typedef std::function TypedArraySwitchCase; void DispatchTypedArrayByElementsKind( TNode elements_kind, const TypedArraySwitchCase& case_function); }; } // namespace internal } // namespace v8 #endif // V8_BUILTINS_BUILTINS_TYPED_ARRAY_GEN_H_