28 RCS_SCOPE(isolate, RuntimeCallCounterId::kGetCompatibleReceiver);
31 if (!IsFunctionTemplateInfo(recv_type))
return true;
33 if (!IsJSObject(
receiver))
return false;
40 if (signature->IsTemplateFor(js_obj_receiver))
return true;
43 if (
V8_UNLIKELY(IsJSGlobalProxy(js_obj_receiver))) {
45 if (!
IsNull(prototype, isolate)) {
47 if (signature->IsTemplateFor(js_obj_prototype))
return true;
56template <
bool is_construct>
58 Isolate* isolate, DirectHandle<HeapObject>
new_target,
59 DirectHandle<FunctionTemplateInfo> fun_data, DirectHandle<Object>
receiver,
64 if (IsUndefined(fun_data->GetInstanceTemplate(), isolate)) {
68 FunctionTemplateInfo::SetInstanceTemplate(
71 DirectHandle<ObjectTemplateInfo> instance_template(
82 if (!fun_data->accept_any_receiver() && IsAccessCheckNeeded(*js_receiver)) {
84 DCHECK(IsJSObject(*js_receiver));
86 if (!isolate->MayAccess(isolate->native_context(), js_object)) {
88 isolate->ReportFailedAccessCheck(js_object));
93 if (!IsCompatibleReceiver(isolate, *fun_data, *js_receiver)) {
96 NewTypeError(MessageTemplate::kIllegalInvocation));
100 if (fun_data->has_callback(isolate)) {
101 FunctionCallbackArguments custom(isolate, *fun_data, *
new_target, argv,
103 DirectHandle<Object>
result =
109 return isolate->factory()->undefined_value();
117 return handle(raw_result, isolate);
132 args.target()->shared()->api_func_data(), isolate);
133 int argc =
args.length() - 1;
136 isolate, HandleApiCallHelper<true>(isolate,
new_target, fun_data,
142class RelocatableArguments :
public Relocatable {
144 RelocatableArguments(
Isolate* isolate,
size_t length,
Address* arguments)
149 RelocatableArguments(
const RelocatableArguments&) =
delete;
150 RelocatableArguments& operator=(
const RelocatableArguments&) =
delete;
152 inline void IterateInstance(RootVisitor* v)
override {
153 v->VisitRootPointers(Root::kRelocatable,
nullptr,
154 FullObjectSlot(&arguments_[0]),
155 FullObjectSlot(&arguments_[length_]));
170 RCS_SCOPE(isolate, RuntimeCallCounterId::kInvokeApiFunction);
182 int argc =
static_cast<int>(
args.size());
184 argv[0] = (*receiver).ptr();
185 for (
int i = 0;
i < argc; ++
i) {
186 argv[
i + 1] = (*
args[
i]).ptr();
189 RelocatableArguments arguments(isolate, argv.
size(), argv.
data());
192 argv.
data() + 1, argc);
195 argv.
data() + 1, argc);
203 bool is_construct_call,
212 if (is_construct_call) {
224 DCHECK(obj->map()->is_callable());
227 DCHECK(constructor->shared()->IsApiFunction());
229 constructor->shared()->api_func_data()->GetInstanceCallHandler();
230 DCHECK(!IsUndefined(handler, isolate));
232 DCHECK(templ->is_object_template_call_handler());
233 DCHECK(templ->has_callback(isolate));
240 args.address_of_first_argument(),
243 custom.CallOrConstruct(templ, is_construct_call);
@ kDocumentAllLegacyConstruct
static Local< ObjectTemplate > New(Isolate *isolate, Local< FunctionTemplate > constructor=Local< FunctionTemplate >())
static v8::internal::DirectHandle< To > OpenDirectHandle(v8::Local< From > handle)
static V8_WARN_UNUSED_RESULT MaybeHandle< JSObject > InstantiateObject(Isolate *isolate, DirectHandle< ObjectTemplateInfo > data, DirectHandle< JSReceiver > new_target={})
static constexpr int kReceiverArgsIndex
static V8_WARN_UNUSED_RESULT MaybeHandle< Object > InvokeApiFunction(Isolate *isolate, bool is_construct, DirectHandle< FunctionTemplateInfo > function, DirectHandle< Object > receiver, base::Vector< const DirectHandle< Object > > args, DirectHandle< HeapObject > new_target)
V8_INLINE bool is_null() const
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< JSReceiver > ConvertReceiver(Isolate *isolate, DirectHandle< Object > object)
#define RETURN_FAILURE_IF_EXCEPTION(isolate)
#define RETURN_ON_EXCEPTION(isolate, call)
#define ASSIGN_RETURN_ON_EXCEPTION(isolate, dst, call)
#define THROW_NEW_ERROR(isolate, call)
#define RETURN_EXCEPTION_IF_EXCEPTION(isolate)
#define RETURN_RESULT_OR_FAILURE(isolate, call)
base::Vector< const DirectHandle< Object > > args
DirectHandle< Object > new_target
ZoneVector< RpoNumber > & result
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
PerThreadAssertScopeDebugOnly< false, SAFEPOINTS_ASSERT, HEAP_ALLOCATION_ASSERT > DisallowGarbageCollection
bool Is(IndirectHandle< U > value)
Tagged(T object) -> Tagged< T >
V8_INLINE IndirectHandle< T > indirect_handle(DirectHandle< T > handle)
kInterpreterTrampolineOffset Tagged< HeapObject >
static V8_WARN_UNUSED_RESULT Tagged< Object > HandleApiCallAsFunctionOrConstructorDelegate(Isolate *isolate, bool is_construct_call, BuiltinArguments args)
kInstanceDescriptorsOffset kTransitionsOrPrototypeInfoOffset IsNull(value)||IsJSProxy(value)||IsWasmObject(value)||(IsJSObject(value) &&(HeapLayout
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
v8::Local< T > ToApiHandle(v8::internal::DirectHandle< v8::internal::Object > obj)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define V8_WARN_UNUSED_RESULT
#define V8_UNLIKELY(condition)