5#ifndef V8_BUILTINS_BUILTINS_UTILS_H_
6#define V8_BUILTINS_BUILTINS_UTILS_H_
36 template <
class S = Object>
109#define BUILTIN_RCS(name) \
110 V8_WARN_UNUSED_RESULT static Tagged<Object> Builtin_Impl_##name( \
111 BuiltinArguments args, Isolate* isolate); \
113 V8_NOINLINE static Address Builtin_Impl_Stats_##name( \
114 int args_length, Address* args_object, Isolate* isolate) { \
115 BuiltinArguments args(args_length, args_object); \
116 RCS_SCOPE(isolate, RuntimeCallCounterId::kBuiltin_##name); \
117 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), \
118 "V8.Builtin_" #name); \
119 return BUILTIN_CONVERT_RESULT(Builtin_Impl_##name(args, isolate)); \
122 V8_WARN_UNUSED_RESULT Address Builtin_##name( \
123 int args_length, Address* args_object, Isolate* isolate) { \
124 DCHECK(isolate->context().is_null() || IsContext(isolate->context())); \
125 if (V8_UNLIKELY(TracingFlags::is_runtime_stats_enabled())) { \
126 return Builtin_Impl_Stats_##name(args_length, args_object, isolate); \
128 BuiltinArguments args(args_length, args_object); \
129 return BUILTIN_CONVERT_RESULT(Builtin_Impl_##name(args, isolate)); \
132 V8_WARN_UNUSED_RESULT static Tagged<Object> Builtin_Impl_##name( \
133 BuiltinArguments args, Isolate* isolate)
135#define BUILTIN_NO_RCS(name) \
136 V8_WARN_UNUSED_RESULT static Tagged<Object> Builtin_Impl_##name( \
137 BuiltinArguments args, Isolate* isolate); \
139 V8_WARN_UNUSED_RESULT Address Builtin_##name( \
140 int args_length, Address* args_object, Isolate* isolate) { \
141 DCHECK(isolate->context().is_null() || IsContext(isolate->context())); \
142 BuiltinArguments args(args_length, args_object); \
143 return BUILTIN_CONVERT_RESULT(Builtin_Impl_##name(args, isolate)); \
146 V8_WARN_UNUSED_RESULT static Tagged<Object> Builtin_Impl_##name( \
147 BuiltinArguments args, Isolate* isolate)
149#ifdef V8_RUNTIME_CALL_STATS
150#define BUILTIN(name) BUILTIN_RCS(name)
152#define BUILTIN(name) BUILTIN_NO_RCS(name)
156#define CHECK_RECEIVER(Type, name, method) \
157 if (!Is##Type(*args.receiver())) { \
158 THROW_NEW_ERROR_RETURN_FAILURE( \
160 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, \
161 isolate->factory()->NewStringFromAsciiChecked(method), \
164 auto name = Cast<Type>(args.receiver())
169#define TO_THIS_STRING(name, method) \
170 if (IsNullOrUndefined(*args.receiver(), isolate)) { \
171 THROW_NEW_ERROR_RETURN_FAILURE( \
173 NewTypeError(MessageTemplate::kCalledOnNullOrUndefined, \
174 isolate->factory()->NewStringFromAsciiChecked(method))); \
176 DirectHandle<String> name; \
177 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( \
178 isolate, name, Object::ToString(isolate, args.receiver()))
V8_INLINE int length() const
V8_INLINE Address * address_of_arg_at(int index) const
static constexpr int kNumExtraArgsWithReceiver
static constexpr int kNewTargetIndex
Handle< JSFunction > target() const
Handle< S > at(int index) const
static constexpr int kPaddingIndex
static constexpr int kReceiverArgsIndex
Tagged< Object > operator[](int index) const
Handle< Object > atOrUndefined(Isolate *isolate, int index) const
static constexpr int kArgcIndex
Handle< JSAny > receiver() const
Handle< HeapObject > new_target() const
void set_at(int index, Tagged< Object > value)
static constexpr int kFirstArgsIndex
Address * address_of_first_argument() const
static constexpr int kNumExtraArgs
static constexpr int kTargetIndex
BuiltinArguments(int length, Address *arguments)
static constexpr int kReceiverIndex
static constexpr int kArgsIndex
static constexpr int kNewTargetIndex
static constexpr int kArgcIndex
static constexpr int kNumExtraArgs
static constexpr int kTargetIndex
static constexpr int kNumExtraArgsWithReceiver
static constexpr int kPaddingIndex
V8_INLINE constexpr bool IsObject(TaggedImpl< kRefType, StorageType > obj)
#define DCHECK_LE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)