25void Builtins::Generate_CallFunction_ReceiverIsNullOrUndefined(
26 MacroAssembler* masm) {
30void Builtins::Generate_CallFunction_ReceiverIsNotNullOrUndefined(
31 MacroAssembler* masm) {
35void Builtins::Generate_CallFunction_ReceiverIsAny(MacroAssembler* masm) {
39void Builtins::Generate_CallBoundFunction(MacroAssembler* masm) {
43void Builtins::Generate_Call_ReceiverIsNullOrUndefined(MacroAssembler* masm) {
47void Builtins::Generate_Call_ReceiverIsNotNullOrUndefined(
48 MacroAssembler* masm) {
52void Builtins::Generate_Call_ReceiverIsAny(MacroAssembler* masm) {
56void Builtins::Generate_CallVarargs(MacroAssembler* masm) {
60void Builtins::Generate_CallForwardVarargs(MacroAssembler* masm) {
65void Builtins::Generate_CallFunctionForwardVarargs(MacroAssembler* masm) {
70void Builtins::Generate_CallApiCallbackGeneric(MacroAssembler* masm) {
74void Builtins::Generate_CallApiCallbackOptimizedNoProfiling(
75 MacroAssembler* masm) {
80void Builtins::Generate_CallApiCallbackOptimized(MacroAssembler* masm) {
86TF_BUILTIN(Call_ReceiverIsNullOrUndefined_Baseline_Compact,
89 CallReceiver<Descriptor>(Builtin::kCall_ReceiverIsNullOrUndefined,
receiver);
94 auto argc = UncheckedParameter<Int32T>(Descriptor::kActualArgumentsCount);
95 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
97 CallReceiver<Descriptor>(Builtin::kCall_ReceiverIsNullOrUndefined, argc, slot,
101TF_BUILTIN(Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,
103 CallReceiver<Descriptor>(Builtin::kCall_ReceiverIsNotNullOrUndefined);
108 auto argc = UncheckedParameter<Int32T>(Descriptor::kActualArgumentsCount);
109 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
110 CallReceiver<Descriptor>(Builtin::kCall_ReceiverIsNotNullOrUndefined, argc,
116 CallReceiver<Descriptor>(Builtin::kCall_ReceiverIsAny);
120 auto argc = UncheckedParameter<Int32T>(Descriptor::kActualArgumentsCount);
121 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
122 CallReceiver<Descriptor>(Builtin::kCall_ReceiverIsAny, argc, slot);
127 auto target = Parameter<JSAny>(Descriptor::kFunction);
128 auto argc = UncheckedParameter<Int32T>(Descriptor::kActualArgumentsCount);
129 auto context = Parameter<Context>(Descriptor::kContext);
130 auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
131 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
132 auto receiver = Parameter<JSAny>(Descriptor::kReceiver);
135 TailCallBuiltin(Builtin::kCall_ReceiverIsNullOrUndefined, context, target,
141 auto target = Parameter<JSAny>(Descriptor::kFunction);
142 auto argc = UncheckedParameter<Int32T>(Descriptor::kActualArgumentsCount);
143 auto context = Parameter<Context>(Descriptor::kContext);
144 auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
145 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
146 auto receiver = Parameter<JSAny>(Descriptor::kReceiver);
149 TailCallBuiltin(Builtin::kCall_ReceiverIsNotNullOrUndefined, context, target,
154 auto target = Parameter<JSAny>(Descriptor::kFunction);
155 auto argc = UncheckedParameter<Int32T>(Descriptor::kActualArgumentsCount);
156 auto context = Parameter<Context>(Descriptor::kContext);
157 auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
158 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
159 auto receiver = Parameter<JSAny>(Descriptor::kReceiver);
162 TailCallBuiltin(Builtin::kCall_ReceiverIsAny, context, target, argc);
168 Label if_done(
this), if_arguments(
this), if_array(
this),
175 Label if_target_callable(
this),
179 &if_target_not_callable);
180 BIND(&if_target_not_callable);
182 CallRuntime(Runtime::kThrowApplyNonFunction, context, target);
185 BIND(&if_target_callable);
188 Label if_target_constructor(
this),
192 &if_target_not_constructor);
193 BIND(&if_target_not_constructor);
195 CallRuntime(Runtime::kThrowNotConstructor, context, target);
198 BIND(&if_target_constructor);
201 Label if_new_target_constructor(
this),
205 &if_new_target_not_constructor);
206 BIND(&if_new_target_not_constructor);
211 BIND(&if_new_target_constructor);
221 LoadContextElement(
native_context, Context::SLOPPY_ARGUMENTS_MAP_INDEX));
224 LoadContextElement(
native_context, Context::STRICT_ARGUMENTS_MAP_INDEX));
257 BIND(&if_holey_array);
274 var_elements = elements;
282 var_elements =
CAST(
CallRuntime(Runtime::kCreateListFromArrayLike, context,
293 Label if_not_double(
this), if_double(
this);
299 Label normalize_done(
this);
306 var_elements = EmptyFixedArrayConstant();
307 Goto(&normalize_done);
309 BIND(&normalize_done);
313 Branch(IsFixedDoubleArray(elements), &if_double, &if_not_double);
315 BIND(&if_not_double);
357 new_elements, intptr_length, intptr_length,
360 TailCallBuiltin(Builtin::kCallVarargs, context, target, args_count, length,
364 args_count, length, new_elements);
371 Label if_smiorobject(
this), if_double(
this),
399 var_js_array = spread_array;
400 var_elements_kind = spread_kind;
410 &if_smiorobject, &if_generic);
423 GetProperty(context, spread, IteratorSymbolConstant());
427 spread, iterator_fn));
432 Branch(Int32LessThan(var_elements_kind.value(),
434 &if_smiorobject, &if_double);
436 BIND(&if_iterator_fn_not_callable);
438 static_cast<int>(MessageTemplate::kSpreadIteratorSymbolNonCallable)),
439 Goto(&throw_spread_error);
441 BIND(&if_iterator_is_null_or_undefined);
443 static_cast<int>(MessageTemplate::kNotIterableNoSymbolLoad));
444 Goto(&throw_spread_error);
446 BIND(&throw_spread_error);
447 CallRuntime(Runtime::kThrowSpreadArgError, context, message_id.value(),
452 BIND(&if_smiorobject);
455 var_js_array.value(), JSArray::kLengthOffset);
465 args_count, length, elements);
472 var_js_array.value(), JSArray::kLengthOffset);
475 length, args_count, context,
476 var_elements_kind.value());
480template <
class Descriptor>
484 std::is_same_v<Descriptor, CallTrampoline_Baseline_CompactDescriptor>,
485 "Incompatible Descriptor");
497template <
class Descriptor>
505 if (maybe_receiver) {
506 return *maybe_receiver;
509 return args.GetReceiver();
513 CollectCallFeedback(target,
receiver, context, feedback_vector, slot);
518 auto target = Parameter<JSAny>(Descriptor::kTarget);
519 std::optional<TNode<Object>>
new_target = std::nullopt;
520 auto arguments_list = Parameter<Object>(Descriptor::kArgumentsList);
521 auto context = Parameter<Context>(Descriptor::kContext);
522 CallOrConstructWithArrayLike(target,
new_target, arguments_list, context);
527 auto target = Parameter<JSAny>(Descriptor::kTarget);
528 std::optional<TNode<Object>>
new_target = std::nullopt;
529 auto arguments_list = Parameter<Object>(Descriptor::kArgumentsList);
530 auto context = Parameter<Context>(Descriptor::kContext);
531 auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
532 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
533 auto receiver = Parameter<JSAny>(Descriptor::kReceiver);
536 CallOrConstructWithArrayLike(target,
new_target, arguments_list, context);
540 auto target = Parameter<JSAny>(Descriptor::kTarget);
541 std::optional<TNode<Object>>
new_target = std::nullopt;
542 auto spread = Parameter<JSAny>(Descriptor::kSpread);
543 auto args_count = UncheckedParameter<Int32T>(Descriptor::kArgumentsCount);
544 auto context = Parameter<Context>(Descriptor::kContext);
545 CallOrConstructWithSpread(target,
new_target, spread, args_count, context);
549 auto target = Parameter<JSAny>(Descriptor::kTarget);
550 std::optional<TNode<Object>>
new_target = std::nullopt;
551 auto spread = Parameter<JSAny>(Descriptor::kSpread);
552 auto args_count = UncheckedParameter<Int32T>(Descriptor::kArgumentsCount);
553 auto context = LoadContextFromBaseline();
554 auto feedback_vector = LoadFeedbackVectorFromBaseline();
555 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
558 target, [=] {
return args.GetReceiver(); },
context, feedback_vector,
560 CallOrConstructWithSpread(target,
new_target, spread, args_count, context);
564 auto target = Parameter<JSAny>(Descriptor::kTarget);
565 std::optional<TNode<Object>>
new_target = std::nullopt;
566 auto spread = Parameter<JSAny>(Descriptor::kSpread);
567 auto args_count = UncheckedParameter<Int32T>(Descriptor::kArgumentsCount);
568 auto context = Parameter<Context>(Descriptor::kContext);
569 auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
570 auto slot = UncheckedParameter<UintPtrT>(Descriptor::kSlot);
571 auto receiver = Parameter<JSAny>(Descriptor::kReceiver);
574 CallOrConstructWithSpread(target,
new_target, spread, args_count, context);
588 Label holder_loop(
this, &var_holder), holder_found(
this, &var_holder),
599 Label template_map_loop(
this, &var_template),
600 template_loop(
this, &var_template),
601 template_from_closure(
this, &var_template);
602 Goto(&template_map_loop);
603 BIND(&template_map_loop);
611 Map::kConstructorOrBackPointerOrNativeContextOffset);
627 var_template =
CAST(constructor);
634 BIND(&template_from_closure);
643 var_template.value(), JSFunction::kSharedFunctionInfoOffset);
645 LoadSharedFunctionInfoUntrustedFunctionData(template_shared);
647 var_template =
CAST(template_data);
648 Goto(&template_loop);
651 BIND(&template_loop);
663 current, FunctionTemplateInfo::kRareDataOffset);
664 GotoIf(IsUndefined(current_rare), &holder_next);
666 current_rare, FunctionTemplateRareData::kParentTemplateOffset);
667 Goto(&template_loop);
684 return CAST(var_holder.value());
725 function_template_info, FunctionTemplateInfo::kFlagOffset);
727 function_template_info_flags),
728 &receiver_done, &receiver_needs_access_check);
730 BIND(&receiver_needs_access_check);
733 Goto(&receiver_done);
736 BIND(&receiver_done);
756 function_template_info, FunctionTemplateInfo::kSignatureOffset);
757 CSA_DCHECK(
this, Word32BinaryNot(IsUndefined(signature)));
769 function_template_info, FunctionTemplateInfo::kSignatureOffset);
771 IsUndefined(signature),
781 function_template_info, FunctionTemplateInfo::kCallbackDataOffset);
786 Label if_continue(
this);
787 GotoIfNot(IsTheHole(callback_data), &if_continue);
798 topmost_script_having_context, function_template_info);
809 function_template_info);
816 auto context = Parameter<Context>(Descriptor::kContext);
817 auto function_template_info = UncheckedParameter<FunctionTemplateInfo>(
818 Descriptor::kFunctionTemplateInfo);
819 auto argc = UncheckedParameter<Int32T>(Descriptor::kArgumentsCount);
823 auto topmost_script_having_context =
824 Parameter<Object>(Descriptor::kTopmostScriptHavingContext);
825 CallFunctionTemplate(CallFunctionTemplateMode::kGeneric,
826 function_template_info, argc, context,
827 topmost_script_having_context);
831 auto context = Parameter<Context>(Descriptor::kContext);
832 auto function_template_info = UncheckedParameter<FunctionTemplateInfo>(
833 Descriptor::kFunctionTemplateInfo);
834 auto argc = UncheckedParameter<Int32T>(Descriptor::kArgumentsCount);
838 auto topmost_script_having_context =
context;
839 CallFunctionTemplate(CallFunctionTemplateMode::kCheckAccess,
840 function_template_info, argc, context,
841 topmost_script_having_context);
846 auto context = Parameter<Context>(Descriptor::kContext);
847 auto function_template_info = UncheckedParameter<FunctionTemplateInfo>(
848 Descriptor::kFunctionTemplateInfo);
849 auto argc = UncheckedParameter<Int32T>(Descriptor::kArgumentsCount);
853 auto topmost_script_having_context =
context;
854 CallFunctionTemplate(CallFunctionTemplateMode::kCheckCompatibleReceiver,
855 function_template_info, argc, context,
856 topmost_script_having_context);
859TF_BUILTIN(CallFunctionTemplate_CheckAccessAndCompatibleReceiver,
861 auto context = Parameter<Context>(Descriptor::kContext);
862 auto function_template_info = UncheckedParameter<FunctionTemplateInfo>(
863 Descriptor::kFunctionTemplateInfo);
864 auto argc = UncheckedParameter<Int32T>(Descriptor::kArgumentsCount);
868 auto topmost_script_having_context =
context;
869 CallFunctionTemplate(
870 CallFunctionTemplateMode::kCheckAccessAndCompatibleReceiver,
871 function_template_info, argc, context, topmost_script_having_context);
875 auto target = Parameter<JSAny>(Descriptor::kTarget);
876 auto new_target = Parameter<Object>(Descriptor::kNewTarget);
877 auto context = Parameter<Context>(Descriptor::kContext);
878 auto argc = UncheckedParameter<Int32T>(Descriptor::kActualArgumentsCount);
879#ifdef V8_JS_LINKAGE_INCLUDES_DISPATCH_HANDLE
880 auto dispatch_handle =
881 UncheckedParameter<JSDispatchHandleT>(Descriptor::kDispatchHandle);
883 auto dispatch_handle = InvalidDispatchHandleConstant();
886 Label if_call(
this), if_construct(
this);
887 Branch(IsUndefined(
new_target), &if_call, &if_construct);
892 LoadJSFunctionSharedFunctionInfo(
CAST(target));
894 CAST(LoadSharedFunctionInfoUntrustedFunctionData(shared));
902 TNode<Object> topmost_script_having_context = NoContextConstant();
906 TailCallBuiltin(Builtin::kCallFunctionTemplate_Generic, context,
907 function_template_info, argc,
908 topmost_script_having_context);
914 TailCallJSBuiltin(Builtin::kHandleApiConstruct, context, target,
new_target,
915 argc, dispatch_handle);
#define CSA_DCHECK(csa,...)
#define TF_BUILTIN(Name, AssemblerBase)
static void Generate_CallOrConstructForwardVarargs(MacroAssembler *masm, CallOrConstructMode mode, Builtin target_builtin)
static constexpr Builtin CallFunction(ConvertReceiverMode=ConvertReceiverMode::kAny)
static void Generate_Call(MacroAssembler *masm, ConvertReceiverMode mode)
static void Generate_CallFunction(MacroAssembler *masm, ConvertReceiverMode mode)
static void Generate_CallOrConstructVarargs(MacroAssembler *masm, Builtin target_builtin)
static void Generate_CallApiCallbackImpl(MacroAssembler *masm, CallApiCallbackMode mode)
static constexpr Builtin Call(ConvertReceiverMode=ConvertReceiverMode::kAny)
static void Generate_CallBoundFunctionImpl(MacroAssembler *masm)
void CallOrConstructDoubleVarargs(TNode< JSAny > target, std::optional< TNode< Object > > new_target, TNode< FixedDoubleArray > elements, TNode< Int32T > length, TNode< Int32T > args_count, TNode< Context > context, TNode< Int32T > kind)
void CallFunctionTemplate(CallFunctionTemplateMode mode, TNode< FunctionTemplateInfo > function_template_info, TNode< Int32T > argc, TNode< Context > context, TNode< Object > maybe_incumbent_context)
TNode< JSReceiver > GetCompatibleReceiver(TNode< JSReceiver > receiver, TNode< HeapObject > signature, TNode< Context > context)
static constexpr bool IsAccessCheckRequired(CallFunctionTemplateMode mode)
void CallReceiver(Builtin id, std::optional< TNode< JSAny > >=std::nullopt)
void CallOrConstructWithArrayLike(TNode< JSAny > target, std::optional< TNode< Object > > new_target, TNode< Object > arguments_list, TNode< Context > context)
void CallOrConstructWithSpread(TNode< JSAny > target, std::optional< TNode< Object > > new_target, TNode< JSAny > spread, TNode< Int32T > args_count, TNode< Context > context)
@ kCheckCompatibleReceiver
@ kCheckAccessAndCompatibleReceiver
TNode< Context > LoadContextFromBaseline()
TNode< BoolT > IsNullOrUndefined(TNode< Object > object)
TNode< FixedArrayBase > AllocateFixedArray(ElementsKind kind, TNode< TIndex > capacity, AllocationFlags flags=AllocationFlag::kNone, std::optional< TNode< Map > > fixed_array_map=std::nullopt)
TNode< BoolT > IsConstructor(TNode< HeapObject > object)
TNode< Int32T > TruncateIntPtrToInt32(TNode< IntPtrT > value)
TNode< Smi > LoadFixedArrayBaseLength(TNode< FixedArrayBase > array)
TNode< BoolT > IsPrototypeInitialArrayPrototype(TNode< Context > context, TNode< Map > map)
TNode< BoolT > InstanceTypeEqual(TNode< Int32T > instance_type, int type)
void ThrowTypeError(TNode< Context > context, MessageTemplate message, char const *arg0=nullptr, char const *arg1=nullptr)
TNode< JSAny > GetProperty(TNode< Context > context, TNode< JSAny > receiver, Handle< Name > name)
TNode< BoolT > TaggedEqual(TNode< AnyTaggedT > a, TNode< AnyTaggedT > b)
TNode< FixedArrayBase > LoadElements(TNode< JSObject > object)
TNode< T > LoadObjectField(TNode< HeapObject > object, int offset)
TNode< BoolT > TaggedIsCallable(TNode< Object > object)
TNode< JSPrototype > LoadMapPrototype(TNode< Map > map)
TNode< BoolT > IsSetWord32(TNode< Word32T > word32)
TNode< BoolT > IsNoElementsProtectorCellInvalid()
void CopyFixedArrayElements(ElementsKind kind, TNode< FixedArrayBase > from_array, TNode< FixedArrayBase > to_array, TNode< TIndex > length, WriteBarrierMode barrier_mode=UPDATE_WRITE_BARRIER)
TNode< BoolT > IsJSGlobalProxyMap(TNode< Map > map)
TNode< BoolT > IsElementsKindLessThanOrEqual(TNode< Int32T > target_kind, ElementsKind reference_kind)
TNode< Uint32T > DecodeWord32(TNode< Word32T > word32)
TNode< Int32T > LoadElementsKind(TNode< HeapObject > object)
TNode< Int32T > LoadAndUntagToWord32ObjectField(TNode< HeapObject > object, int offset)
std::function< TNode< T >()> LazyNode
TNode< BoolT > IsElementsKindGreaterThan(TNode< Int32T > target_kind, ElementsKind reference_kind)
TNode< RawPtrT > LoadFunctionTemplateInfoJsCallbackPtr(TNode< FunctionTemplateInfo > object)
TNode< BoolT > IsJSArrayMap(TNode< Map > map)
TNode< Uint16T > LoadInstanceType(TNode< HeapObject > object)
TNode< NativeContext > LoadNativeContext(TNode< Context > context)
TNode< T > Select(TNode< BoolT > condition, const NodeGenerator< T > &true_body, const NodeGenerator< T > &false_body, BranchHint branch_hint=BranchHint::kNone)
TNode< BoolT > TaggedIsSmi(TNode< MaybeObject > a)
TNode< Int32T > LoadMapBitField(TNode< Map > map)
TNode< Map > LoadMap(TNode< HeapObject > object)
TNode< Int32T > SmiToInt32(TNode< Smi > value)
TNode< Int32T > LoadMapElementsKind(TNode< Map > map)
TNode< Object > LoadJSArgumentsObjectLength(TNode< Context > context, TNode< JSArgumentsObject > array)
TNode< BoolT > IsCallable(TNode< HeapObject > object)
TNode< BoolT > IsJSFunctionInstanceType(TNode< Int32T > instance_type)
TNode< FeedbackVector > LoadFeedbackVectorFromBaseline()
static constexpr int kMaxLength
static const int kProtectorInvalid
TNode< Int32T > Signed(TNode< Word32T > x)
TNode< IntPtrT > IntPtrConstant(intptr_t value)
TNode< UintPtrT > ChangeUint32ToWord(TNode< Word32T > value)
void GotoIfNot(TNode< IntegralT > condition, Label *false_label, GotoHint goto_hint=GotoHint::kNone)
TNode< Int32T > Word32And(TNode< Int32T > left, TNode< Int32T > right)
TNode< Smi > SmiConstant(Tagged< Smi > value)
void GotoIf(TNode< IntegralT > condition, Label *true_label, GotoHint goto_hint=GotoHint::kNone)
TNode< T > UncheckedParameter(int value)
TNode< IntPtrT > ChangeInt32ToIntPtr(TNode< Word32T > value)
void TailCallBuiltin(Builtin id, TNode< Object > context, TArgs... args)
TNode< Int32T > Int32Constant(int32_t value)
TNode< BoolT > WordNotEqual(TNode< WordT > left, TNode< WordT > right)
TNode< BoolT > Word32Equal(TNode< Word32T > left, TNode< Word32T > right)
TNode< T > CallRuntime(Runtime::FunctionId function, TNode< Object > context, TArgs... args)
TNode< T > CallBuiltin(Builtin id, TNode< Object > context, TArgs... args)
void Branch(TNode< IntegralT > condition, Label *true_label, Label *false_label, BranchHint branch_hint=BranchHint::kNone)
TNode< T > Parameter(int value, const SourceLocation &loc=SourceLocation::Current())
base::Vector< const DirectHandle< Object > > args
DirectHandle< Object > new_target
@ LAST_FAST_ELEMENTS_KIND
@ LAST_ANY_NONEXTENSIBLE_ELEMENTS_KIND
DONT_OVERRIDE DISABLE_ALLOCATION_SITES HOLEY_ELEMENTS
DONT_OVERRIDE DISABLE_ALLOCATION_SITES DISABLE_ALLOCATION_SITES HOLEY_DOUBLE_ELEMENTS
constexpr int JSParameterCount(int param_count_without_receiver)
!IsContextMap !IsContextMap native_context