// 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 "src/codegen/code-stub-assembler.h" namespace v8 { namespace internal { class TypedArrayBuiltinsAssembler : public CodeStubAssembler { public: using ElementsInfo = TorqueStructTypedArrayElementsInfo; explicit TypedArrayBuiltinsAssembler(compiler::CodeAssemblerState* state) : CodeStubAssembler(state) {} template TNode TypedArraySpeciesCreate(const char* method_name, TNode context, TNode exemplar, TArgs... args); void GenerateTypedArrayPrototypeIterationMethod(TNode context, TNode receiver, const char* method_name, IterationKind iteration_kind); void SetupTypedArrayEmbedderFields(TNode holder); void AttachBuffer(TNode holder, TNode buffer, TNode map, TNode length, TNode byte_offset); TNode AllocateEmptyOnHeapBuffer(TNode context, TNode byte_length); TNode LoadMapForType(TNode array); TNode IsMockArrayBufferAllocatorFlag(); TNode CalculateExternalPointer(TNode backing_store, TNode byte_offset); // 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); // Returns information (byte size and map) about a TypedArray's elements. ElementsInfo GetTypedArrayElementsInfo(TNode typed_array); ElementsInfo GetTypedArrayElementsInfo(TNode map); TNode GetDefaultConstructor(TNode context, TNode exemplar); TNode TypedArrayCreateByLength(TNode context, TNode constructor, TNode len, const char* method_name); void ThrowIfLengthLessThan(TNode context, TNode typed_array, TNode min_length); 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 CallCMemcpy(TNode dest_ptr, TNode src_ptr, TNode byte_length); void CallCMemset(TNode dest_ptr, TNode value, TNode 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); using TypedArraySwitchCase = std::function; void DispatchTypedArrayByElementsKind( TNode elements_kind, const TypedArraySwitchCase& case_function); TNode IsSharedArrayBuffer(TNode buffer); }; } // namespace internal } // namespace v8 #endif // V8_BUILTINS_BUILTINS_TYPED_ARRAY_GEN_H_