mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 13:48:44 +02:00

PR-URL: https://github.com/nodejs/node/pull/54536 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com> Reviewed-By: Richard Lau <rlau@redhat.com>
185 lines
7.3 KiB
C++
185 lines
7.3 KiB
C++
// Copyright 2017 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_ARRAY_GEN_H_
|
|
#define V8_BUILTINS_BUILTINS_ARRAY_GEN_H_
|
|
|
|
#include <optional>
|
|
|
|
#include "src/codegen/code-factory.h" // for enum AllocationSiteOverrideMode
|
|
#include "src/codegen/code-stub-assembler.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
|
|
class ArrayBuiltinsAssembler : public CodeStubAssembler {
|
|
public:
|
|
explicit ArrayBuiltinsAssembler(compiler::CodeAssemblerState* state);
|
|
|
|
using BuiltinResultGenerator =
|
|
std::function<void(ArrayBuiltinsAssembler* masm)>;
|
|
|
|
using CallResultProcessor = std::function<TNode<Object>(
|
|
ArrayBuiltinsAssembler* masm, TNode<Object> k_value, TNode<UintPtrT> k)>;
|
|
|
|
void TypedArrayMapResultGenerator();
|
|
|
|
// See tc39.github.io/ecma262/#sec-%typedarray%.prototype.map.
|
|
TNode<Object> TypedArrayMapProcessor(TNode<Object> k_value,
|
|
TNode<UintPtrT> k);
|
|
|
|
TNode<String> CallJSArrayArrayJoinConcatToSequentialString(
|
|
TNode<FixedArray> fixed_array, TNode<IntPtrT> length, TNode<String> sep,
|
|
TNode<String> dest) {
|
|
TNode<ExternalReference> func = ExternalConstant(
|
|
ExternalReference::jsarray_array_join_concat_to_sequential_string());
|
|
TNode<ExternalReference> isolate_ptr =
|
|
ExternalConstant(ExternalReference::isolate_address());
|
|
return UncheckedCast<String>(
|
|
CallCFunction(func,
|
|
MachineType::AnyTagged(), // <return> String
|
|
std::make_pair(MachineType::Pointer(), isolate_ptr),
|
|
std::make_pair(MachineType::AnyTagged(), fixed_array),
|
|
std::make_pair(MachineType::IntPtr(), length),
|
|
std::make_pair(MachineType::AnyTagged(), sep),
|
|
std::make_pair(MachineType::AnyTagged(), dest)));
|
|
}
|
|
|
|
protected:
|
|
TNode<Context> context() { return context_; }
|
|
TNode<Object> receiver() { return receiver_; }
|
|
TNode<IntPtrT> argc() { return argc_; }
|
|
TNode<JSReceiver> o() { return o_; }
|
|
TNode<UintPtrT> len() { return len_; }
|
|
TNode<Object> callbackfn() { return callbackfn_; }
|
|
TNode<Object> this_arg() { return this_arg_; }
|
|
TNode<UintPtrT> k() { return k_.value(); }
|
|
TNode<Object> a() { return a_.value(); }
|
|
|
|
void ReturnFromBuiltin(TNode<Object> value);
|
|
|
|
void InitIteratingArrayBuiltinBody(TNode<Context> context,
|
|
TNode<Object> receiver,
|
|
TNode<Object> callbackfn,
|
|
TNode<Object> this_arg,
|
|
TNode<IntPtrT> argc);
|
|
|
|
void GenerateIteratingTypedArrayBuiltinBody(
|
|
const char* name, const BuiltinResultGenerator& generator,
|
|
const CallResultProcessor& processor,
|
|
ForEachDirection direction = ForEachDirection::kForward);
|
|
|
|
void TailCallArrayConstructorStub(
|
|
const Callable& callable, TNode<Context> context,
|
|
TNode<JSFunction> target, TNode<HeapObject> allocation_site_or_undefined,
|
|
TNode<Int32T> argc);
|
|
|
|
void GenerateDispatchToArrayStub(
|
|
TNode<Context> context, TNode<JSFunction> target, TNode<Int32T> argc,
|
|
AllocationSiteOverrideMode mode,
|
|
std::optional<TNode<AllocationSite>> allocation_site = std::nullopt);
|
|
|
|
void CreateArrayDispatchNoArgument(
|
|
TNode<Context> context, TNode<JSFunction> target, TNode<Int32T> argc,
|
|
AllocationSiteOverrideMode mode,
|
|
std::optional<TNode<AllocationSite>> allocation_site);
|
|
|
|
void CreateArrayDispatchSingleArgument(
|
|
TNode<Context> context, TNode<JSFunction> target, TNode<Int32T> argc,
|
|
AllocationSiteOverrideMode mode,
|
|
std::optional<TNode<AllocationSite>> allocation_site);
|
|
|
|
void GenerateConstructor(TNode<Context> context,
|
|
TNode<HeapObject> array_function,
|
|
TNode<Map> array_map, TNode<Object> array_size,
|
|
TNode<HeapObject> allocation_site,
|
|
ElementsKind elements_kind, AllocationSiteMode mode);
|
|
void GenerateArrayNoArgumentConstructor(ElementsKind kind,
|
|
AllocationSiteOverrideMode mode);
|
|
void GenerateArraySingleArgumentConstructor(ElementsKind kind,
|
|
AllocationSiteOverrideMode mode);
|
|
void GenerateArrayNArgumentsConstructor(
|
|
TNode<Context> context, TNode<JSFunction> target,
|
|
TNode<Object> new_target, TNode<Int32T> argc,
|
|
TNode<HeapObject> maybe_allocation_site);
|
|
|
|
private:
|
|
void VisitAllTypedArrayElements(TNode<JSArrayBuffer> array_buffer,
|
|
const CallResultProcessor& processor,
|
|
ForEachDirection direction,
|
|
TNode<JSTypedArray> typed_array);
|
|
|
|
TNode<Object> callbackfn_;
|
|
TNode<JSReceiver> o_;
|
|
TNode<Object> this_arg_;
|
|
TNode<UintPtrT> len_;
|
|
TNode<Context> context_;
|
|
TNode<Object> receiver_;
|
|
TNode<IntPtrT> argc_;
|
|
TNode<BoolT> fast_typed_array_target_;
|
|
const char* name_ = nullptr;
|
|
TVariable<UintPtrT> k_;
|
|
TVariable<Object> a_;
|
|
Label fully_spec_compliant_;
|
|
ElementsKind source_elements_kind_ = ElementsKind::NO_ELEMENTS;
|
|
};
|
|
|
|
class ArrayBuiltins {
|
|
public:
|
|
enum ArrayFromAsyncIterableResolveContextSlots {
|
|
kArrayFromAsyncIterableResolveResumeStateStepSlot =
|
|
Context::MIN_CONTEXT_SLOTS,
|
|
kArrayFromAsyncIterableResolveResumeStateAwaitedValueSlot,
|
|
kArrayFromAsyncIterableResolveResumeStateIndexSlot,
|
|
kArrayFromAsyncIterableResolvePromiseSlot,
|
|
kArrayFromAsyncIterableResolvePromiseFunctionSlot,
|
|
kArrayFromAsyncIterableResolveOnFulfilledFunctionSlot,
|
|
kArrayFromAsyncIterableResolveOnRejectedFunctionSlot,
|
|
kArrayFromAsyncIterableResolveResultArraySlot,
|
|
kArrayFromAsyncIterableResolveIteratorSlot,
|
|
kArrayFromAsyncIterableResolveNextMethodSlot,
|
|
kArrayFromAsyncIterableResolveErrorSlot,
|
|
kArrayFromAsyncIterableResolveMapfnSlot,
|
|
kArrayFromAsyncIterableResolveThisArgSlot,
|
|
kArrayFromAsyncIterableResolveLength
|
|
};
|
|
|
|
enum ArrayFromAsyncArrayLikeResolveContextSlots {
|
|
kArrayFromAsyncArrayLikeResolveResumeStateStepSlot =
|
|
Context::MIN_CONTEXT_SLOTS,
|
|
kArrayFromAsyncArrayLikeResolveResumeStateAwaitedValueSlot,
|
|
kArrayFromAsyncArrayLikeResolveResumeStateLenSlot,
|
|
kArrayFromAsyncArrayLikeResolveResumeStateIndexSlot,
|
|
kArrayFromAsyncArrayLikeResolvePromiseSlot,
|
|
kArrayFromAsyncArrayLikeResolvePromiseFunctionSlot,
|
|
kArrayFromAsyncArrayLikeResolveOnFulfilledFunctionSlot,
|
|
kArrayFromAsyncArrayLikeResolveOnRejectedFunctionSlot,
|
|
kArrayFromAsyncArrayLikeResolveResultArraySlot,
|
|
kArrayFromAsyncArrayLikeResolveArrayLikeSlot,
|
|
kArrayFromAsyncArrayLikeResolveErrorSlot,
|
|
kArrayFromAsyncArrayLikeResolveMapfnSlot,
|
|
kArrayFromAsyncArrayLikeResolveThisArgSlot,
|
|
kArrayFromAsyncArrayLikeResolveLength
|
|
};
|
|
|
|
enum ArrayFromAsyncLabels {
|
|
kGetIteratorStep,
|
|
kCheckIteratorValueAndMapping,
|
|
kIteratorMapping,
|
|
kGetIteratorValueWithMapping,
|
|
kAddIteratorValueToTheArray,
|
|
kGetArrayLikeValue,
|
|
kCheckArrayLikeValueAndMapping,
|
|
kGetArrayLikeValueWithMapping,
|
|
kAddArrayLikeValueToTheArray,
|
|
kDoneAndResolvePromise,
|
|
kCloseAsyncIterator,
|
|
kRejectPromise
|
|
};
|
|
};
|
|
|
|
} // namespace internal
|
|
} // namespace v8
|
|
|
|
#endif // V8_BUILTINS_BUILTINS_ARRAY_GEN_H_
|