blob: 93e6e3d7f2e804f31886c2b00052363d8733447f [file] [log] [blame]
Ben Murdoch257744e2011-11-30 15:57:28 +00001// Copyright 2011 the V8 project authors. All rights reserved.
Ben Murdochb8a8cc12014-11-26 15:28:44 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Steve Blocka7e24c12009-10-30 11:49:00 +00004
5#ifndef V8_BUILTINS_H_
6#define V8_BUILTINS_H_
7
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00008#include "src/base/flags.h"
9#include "src/handles.h"
10
Steve Blocka7e24c12009-10-30 11:49:00 +000011namespace v8 {
12namespace internal {
13
Leon Clarkee46be812010-01-19 14:06:41 +000014// Specifies extra arguments required by a C++ builtin.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000015enum class BuiltinExtraArguments : uint8_t {
16 kNone = 0u,
17 kTarget = 1u << 0,
18 kNewTarget = 1u << 1,
19 kTargetAndNewTarget = kTarget | kNewTarget
Leon Clarkee46be812010-01-19 14:06:41 +000020};
21
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000022inline bool operator&(BuiltinExtraArguments lhs, BuiltinExtraArguments rhs) {
23 return static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs);
24}
25
Leon Clarkee46be812010-01-19 14:06:41 +000026
Ben Murdochb8a8cc12014-11-26 15:28:44 +000027#define CODE_AGE_LIST_WITH_ARG(V, A) \
28 V(Quadragenarian, A) \
29 V(Quinquagenarian, A) \
30 V(Sexagenarian, A) \
31 V(Septuagenarian, A) \
32 V(Octogenarian, A)
33
34#define CODE_AGE_LIST_IGNORE_ARG(X, V) V(X)
35
36#define CODE_AGE_LIST(V) \
37 CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V)
38
39#define CODE_AGE_LIST_COMPLETE(V) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000040 V(ToBeExecutedOnce) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000041 V(NotExecuted) \
42 V(ExecutedOnce) \
43 V(NoAge) \
44 CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V)
45
46#define DECLARE_CODE_AGE_BUILTIN(C, V) \
47 V(Make##C##CodeYoungAgainOddMarking, BUILTIN, \
48 UNINITIALIZED, kNoExtraICState) \
49 V(Make##C##CodeYoungAgainEvenMarking, BUILTIN, \
50 UNINITIALIZED, kNoExtraICState)
51
52
Leon Clarkee46be812010-01-19 14:06:41 +000053// Define list of builtins implemented in C++.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000054#define BUILTIN_LIST_C(V) \
55 V(Illegal, kNone) \
56 \
57 V(EmptyFunction, kNone) \
58 \
59 V(ArrayConcat, kNone) \
60 V(ArrayIsArray, kNone) \
61 V(ArrayPop, kNone) \
62 V(ArrayPush, kNone) \
63 V(ArrayShift, kNone) \
64 V(ArraySlice, kNone) \
65 V(ArraySplice, kNone) \
66 V(ArrayUnshift, kNone) \
67 \
68 V(ArrayBufferConstructor, kTarget) \
69 V(ArrayBufferConstructor_ConstructStub, kTargetAndNewTarget) \
70 V(ArrayBufferIsView, kNone) \
71 \
Ben Murdoch097c5b22016-05-18 11:27:45 +010072 V(BooleanConstructor, kNone) \
73 V(BooleanConstructor_ConstructStub, kTargetAndNewTarget) \
74 V(BooleanPrototypeToString, kNone) \
75 V(BooleanPrototypeValueOf, kNone) \
76 \
77 V(DataViewConstructor, kNone) \
78 V(DataViewConstructor_ConstructStub, kTargetAndNewTarget) \
79 \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000080 V(DateConstructor, kNone) \
81 V(DateConstructor_ConstructStub, kTargetAndNewTarget) \
82 V(DateNow, kNone) \
83 V(DateParse, kNone) \
84 V(DateUTC, kNone) \
85 V(DatePrototypeSetDate, kNone) \
86 V(DatePrototypeSetFullYear, kNone) \
87 V(DatePrototypeSetHours, kNone) \
88 V(DatePrototypeSetMilliseconds, kNone) \
89 V(DatePrototypeSetMinutes, kNone) \
90 V(DatePrototypeSetMonth, kNone) \
91 V(DatePrototypeSetSeconds, kNone) \
92 V(DatePrototypeSetTime, kNone) \
93 V(DatePrototypeSetUTCDate, kNone) \
94 V(DatePrototypeSetUTCFullYear, kNone) \
95 V(DatePrototypeSetUTCHours, kNone) \
96 V(DatePrototypeSetUTCMilliseconds, kNone) \
97 V(DatePrototypeSetUTCMinutes, kNone) \
98 V(DatePrototypeSetUTCMonth, kNone) \
99 V(DatePrototypeSetUTCSeconds, kNone) \
100 V(DatePrototypeToDateString, kNone) \
101 V(DatePrototypeToISOString, kNone) \
102 V(DatePrototypeToPrimitive, kNone) \
103 V(DatePrototypeToUTCString, kNone) \
104 V(DatePrototypeToString, kNone) \
105 V(DatePrototypeToTimeString, kNone) \
106 V(DatePrototypeValueOf, kNone) \
107 V(DatePrototypeGetYear, kNone) \
108 V(DatePrototypeSetYear, kNone) \
109 \
110 V(FunctionConstructor, kTargetAndNewTarget) \
111 V(FunctionPrototypeBind, kNone) \
112 V(FunctionPrototypeToString, kNone) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100113 V(FunctionHasInstance, kNone) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000114 \
115 V(GeneratorFunctionConstructor, kTargetAndNewTarget) \
116 \
117 V(GlobalEval, kTarget) \
118 \
119 V(ObjectAssign, kNone) \
120 V(ObjectCreate, kNone) \
121 V(ObjectFreeze, kNone) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100122 V(ObjectGetOwnPropertyDescriptor, kNone) \
123 V(ObjectGetOwnPropertyNames, kNone) \
124 V(ObjectGetOwnPropertySymbols, kNone) \
125 V(ObjectIs, kNone) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000126 V(ObjectIsExtensible, kNone) \
127 V(ObjectIsFrozen, kNone) \
128 V(ObjectIsSealed, kNone) \
129 V(ObjectKeys, kNone) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100130 V(ObjectValues, kNone) \
131 V(ObjectEntries, kNone) \
132 V(ObjectGetOwnPropertyDescriptors, kNone) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000133 V(ObjectPreventExtensions, kNone) \
134 V(ObjectSeal, kNone) \
135 V(ObjectProtoToString, kNone) \
136 \
137 V(ProxyConstructor, kNone) \
138 V(ProxyConstructor_ConstructStub, kTarget) \
139 \
140 V(ReflectDefineProperty, kNone) \
141 V(ReflectDeleteProperty, kNone) \
142 V(ReflectGet, kNone) \
143 V(ReflectGetOwnPropertyDescriptor, kNone) \
144 V(ReflectGetPrototypeOf, kNone) \
145 V(ReflectHas, kNone) \
146 V(ReflectIsExtensible, kNone) \
147 V(ReflectOwnKeys, kNone) \
148 V(ReflectPreventExtensions, kNone) \
149 V(ReflectSet, kNone) \
150 V(ReflectSetPrototypeOf, kNone) \
151 \
152 V(SymbolConstructor, kNone) \
153 V(SymbolConstructor_ConstructStub, kTarget) \
154 \
155 V(HandleApiCall, kTarget) \
156 V(HandleApiCallConstruct, kTarget) \
157 V(HandleApiCallAsFunction, kNone) \
158 V(HandleApiCallAsConstructor, kNone) \
159 \
160 V(RestrictedFunctionPropertiesThrower, kNone) \
161 V(RestrictedStrictArgumentsPropertiesThrower, kNone)
Steve Blocka7e24c12009-10-30 11:49:00 +0000162
163// Define list of builtins implemented in assembly.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000164#define BUILTIN_LIST_A(V) \
165 V(ArgumentsAdaptorTrampoline, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000166 \
167 V(ConstructedNonConstructable, BUILTIN, UNINITIALIZED, kNoExtraICState) \
168 \
169 V(CallFunction_ReceiverIsNullOrUndefined, BUILTIN, UNINITIALIZED, \
170 kNoExtraICState) \
171 V(CallFunction_ReceiverIsNotNullOrUndefined, BUILTIN, UNINITIALIZED, \
172 kNoExtraICState) \
173 V(CallFunction_ReceiverIsAny, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100174 V(TailCallFunction_ReceiverIsNullOrUndefined, BUILTIN, UNINITIALIZED, \
175 kNoExtraICState) \
176 V(TailCallFunction_ReceiverIsNotNullOrUndefined, BUILTIN, UNINITIALIZED, \
177 kNoExtraICState) \
178 V(TailCallFunction_ReceiverIsAny, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000179 V(CallBoundFunction, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100180 V(TailCallBoundFunction, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000181 V(Call_ReceiverIsNullOrUndefined, BUILTIN, UNINITIALIZED, kNoExtraICState) \
182 V(Call_ReceiverIsNotNullOrUndefined, BUILTIN, UNINITIALIZED, \
183 kNoExtraICState) \
184 V(Call_ReceiverIsAny, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100185 V(TailCall_ReceiverIsNullOrUndefined, BUILTIN, UNINITIALIZED, \
186 kNoExtraICState) \
187 V(TailCall_ReceiverIsNotNullOrUndefined, BUILTIN, UNINITIALIZED, \
188 kNoExtraICState) \
189 V(TailCall_ReceiverIsAny, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000190 \
191 V(ConstructFunction, BUILTIN, UNINITIALIZED, kNoExtraICState) \
192 V(ConstructBoundFunction, BUILTIN, UNINITIALIZED, kNoExtraICState) \
193 V(ConstructProxy, BUILTIN, UNINITIALIZED, kNoExtraICState) \
194 V(Construct, BUILTIN, UNINITIALIZED, kNoExtraICState) \
195 \
196 V(Apply, BUILTIN, UNINITIALIZED, kNoExtraICState) \
197 \
198 V(HandleFastApiCall, BUILTIN, UNINITIALIZED, kNoExtraICState) \
199 \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000200 V(InOptimizationQueue, BUILTIN, UNINITIALIZED, kNoExtraICState) \
201 V(JSConstructStubGeneric, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000202 V(JSBuiltinsConstructStub, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100203 V(JSBuiltinsConstructStubForDerived, BUILTIN, UNINITIALIZED, \
204 kNoExtraICState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000205 V(JSConstructStubApi, BUILTIN, UNINITIALIZED, kNoExtraICState) \
206 V(JSEntryTrampoline, BUILTIN, UNINITIALIZED, kNoExtraICState) \
207 V(JSConstructEntryTrampoline, BUILTIN, UNINITIALIZED, kNoExtraICState) \
208 V(CompileLazy, BUILTIN, UNINITIALIZED, kNoExtraICState) \
209 V(CompileOptimized, BUILTIN, UNINITIALIZED, kNoExtraICState) \
210 V(CompileOptimizedConcurrent, BUILTIN, UNINITIALIZED, kNoExtraICState) \
211 V(NotifyDeoptimized, BUILTIN, UNINITIALIZED, kNoExtraICState) \
212 V(NotifySoftDeoptimized, BUILTIN, UNINITIALIZED, kNoExtraICState) \
213 V(NotifyLazyDeoptimized, BUILTIN, UNINITIALIZED, kNoExtraICState) \
214 V(NotifyStubFailure, BUILTIN, UNINITIALIZED, kNoExtraICState) \
215 V(NotifyStubFailureSaveDoubles, BUILTIN, UNINITIALIZED, kNoExtraICState) \
216 \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000217 V(InterpreterEntryTrampoline, BUILTIN, UNINITIALIZED, kNoExtraICState) \
218 V(InterpreterExitTrampoline, BUILTIN, UNINITIALIZED, kNoExtraICState) \
219 V(InterpreterPushArgsAndCall, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100220 V(InterpreterPushArgsAndTailCall, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000221 V(InterpreterPushArgsAndConstruct, BUILTIN, UNINITIALIZED, kNoExtraICState) \
222 V(InterpreterNotifyDeoptimized, BUILTIN, UNINITIALIZED, kNoExtraICState) \
223 V(InterpreterNotifySoftDeoptimized, BUILTIN, UNINITIALIZED, kNoExtraICState) \
224 V(InterpreterNotifyLazyDeoptimized, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100225 V(InterpreterEnterBytecodeDispatch, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000226 \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000227 V(LoadIC_Miss, BUILTIN, UNINITIALIZED, kNoExtraICState) \
228 V(KeyedLoadIC_Miss, BUILTIN, UNINITIALIZED, kNoExtraICState) \
229 V(StoreIC_Miss, BUILTIN, UNINITIALIZED, kNoExtraICState) \
230 V(KeyedStoreIC_Miss, BUILTIN, UNINITIALIZED, kNoExtraICState) \
231 V(LoadIC_Getter_ForDeopt, LOAD_IC, MONOMORPHIC, kNoExtraICState) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000232 V(KeyedLoadIC_Megamorphic, KEYED_LOAD_IC, MEGAMORPHIC, kNoExtraICState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000233 \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000234 V(StoreIC_Setter_ForDeopt, STORE_IC, MONOMORPHIC, \
235 StoreICState::kStrictModeState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000236 \
237 V(KeyedStoreIC_Initialize, KEYED_STORE_IC, UNINITIALIZED, kNoExtraICState) \
238 V(KeyedStoreIC_PreMonomorphic, KEYED_STORE_IC, PREMONOMORPHIC, \
239 kNoExtraICState) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400240 V(KeyedStoreIC_Megamorphic, KEYED_STORE_IC, MEGAMORPHIC, kNoExtraICState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000241 \
242 V(KeyedStoreIC_Initialize_Strict, KEYED_STORE_IC, UNINITIALIZED, \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000243 StoreICState::kStrictModeState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000244 V(KeyedStoreIC_PreMonomorphic_Strict, KEYED_STORE_IC, PREMONOMORPHIC, \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000245 StoreICState::kStrictModeState) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400246 V(KeyedStoreIC_Megamorphic_Strict, KEYED_STORE_IC, MEGAMORPHIC, \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000247 StoreICState::kStrictModeState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000248 \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000249 V(DatePrototypeGetDate, BUILTIN, UNINITIALIZED, kNoExtraICState) \
250 V(DatePrototypeGetDay, BUILTIN, UNINITIALIZED, kNoExtraICState) \
251 V(DatePrototypeGetFullYear, BUILTIN, UNINITIALIZED, kNoExtraICState) \
252 V(DatePrototypeGetHours, BUILTIN, UNINITIALIZED, kNoExtraICState) \
253 V(DatePrototypeGetMilliseconds, BUILTIN, UNINITIALIZED, kNoExtraICState) \
254 V(DatePrototypeGetMinutes, BUILTIN, UNINITIALIZED, kNoExtraICState) \
255 V(DatePrototypeGetMonth, BUILTIN, UNINITIALIZED, kNoExtraICState) \
256 V(DatePrototypeGetSeconds, BUILTIN, UNINITIALIZED, kNoExtraICState) \
257 V(DatePrototypeGetTime, BUILTIN, UNINITIALIZED, kNoExtraICState) \
258 V(DatePrototypeGetTimezoneOffset, BUILTIN, UNINITIALIZED, kNoExtraICState) \
259 V(DatePrototypeGetUTCDate, BUILTIN, UNINITIALIZED, kNoExtraICState) \
260 V(DatePrototypeGetUTCDay, BUILTIN, UNINITIALIZED, kNoExtraICState) \
261 V(DatePrototypeGetUTCFullYear, BUILTIN, UNINITIALIZED, kNoExtraICState) \
262 V(DatePrototypeGetUTCHours, BUILTIN, UNINITIALIZED, kNoExtraICState) \
263 V(DatePrototypeGetUTCMilliseconds, BUILTIN, UNINITIALIZED, kNoExtraICState) \
264 V(DatePrototypeGetUTCMinutes, BUILTIN, UNINITIALIZED, kNoExtraICState) \
265 V(DatePrototypeGetUTCMonth, BUILTIN, UNINITIALIZED, kNoExtraICState) \
266 V(DatePrototypeGetUTCSeconds, BUILTIN, UNINITIALIZED, kNoExtraICState) \
267 \
268 V(FunctionPrototypeApply, BUILTIN, UNINITIALIZED, kNoExtraICState) \
269 V(FunctionPrototypeCall, BUILTIN, UNINITIALIZED, kNoExtraICState) \
270 \
271 V(ReflectApply, BUILTIN, UNINITIALIZED, kNoExtraICState) \
272 V(ReflectConstruct, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000273 \
274 V(InternalArrayCode, BUILTIN, UNINITIALIZED, kNoExtraICState) \
275 V(ArrayCode, BUILTIN, UNINITIALIZED, kNoExtraICState) \
276 \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100277 V(MathMax, BUILTIN, UNINITIALIZED, kNoExtraICState) \
278 V(MathMin, BUILTIN, UNINITIALIZED, kNoExtraICState) \
279 \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000280 V(NumberConstructor, BUILTIN, UNINITIALIZED, kNoExtraICState) \
281 V(NumberConstructor_ConstructStub, BUILTIN, UNINITIALIZED, kNoExtraICState) \
282 \
283 V(StringConstructor, BUILTIN, UNINITIALIZED, kNoExtraICState) \
284 V(StringConstructor_ConstructStub, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000285 \
286 V(OnStackReplacement, BUILTIN, UNINITIALIZED, kNoExtraICState) \
287 V(InterruptCheck, BUILTIN, UNINITIALIZED, kNoExtraICState) \
288 V(OsrAfterStackCheck, BUILTIN, UNINITIALIZED, kNoExtraICState) \
289 V(StackCheck, BUILTIN, UNINITIALIZED, kNoExtraICState) \
290 \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000291 V(MarkCodeAsToBeExecutedOnce, BUILTIN, UNINITIALIZED, kNoExtraICState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000292 V(MarkCodeAsExecutedOnce, BUILTIN, UNINITIALIZED, kNoExtraICState) \
293 V(MarkCodeAsExecutedTwice, BUILTIN, UNINITIALIZED, kNoExtraICState) \
294 CODE_AGE_LIST_WITH_ARG(DECLARE_CODE_AGE_BUILTIN, V)
Kristian Monsen80d68ea2010-09-08 11:05:35 +0100295
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000296// Define list of builtin handlers implemented in assembly.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000297#define BUILTIN_LIST_H(V) \
298 V(LoadIC_Slow, LOAD_IC) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000299 V(KeyedLoadIC_Slow, KEYED_LOAD_IC) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000300 V(StoreIC_Slow, STORE_IC) \
301 V(KeyedStoreIC_Slow, KEYED_STORE_IC) \
302 V(LoadIC_Normal, LOAD_IC) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000303 V(StoreIC_Normal, STORE_IC)
Steve Blocka7e24c12009-10-30 11:49:00 +0000304
Steve Blocka7e24c12009-10-30 11:49:00 +0000305// Define list of builtins used by the debugger implemented in assembly.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000306#define BUILTIN_LIST_DEBUG_A(V) \
307 V(Return_DebugBreak, BUILTIN, DEBUG_STUB, kNoExtraICState) \
308 V(Slot_DebugBreak, BUILTIN, DEBUG_STUB, kNoExtraICState) \
309 V(FrameDropper_LiveEdit, BUILTIN, DEBUG_STUB, kNoExtraICState)
Steve Blocka7e24c12009-10-30 11:49:00 +0000310
Steve Blocka7e24c12009-10-30 11:49:00 +0000311
Steve Block44f0eee2011-05-26 01:26:41 +0100312class BuiltinFunctionTable;
Steve Blocka7e24c12009-10-30 11:49:00 +0000313class ObjectVisitor;
314
315
Steve Block44f0eee2011-05-26 01:26:41 +0100316class Builtins {
Steve Blocka7e24c12009-10-30 11:49:00 +0000317 public:
Steve Block44f0eee2011-05-26 01:26:41 +0100318 ~Builtins();
319
Steve Blocka7e24c12009-10-30 11:49:00 +0000320 // Generate all builtin code objects. Should be called once during
Steve Block44f0eee2011-05-26 01:26:41 +0100321 // isolate initialization.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000322 void SetUp(Isolate* isolate, bool create_heap_objects);
Steve Block44f0eee2011-05-26 01:26:41 +0100323 void TearDown();
Steve Blocka7e24c12009-10-30 11:49:00 +0000324
325 // Garbage collection support.
Steve Block44f0eee2011-05-26 01:26:41 +0100326 void IterateBuiltins(ObjectVisitor* v);
Steve Blocka7e24c12009-10-30 11:49:00 +0000327
328 // Disassembler support.
Steve Block44f0eee2011-05-26 01:26:41 +0100329 const char* Lookup(byte* pc);
Steve Blocka7e24c12009-10-30 11:49:00 +0000330
331 enum Name {
Steve Block44f0eee2011-05-26 01:26:41 +0100332#define DEF_ENUM_C(name, ignore) k##name,
333#define DEF_ENUM_A(name, kind, state, extra) k##name,
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000334#define DEF_ENUM_H(name, kind) k##name,
Steve Blocka7e24c12009-10-30 11:49:00 +0000335 BUILTIN_LIST_C(DEF_ENUM_C)
336 BUILTIN_LIST_A(DEF_ENUM_A)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000337 BUILTIN_LIST_H(DEF_ENUM_H)
Steve Blocka7e24c12009-10-30 11:49:00 +0000338 BUILTIN_LIST_DEBUG_A(DEF_ENUM_A)
339#undef DEF_ENUM_C
340#undef DEF_ENUM_A
341 builtin_count
342 };
343
344 enum CFunctionId {
Leon Clarkee46be812010-01-19 14:06:41 +0000345#define DEF_ENUM_C(name, ignore) c_##name,
Steve Blocka7e24c12009-10-30 11:49:00 +0000346 BUILTIN_LIST_C(DEF_ENUM_C)
347#undef DEF_ENUM_C
348 cfunction_count
349 };
350
Steve Block44f0eee2011-05-26 01:26:41 +0100351#define DECLARE_BUILTIN_ACCESSOR_C(name, ignore) Handle<Code> name();
352#define DECLARE_BUILTIN_ACCESSOR_A(name, kind, state, extra) \
353 Handle<Code> name();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000354#define DECLARE_BUILTIN_ACCESSOR_H(name, kind) Handle<Code> name();
Steve Block44f0eee2011-05-26 01:26:41 +0100355 BUILTIN_LIST_C(DECLARE_BUILTIN_ACCESSOR_C)
356 BUILTIN_LIST_A(DECLARE_BUILTIN_ACCESSOR_A)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000357 BUILTIN_LIST_H(DECLARE_BUILTIN_ACCESSOR_H)
Steve Block44f0eee2011-05-26 01:26:41 +0100358 BUILTIN_LIST_DEBUG_A(DECLARE_BUILTIN_ACCESSOR_A)
359#undef DECLARE_BUILTIN_ACCESSOR_C
360#undef DECLARE_BUILTIN_ACCESSOR_A
361
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000362 // Convenience wrappers.
Ben Murdoch097c5b22016-05-18 11:27:45 +0100363 Handle<Code> CallFunction(
364 ConvertReceiverMode = ConvertReceiverMode::kAny,
365 TailCallMode tail_call_mode = TailCallMode::kDisallow);
366 Handle<Code> Call(ConvertReceiverMode = ConvertReceiverMode::kAny,
367 TailCallMode tail_call_mode = TailCallMode::kDisallow);
368 Handle<Code> CallBoundFunction(TailCallMode tail_call_mode);
369 Handle<Code> InterpreterPushArgsAndCall(TailCallMode tail_call_mode);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000370
Steve Block44f0eee2011-05-26 01:26:41 +0100371 Code* builtin(Name name) {
Steve Blocka7e24c12009-10-30 11:49:00 +0000372 // Code::cast cannot be used here since we access builtins
373 // during the marking phase of mark sweep. See IC::Clear.
374 return reinterpret_cast<Code*>(builtins_[name]);
375 }
376
Steve Block44f0eee2011-05-26 01:26:41 +0100377 Address builtin_address(Name name) {
Steve Blocka7e24c12009-10-30 11:49:00 +0000378 return reinterpret_cast<Address>(&builtins_[name]);
379 }
380
381 static Address c_function_address(CFunctionId id) {
382 return c_functions_[id];
383 }
384
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000385 const char* name(int index) {
386 DCHECK(index >= 0);
387 DCHECK(index < builtin_count);
388 return names_[index];
389 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000390
Steve Block44f0eee2011-05-26 01:26:41 +0100391 bool is_initialized() const { return initialized_; }
392
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000393 MUST_USE_RESULT static MaybeHandle<Object> InvokeApiFunction(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100394 Handle<HeapObject> function, Handle<Object> receiver, int argc,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000395 Handle<Object> args[]);
396
Steve Blocka7e24c12009-10-30 11:49:00 +0000397 private:
Steve Block44f0eee2011-05-26 01:26:41 +0100398 Builtins();
399
Steve Blocka7e24c12009-10-30 11:49:00 +0000400 // The external C++ functions called from the code.
Steve Block44f0eee2011-05-26 01:26:41 +0100401 static Address const c_functions_[cfunction_count];
Steve Blocka7e24c12009-10-30 11:49:00 +0000402
403 // Note: These are always Code objects, but to conform with
404 // IterateBuiltins() above which assumes Object**'s for the callback
405 // function f, we use an Object* array here.
Steve Block44f0eee2011-05-26 01:26:41 +0100406 Object* builtins_[builtin_count];
407 const char* names_[builtin_count];
Steve Blocka7e24c12009-10-30 11:49:00 +0000408
Leon Clarkee46be812010-01-19 14:06:41 +0000409 static void Generate_Adaptor(MacroAssembler* masm,
410 CFunctionId id,
411 BuiltinExtraArguments extra_args);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000412 static void Generate_ConstructedNonConstructable(MacroAssembler* masm);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000413 static void Generate_CompileLazy(MacroAssembler* masm);
414 static void Generate_InOptimizationQueue(MacroAssembler* masm);
415 static void Generate_CompileOptimized(MacroAssembler* masm);
416 static void Generate_CompileOptimizedConcurrent(MacroAssembler* masm);
Steve Blocka7e24c12009-10-30 11:49:00 +0000417 static void Generate_JSConstructStubGeneric(MacroAssembler* masm);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000418 static void Generate_JSBuiltinsConstructStub(MacroAssembler* masm);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100419 static void Generate_JSBuiltinsConstructStubForDerived(MacroAssembler* masm);
Leon Clarkee46be812010-01-19 14:06:41 +0000420 static void Generate_JSConstructStubApi(MacroAssembler* masm);
Steve Blocka7e24c12009-10-30 11:49:00 +0000421 static void Generate_JSEntryTrampoline(MacroAssembler* masm);
422 static void Generate_JSConstructEntryTrampoline(MacroAssembler* masm);
Ben Murdochb0fe1622011-05-05 13:52:32 +0100423 static void Generate_NotifyDeoptimized(MacroAssembler* masm);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000424 static void Generate_NotifySoftDeoptimized(MacroAssembler* masm);
Ben Murdochb0fe1622011-05-05 13:52:32 +0100425 static void Generate_NotifyLazyDeoptimized(MacroAssembler* masm);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000426 static void Generate_NotifyStubFailure(MacroAssembler* masm);
427 static void Generate_NotifyStubFailureSaveDoubles(MacroAssembler* masm);
Steve Blocka7e24c12009-10-30 11:49:00 +0000428 static void Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm);
429
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000430 static void Generate_Apply(MacroAssembler* masm);
431
432 // ES6 section 9.2.1 [[Call]] ( thisArgument, argumentsList)
433 static void Generate_CallFunction(MacroAssembler* masm,
Ben Murdoch097c5b22016-05-18 11:27:45 +0100434 ConvertReceiverMode mode,
435 TailCallMode tail_call_mode);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000436 static void Generate_CallFunction_ReceiverIsNullOrUndefined(
437 MacroAssembler* masm) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100438 Generate_CallFunction(masm, ConvertReceiverMode::kNullOrUndefined,
439 TailCallMode::kDisallow);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000440 }
441 static void Generate_CallFunction_ReceiverIsNotNullOrUndefined(
442 MacroAssembler* masm) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100443 Generate_CallFunction(masm, ConvertReceiverMode::kNotNullOrUndefined,
444 TailCallMode::kDisallow);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000445 }
446 static void Generate_CallFunction_ReceiverIsAny(MacroAssembler* masm) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100447 Generate_CallFunction(masm, ConvertReceiverMode::kAny,
448 TailCallMode::kDisallow);
449 }
450 static void Generate_TailCallFunction_ReceiverIsNullOrUndefined(
451 MacroAssembler* masm) {
452 Generate_CallFunction(masm, ConvertReceiverMode::kNullOrUndefined,
453 TailCallMode::kAllow);
454 }
455 static void Generate_TailCallFunction_ReceiverIsNotNullOrUndefined(
456 MacroAssembler* masm) {
457 Generate_CallFunction(masm, ConvertReceiverMode::kNotNullOrUndefined,
458 TailCallMode::kAllow);
459 }
460 static void Generate_TailCallFunction_ReceiverIsAny(MacroAssembler* masm) {
461 Generate_CallFunction(masm, ConvertReceiverMode::kAny,
462 TailCallMode::kAllow);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000463 }
464 // ES6 section 9.4.1.1 [[Call]] ( thisArgument, argumentsList)
Ben Murdoch097c5b22016-05-18 11:27:45 +0100465 static void Generate_CallBoundFunctionImpl(MacroAssembler* masm,
466 TailCallMode tail_call_mode);
467 static void Generate_CallBoundFunction(MacroAssembler* masm) {
468 Generate_CallBoundFunctionImpl(masm, TailCallMode::kDisallow);
469 }
470 static void Generate_TailCallBoundFunction(MacroAssembler* masm) {
471 Generate_CallBoundFunctionImpl(masm, TailCallMode::kAllow);
472 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000473 // ES6 section 7.3.12 Call(F, V, [argumentsList])
Ben Murdoch097c5b22016-05-18 11:27:45 +0100474 static void Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode,
475 TailCallMode tail_call_mode);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000476 static void Generate_Call_ReceiverIsNullOrUndefined(MacroAssembler* masm) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100477 Generate_Call(masm, ConvertReceiverMode::kNullOrUndefined,
478 TailCallMode::kDisallow);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000479 }
480 static void Generate_Call_ReceiverIsNotNullOrUndefined(MacroAssembler* masm) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100481 Generate_Call(masm, ConvertReceiverMode::kNotNullOrUndefined,
482 TailCallMode::kDisallow);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000483 }
484 static void Generate_Call_ReceiverIsAny(MacroAssembler* masm) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100485 Generate_Call(masm, ConvertReceiverMode::kAny, TailCallMode::kDisallow);
486 }
487 static void Generate_TailCall_ReceiverIsNullOrUndefined(
488 MacroAssembler* masm) {
489 Generate_Call(masm, ConvertReceiverMode::kNullOrUndefined,
490 TailCallMode::kAllow);
491 }
492 static void Generate_TailCall_ReceiverIsNotNullOrUndefined(
493 MacroAssembler* masm) {
494 Generate_Call(masm, ConvertReceiverMode::kNotNullOrUndefined,
495 TailCallMode::kAllow);
496 }
497 static void Generate_TailCall_ReceiverIsAny(MacroAssembler* masm) {
498 Generate_Call(masm, ConvertReceiverMode::kAny, TailCallMode::kAllow);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000499 }
500
501 // ES6 section 9.2.2 [[Construct]] ( argumentsList, newTarget)
502 static void Generate_ConstructFunction(MacroAssembler* masm);
503 // ES6 section 9.4.1.2 [[Construct]] (argumentsList, newTarget)
504 static void Generate_ConstructBoundFunction(MacroAssembler* masm);
505 // ES6 section 9.5.14 [[Construct]] ( argumentsList, newTarget)
506 static void Generate_ConstructProxy(MacroAssembler* masm);
507 // ES6 section 7.3.13 Construct (F, [argumentsList], [newTarget])
508 static void Generate_Construct(MacroAssembler* masm);
509
510 static void Generate_HandleFastApiCall(MacroAssembler* masm);
511
512 static void Generate_DatePrototype_GetField(MacroAssembler* masm,
513 int field_index);
514 // ES6 section 20.3.4.2 Date.prototype.getDate ( )
515 static void Generate_DatePrototypeGetDate(MacroAssembler* masm);
516 // ES6 section 20.3.4.3 Date.prototype.getDay ( )
517 static void Generate_DatePrototypeGetDay(MacroAssembler* masm);
518 // ES6 section 20.3.4.4 Date.prototype.getFullYear ( )
519 static void Generate_DatePrototypeGetFullYear(MacroAssembler* masm);
520 // ES6 section 20.3.4.5 Date.prototype.getHours ( )
521 static void Generate_DatePrototypeGetHours(MacroAssembler* masm);
522 // ES6 section 20.3.4.6 Date.prototype.getMilliseconds ( )
523 static void Generate_DatePrototypeGetMilliseconds(MacroAssembler* masm);
524 // ES6 section 20.3.4.7 Date.prototype.getMinutes ( )
525 static void Generate_DatePrototypeGetMinutes(MacroAssembler* masm);
526 // ES6 section 20.3.4.8 Date.prototype.getMonth ( )
527 static void Generate_DatePrototypeGetMonth(MacroAssembler* masm);
528 // ES6 section 20.3.4.9 Date.prototype.getSeconds ( )
529 static void Generate_DatePrototypeGetSeconds(MacroAssembler* masm);
530 // ES6 section 20.3.4.10 Date.prototype.getTime ( )
531 static void Generate_DatePrototypeGetTime(MacroAssembler* masm);
532 // ES6 section 20.3.4.11 Date.prototype.getTimezoneOffset ( )
533 static void Generate_DatePrototypeGetTimezoneOffset(MacroAssembler* masm);
534 // ES6 section 20.3.4.12 Date.prototype.getUTCDate ( )
535 static void Generate_DatePrototypeGetUTCDate(MacroAssembler* masm);
536 // ES6 section 20.3.4.13 Date.prototype.getUTCDay ( )
537 static void Generate_DatePrototypeGetUTCDay(MacroAssembler* masm);
538 // ES6 section 20.3.4.14 Date.prototype.getUTCFullYear ( )
539 static void Generate_DatePrototypeGetUTCFullYear(MacroAssembler* masm);
540 // ES6 section 20.3.4.15 Date.prototype.getUTCHours ( )
541 static void Generate_DatePrototypeGetUTCHours(MacroAssembler* masm);
542 // ES6 section 20.3.4.16 Date.prototype.getUTCMilliseconds ( )
543 static void Generate_DatePrototypeGetUTCMilliseconds(MacroAssembler* masm);
544 // ES6 section 20.3.4.17 Date.prototype.getUTCMinutes ( )
545 static void Generate_DatePrototypeGetUTCMinutes(MacroAssembler* masm);
546 // ES6 section 20.3.4.18 Date.prototype.getUTCMonth ( )
547 static void Generate_DatePrototypeGetUTCMonth(MacroAssembler* masm);
548 // ES6 section 20.3.4.19 Date.prototype.getUTCSeconds ( )
549 static void Generate_DatePrototypeGetUTCSeconds(MacroAssembler* masm);
550
551 static void Generate_FunctionPrototypeApply(MacroAssembler* masm);
552 static void Generate_FunctionPrototypeCall(MacroAssembler* masm);
553
554 static void Generate_ReflectApply(MacroAssembler* masm);
555 static void Generate_ReflectConstruct(MacroAssembler* masm);
Steve Blocka7e24c12009-10-30 11:49:00 +0000556
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100557 static void Generate_InternalArrayCode(MacroAssembler* masm);
Steve Blocka7e24c12009-10-30 11:49:00 +0000558 static void Generate_ArrayCode(MacroAssembler* masm);
Kristian Monsen80d68ea2010-09-08 11:05:35 +0100559
Ben Murdoch097c5b22016-05-18 11:27:45 +0100560 enum class MathMaxMinKind { kMax, kMin };
561 static void Generate_MathMaxMin(MacroAssembler* masm, MathMaxMinKind kind);
562 // ES6 section 20.2.2.24 Math.max ( value1, value2 , ...values )
563 static void Generate_MathMax(MacroAssembler* masm) {
564 Generate_MathMaxMin(masm, MathMaxMinKind::kMax);
565 }
566 // ES6 section 20.2.2.25 Math.min ( value1, value2 , ...values )
567 static void Generate_MathMin(MacroAssembler* masm) {
568 Generate_MathMaxMin(masm, MathMaxMinKind::kMin);
569 }
570
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000571 // ES6 section 20.1.1.1 Number ( [ value ] ) for the [[Call]] case.
572 static void Generate_NumberConstructor(MacroAssembler* masm);
573 // ES6 section 20.1.1.1 Number ( [ value ] ) for the [[Construct]] case.
574 static void Generate_NumberConstructor_ConstructStub(MacroAssembler* masm);
575
576 static void Generate_StringConstructor(MacroAssembler* masm);
577 static void Generate_StringConstructor_ConstructStub(MacroAssembler* masm);
Ben Murdochb0fe1622011-05-05 13:52:32 +0100578 static void Generate_OnStackReplacement(MacroAssembler* masm);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000579 static void Generate_OsrAfterStackCheck(MacroAssembler* masm);
580 static void Generate_InterruptCheck(MacroAssembler* masm);
581 static void Generate_StackCheck(MacroAssembler* masm);
582
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000583 static void Generate_InterpreterEntryTrampoline(MacroAssembler* masm);
584 static void Generate_InterpreterExitTrampoline(MacroAssembler* masm);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100585 static void Generate_InterpreterPushArgsAndCall(MacroAssembler* masm) {
586 return Generate_InterpreterPushArgsAndCallImpl(masm,
587 TailCallMode::kDisallow);
588 }
589 static void Generate_InterpreterPushArgsAndTailCall(MacroAssembler* masm) {
590 return Generate_InterpreterPushArgsAndCallImpl(masm, TailCallMode::kAllow);
591 }
592 static void Generate_InterpreterPushArgsAndCallImpl(
593 MacroAssembler* masm, TailCallMode tail_call_mode);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000594 static void Generate_InterpreterPushArgsAndConstruct(MacroAssembler* masm);
595 static void Generate_InterpreterNotifyDeoptimized(MacroAssembler* masm);
596 static void Generate_InterpreterNotifySoftDeoptimized(MacroAssembler* masm);
597 static void Generate_InterpreterNotifyLazyDeoptimized(MacroAssembler* masm);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100598 static void Generate_InterpreterEnterBytecodeDispatch(MacroAssembler* masm);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000599
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000600#define DECLARE_CODE_AGE_BUILTIN_GENERATOR(C) \
601 static void Generate_Make##C##CodeYoungAgainEvenMarking( \
602 MacroAssembler* masm); \
603 static void Generate_Make##C##CodeYoungAgainOddMarking( \
604 MacroAssembler* masm);
605 CODE_AGE_LIST(DECLARE_CODE_AGE_BUILTIN_GENERATOR)
606#undef DECLARE_CODE_AGE_BUILTIN_GENERATOR
607
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000608 static void Generate_MarkCodeAsToBeExecutedOnce(MacroAssembler* masm);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000609 static void Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm);
610 static void Generate_MarkCodeAsExecutedTwice(MacroAssembler* masm);
Steve Block44f0eee2011-05-26 01:26:41 +0100611
612 static void InitBuiltinFunctionTable();
613
614 bool initialized_;
615
616 friend class BuiltinFunctionTable;
617 friend class Isolate;
618
619 DISALLOW_COPY_AND_ASSIGN(Builtins);
Steve Blocka7e24c12009-10-30 11:49:00 +0000620};
621
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000622} // namespace internal
623} // namespace v8
Steve Blocka7e24c12009-10-30 11:49:00 +0000624
625#endif // V8_BUILTINS_H_