• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // Copyright 2012 the V8 project authors. All rights reserved.
2  // Use of this source code is governed by a BSD-style license that can be
3  // found in the LICENSE file.
4  
5  #ifndef V8_RUNTIME_H_
6  #define V8_RUNTIME_H_
7  
8  #include "src/allocation.h"
9  #include "src/zone.h"
10  
11  namespace v8 {
12  namespace internal {
13  
14  // The interface to C++ runtime functions.
15  
16  // ----------------------------------------------------------------------------
17  // RUNTIME_FUNCTION_LIST_ALWAYS defines runtime calls available in both
18  // release and debug mode.
19  // This macro should only be used by the macro RUNTIME_FUNCTION_LIST.
20  
21  // WARNING: RUNTIME_FUNCTION_LIST_ALWAYS_* is a very large macro that caused
22  // MSVC Intellisense to crash.  It was broken into two macros to work around
23  // this problem. Please avoid large recursive macros whenever possible.
24  #define RUNTIME_FUNCTION_LIST_ALWAYS_1(F)                  \
25    /* Property access */                                    \
26    F(GetProperty, 2, 1)                                     \
27    F(KeyedGetProperty, 2, 1)                                \
28    F(DeleteProperty, 3, 1)                                  \
29    F(HasOwnProperty, 2, 1)                                  \
30    F(HasProperty, 2, 1)                                     \
31    F(HasElement, 2, 1)                                      \
32    F(IsPropertyEnumerable, 2, 1)                            \
33    F(GetPropertyNames, 1, 1)                                \
34    F(GetPropertyNamesFast, 1, 1)                            \
35    F(GetOwnPropertyNames, 2, 1)                             \
36    F(GetOwnElementNames, 1, 1)                              \
37    F(GetInterceptorInfo, 1, 1)                              \
38    F(GetNamedInterceptorPropertyNames, 1, 1)                \
39    F(GetIndexedInterceptorElementNames, 1, 1)               \
40    F(GetArgumentsProperty, 1, 1)                            \
41    F(ToFastProperties, 1, 1)                                \
42    F(FinishArrayPrototypeSetup, 1, 1)                       \
43    F(SpecialArrayFunctions, 0, 1)                           \
44    F(IsSloppyModeFunction, 1, 1)                            \
45    F(GetDefaultReceiver, 1, 1)                              \
46                                                             \
47    F(GetPrototype, 1, 1)                                    \
48    F(SetPrototype, 2, 1)                                    \
49    F(InternalSetPrototype, 2, 1)                            \
50    F(IsInPrototypeChain, 2, 1)                              \
51                                                             \
52    F(GetOwnProperty, 2, 1)                                  \
53                                                             \
54    F(IsExtensible, 1, 1)                                    \
55    F(PreventExtensions, 1, 1)                               \
56                                                             \
57    /* Utilities */                                          \
58    F(CheckIsBootstrapping, 0, 1)                            \
59    F(GetRootNaN, 0, 1)                                      \
60    F(Call, -1 /* >= 2 */, 1)                                \
61    F(Apply, 5, 1)                                           \
62    F(GetFunctionDelegate, 1, 1)                             \
63    F(GetConstructorDelegate, 1, 1)                          \
64    F(DeoptimizeFunction, 1, 1)                              \
65    F(ClearFunctionTypeFeedback, 1, 1)                       \
66    F(RunningInSimulator, 0, 1)                              \
67    F(IsConcurrentRecompilationSupported, 0, 1)              \
68    F(OptimizeFunctionOnNextCall, -1, 1)                     \
69    F(NeverOptimizeFunction, 1, 1)                           \
70    F(GetOptimizationStatus, -1, 1)                          \
71    F(GetOptimizationCount, 1, 1)                            \
72    F(UnblockConcurrentRecompilation, 0, 1)                  \
73    F(CompileForOnStackReplacement, 1, 1)                    \
74    F(SetAllocationTimeout, -1 /* 2 || 3 */, 1)              \
75    F(SetNativeFlag, 1, 1)                                   \
76    F(SetInlineBuiltinFlag, 1, 1)                            \
77    F(StoreArrayLiteralElement, 5, 1)                        \
78    F(DebugPrepareStepInIfStepping, 1, 1)                    \
79    F(DebugPushPromise, 1, 1)                                \
80    F(DebugPopPromise, 0, 1)                                 \
81    F(DebugPromiseEvent, 1, 1)                               \
82    F(DebugPromiseRejectEvent, 2, 1)                         \
83    F(DebugAsyncTaskEvent, 1, 1)                             \
84    F(FlattenString, 1, 1)                                   \
85    F(LoadMutableDouble, 2, 1)                               \
86    F(TryMigrateInstance, 1, 1)                              \
87    F(NotifyContextDisposed, 0, 1)                           \
88                                                             \
89    /* Array join support */                                 \
90    F(PushIfAbsent, 2, 1)                                    \
91    F(ArrayConcat, 1, 1)                                     \
92                                                             \
93    /* Conversions */                                        \
94    F(ToBool, 1, 1)                                          \
95    F(Typeof, 1, 1)                                          \
96                                                             \
97    F(Booleanize, 2, 1) /* TODO(turbofan): Only temporary */ \
98                                                             \
99    F(StringToNumber, 1, 1)                                  \
100    F(StringParseInt, 2, 1)                                  \
101    F(StringParseFloat, 1, 1)                                \
102    F(StringToLowerCase, 1, 1)                               \
103    F(StringToUpperCase, 1, 1)                               \
104    F(StringSplit, 3, 1)                                     \
105    F(CharFromCode, 1, 1)                                    \
106    F(URIEscape, 1, 1)                                       \
107    F(URIUnescape, 1, 1)                                     \
108                                                             \
109    F(NumberToInteger, 1, 1)                                 \
110    F(NumberToIntegerMapMinusZero, 1, 1)                     \
111    F(NumberToJSUint32, 1, 1)                                \
112    F(NumberToJSInt32, 1, 1)                                 \
113                                                             \
114    /* Arithmetic operations */                              \
115    F(NumberAdd, 2, 1)                                       \
116    F(NumberSub, 2, 1)                                       \
117    F(NumberMul, 2, 1)                                       \
118    F(NumberDiv, 2, 1)                                       \
119    F(NumberMod, 2, 1)                                       \
120    F(NumberUnaryMinus, 1, 1)                                \
121    F(NumberImul, 2, 1)                                      \
122                                                             \
123    F(StringBuilderConcat, 3, 1)                             \
124    F(StringBuilderJoin, 3, 1)                               \
125    F(SparseJoinWithSeparator, 3, 1)                         \
126                                                             \
127    /* Bit operations */                                     \
128    F(NumberOr, 2, 1)                                        \
129    F(NumberAnd, 2, 1)                                       \
130    F(NumberXor, 2, 1)                                       \
131                                                             \
132    F(NumberShl, 2, 1)                                       \
133    F(NumberShr, 2, 1)                                       \
134    F(NumberSar, 2, 1)                                       \
135                                                             \
136    /* Comparisons */                                        \
137    F(NumberEquals, 2, 1)                                    \
138    F(StringEquals, 2, 1)                                    \
139                                                             \
140    F(NumberCompare, 3, 1)                                   \
141    F(SmiLexicographicCompare, 2, 1)                         \
142                                                             \
143    /* Math */                                               \
144    F(MathAcos, 1, 1)                                        \
145    F(MathAsin, 1, 1)                                        \
146    F(MathAtan, 1, 1)                                        \
147    F(MathFloorRT, 1, 1)                                     \
148    F(MathAtan2, 2, 1)                                       \
149    F(MathExpRT, 1, 1)                                       \
150    F(RoundNumber, 1, 1)                                     \
151    F(MathFround, 1, 1)                                      \
152    F(RemPiO2, 1, 1)                                         \
153                                                             \
154    /* Regular expressions */                                \
155    F(RegExpCompile, 3, 1)                                   \
156    F(RegExpExecMultiple, 4, 1)                              \
157    F(RegExpInitializeObject, 6, 1)                          \
158                                                             \
159    /* JSON */                                               \
160    F(ParseJson, 1, 1)                                       \
161    F(BasicJSONStringify, 1, 1)                              \
162    F(QuoteJSONString, 1, 1)                                 \
163                                                             \
164    /* Strings */                                            \
165    F(StringIndexOf, 3, 1)                                   \
166    F(StringLastIndexOf, 3, 1)                               \
167    F(StringLocaleCompare, 2, 1)                             \
168    F(StringReplaceGlobalRegExpWithString, 4, 1)             \
169    F(StringReplaceOneCharWithString, 3, 1)                  \
170    F(StringMatch, 3, 1)                                     \
171    F(StringTrim, 3, 1)                                      \
172    F(StringToArray, 2, 1)                                   \
173    F(NewStringWrapper, 1, 1)                                \
174    F(NewString, 2, 1)                                       \
175    F(TruncateString, 2, 1)                                  \
176                                                             \
177    /* Numbers */                                            \
178    F(NumberToRadixString, 2, 1)                             \
179    F(NumberToFixed, 2, 1)                                   \
180    F(NumberToExponential, 2, 1)                             \
181    F(NumberToPrecision, 2, 1)                               \
182    F(IsValidSmi, 1, 1)                                      \
183                                                             \
184    /* Classes support */                                    \
185    F(ToMethod, 2, 1)                                        \
186    F(HomeObjectSymbol, 0, 1)                                \
187    F(ThrowNonMethodError, 0, 1)                             \
188    F(ThrowUnsupportedSuperError, 0, 1)                      \
189    F(LoadFromSuper, 3, 1)
190  
191  
192  #define RUNTIME_FUNCTION_LIST_ALWAYS_2(F)                             \
193    /* Reflection */                                                    \
194    F(FunctionSetInstanceClassName, 2, 1)                               \
195    F(FunctionSetLength, 2, 1)                                          \
196    F(FunctionSetPrototype, 2, 1)                                       \
197    F(FunctionGetName, 1, 1)                                            \
198    F(FunctionSetName, 2, 1)                                            \
199    F(FunctionNameShouldPrintAsAnonymous, 1, 1)                         \
200    F(FunctionMarkNameShouldPrintAsAnonymous, 1, 1)                     \
201    F(FunctionIsGenerator, 1, 1)                                        \
202    F(FunctionIsArrow, 1, 1)                                            \
203    F(FunctionIsConciseMethod, 1, 1)                                    \
204    F(FunctionBindArguments, 4, 1)                                      \
205    F(BoundFunctionGetBindings, 1, 1)                                   \
206    F(FunctionRemovePrototype, 1, 1)                                    \
207    F(FunctionGetSourceCode, 1, 1)                                      \
208    F(FunctionGetScript, 1, 1)                                          \
209    F(FunctionGetScriptSourcePosition, 1, 1)                            \
210    F(FunctionGetPositionForOffset, 2, 1)                               \
211    F(FunctionIsAPIFunction, 1, 1)                                      \
212    F(FunctionIsBuiltin, 1, 1)                                          \
213    F(GetScript, 1, 1)                                                  \
214    F(CollectStackTrace, 2, 1)                                          \
215    F(GetV8Version, 0, 1)                                               \
216    F(GeneratorGetFunction, 1, 1)                                       \
217    F(GeneratorGetContext, 1, 1)                                        \
218    F(GeneratorGetReceiver, 1, 1)                                       \
219    F(GeneratorGetContinuation, 1, 1)                                   \
220    F(GeneratorGetSourcePosition, 1, 1)                                 \
221                                                                        \
222    F(SetCode, 2, 1)                                                    \
223                                                                        \
224    F(CreateApiFunction, 2, 1)                                          \
225    F(IsTemplate, 1, 1)                                                 \
226    F(GetTemplateField, 2, 1)                                           \
227    F(DisableAccessChecks, 1, 1)                                        \
228    F(EnableAccessChecks, 1, 1)                                         \
229                                                                        \
230    /* Dates */                                                         \
231    F(DateCurrentTime, 0, 1)                                            \
232    F(DateParseString, 2, 1)                                            \
233    F(DateLocalTimezone, 1, 1)                                          \
234    F(DateToUTC, 1, 1)                                                  \
235    F(DateMakeDay, 2, 1)                                                \
236    F(DateSetValue, 3, 1)                                               \
237    F(DateCacheVersion, 0, 1)                                           \
238                                                                        \
239    /* Globals */                                                       \
240    F(CompileString, 2, 1)                                              \
241                                                                        \
242    /* Eval */                                                          \
243    F(GlobalProxy, 1, 1)                                                \
244    F(IsAttachedGlobal, 1, 1)                                           \
245                                                                        \
246    F(AddNamedProperty, 4, 1)                                           \
247    F(AddPropertyForTemplate, 4, 1)                                     \
248    F(SetProperty, 4, 1)                                                \
249    F(AddElement, 4, 1)                                                 \
250    F(DefineApiAccessorProperty, 5, 1)                                  \
251    F(DefineDataPropertyUnchecked, 4, 1)                                \
252    F(DefineAccessorPropertyUnchecked, 5, 1)                            \
253    F(GetDataProperty, 2, 1)                                            \
254    F(SetHiddenProperty, 3, 1)                                          \
255                                                                        \
256    /* Arrays */                                                        \
257    F(RemoveArrayHoles, 2, 1)                                           \
258    F(GetArrayKeys, 2, 1)                                               \
259    F(MoveArrayContents, 2, 1)                                          \
260    F(EstimateNumberOfElements, 1, 1)                                   \
261    F(NormalizeElements, 1, 1)                                          \
262                                                                        \
263    /* Getters and Setters */                                           \
264    F(LookupAccessor, 3, 1)                                             \
265                                                                        \
266    /* ES5 */                                                           \
267    F(ObjectFreeze, 1, 1)                                               \
268                                                                        \
269    /* Harmony modules */                                               \
270    F(IsJSModule, 1, 1)                                                 \
271                                                                        \
272    /* Harmony symbols */                                               \
273    F(CreateSymbol, 1, 1)                                               \
274    F(CreatePrivateSymbol, 1, 1)                                        \
275    F(CreateGlobalPrivateOwnSymbol, 1, 1)                               \
276    F(CreatePrivateOwnSymbol, 1, 1)                                     \
277    F(NewSymbolWrapper, 1, 1)                                           \
278    F(SymbolDescription, 1, 1)                                          \
279    F(SymbolRegistry, 0, 1)                                             \
280    F(SymbolIsPrivate, 1, 1)                                            \
281                                                                        \
282    /* Harmony proxies */                                               \
283    F(CreateJSProxy, 2, 1)                                              \
284    F(CreateJSFunctionProxy, 4, 1)                                      \
285    F(IsJSProxy, 1, 1)                                                  \
286    F(IsJSFunctionProxy, 1, 1)                                          \
287    F(GetHandler, 1, 1)                                                 \
288    F(GetCallTrap, 1, 1)                                                \
289    F(GetConstructTrap, 1, 1)                                           \
290    F(Fix, 1, 1)                                                        \
291                                                                        \
292    /* Harmony sets */                                                  \
293    F(SetInitialize, 1, 1)                                              \
294    F(SetAdd, 2, 1)                                                     \
295    F(SetHas, 2, 1)                                                     \
296    F(SetDelete, 2, 1)                                                  \
297    F(SetClear, 1, 1)                                                   \
298    F(SetGetSize, 1, 1)                                                 \
299                                                                        \
300    F(SetIteratorInitialize, 3, 1)                                      \
301    F(SetIteratorNext, 2, 1)                                            \
302                                                                        \
303    /* Harmony maps */                                                  \
304    F(MapInitialize, 1, 1)                                              \
305    F(MapGet, 2, 1)                                                     \
306    F(MapHas, 2, 1)                                                     \
307    F(MapDelete, 2, 1)                                                  \
308    F(MapClear, 1, 1)                                                   \
309    F(MapSet, 3, 1)                                                     \
310    F(MapGetSize, 1, 1)                                                 \
311                                                                        \
312    F(MapIteratorInitialize, 3, 1)                                      \
313    F(MapIteratorNext, 2, 1)                                            \
314                                                                        \
315    /* Harmony weak maps and sets */                                    \
316    F(WeakCollectionInitialize, 1, 1)                                   \
317    F(WeakCollectionGet, 2, 1)                                          \
318    F(WeakCollectionHas, 2, 1)                                          \
319    F(WeakCollectionDelete, 2, 1)                                       \
320    F(WeakCollectionSet, 3, 1)                                          \
321                                                                        \
322    F(GetWeakMapEntries, 1, 1)                                          \
323    F(GetWeakSetValues, 1, 1)                                           \
324                                                                        \
325    /* Harmony events */                                                \
326    F(EnqueueMicrotask, 1, 1)                                           \
327    F(RunMicrotasks, 0, 1)                                              \
328                                                                        \
329    /* Harmony observe */                                               \
330    F(IsObserved, 1, 1)                                                 \
331    F(SetIsObserved, 1, 1)                                              \
332    F(GetObservationState, 0, 1)                                        \
333    F(ObservationWeakMapCreate, 0, 1)                                   \
334    F(ObserverObjectAndRecordHaveSameOrigin, 3, 1)                      \
335    F(ObjectWasCreatedInCurrentOrigin, 1, 1)                            \
336    F(GetObjectContextObjectObserve, 1, 1)                              \
337    F(GetObjectContextObjectGetNotifier, 1, 1)                          \
338    F(GetObjectContextNotifierPerformChange, 1, 1)                      \
339                                                                        \
340    /* Harmony typed arrays */                                          \
341    F(ArrayBufferInitialize, 2, 1)                                      \
342    F(ArrayBufferSliceImpl, 3, 1)                                       \
343    F(ArrayBufferIsView, 1, 1)                                          \
344    F(ArrayBufferNeuter, 1, 1)                                          \
345                                                                        \
346    F(TypedArrayInitializeFromArrayLike, 4, 1)                          \
347    F(TypedArrayGetBuffer, 1, 1)                                        \
348    F(TypedArraySetFastCases, 3, 1)                                     \
349                                                                        \
350    F(DataViewGetBuffer, 1, 1)                                          \
351    F(DataViewGetInt8, 3, 1)                                            \
352    F(DataViewGetUint8, 3, 1)                                           \
353    F(DataViewGetInt16, 3, 1)                                           \
354    F(DataViewGetUint16, 3, 1)                                          \
355    F(DataViewGetInt32, 3, 1)                                           \
356    F(DataViewGetUint32, 3, 1)                                          \
357    F(DataViewGetFloat32, 3, 1)                                         \
358    F(DataViewGetFloat64, 3, 1)                                         \
359                                                                        \
360    F(DataViewSetInt8, 4, 1)                                            \
361    F(DataViewSetUint8, 4, 1)                                           \
362    F(DataViewSetInt16, 4, 1)                                           \
363    F(DataViewSetUint16, 4, 1)                                          \
364    F(DataViewSetInt32, 4, 1)                                           \
365    F(DataViewSetUint32, 4, 1)                                          \
366    F(DataViewSetFloat32, 4, 1)                                         \
367    F(DataViewSetFloat64, 4, 1)                                         \
368                                                                        \
369    /* Statements */                                                    \
370    F(NewObjectFromBound, 1, 1)                                         \
371                                                                        \
372    /* Declarations and initialization */                               \
373    F(InitializeVarGlobal, 3, 1)                                        \
374    F(OptimizeObjectForAddingMultipleProperties, 2, 1)                  \
375                                                                        \
376    /* Debugging */                                                     \
377    F(DebugPrint, 1, 1)                                                 \
378    F(GlobalPrint, 1, 1)                                                \
379    F(DebugTrace, 0, 1)                                                 \
380    F(TraceEnter, 0, 1)                                                 \
381    F(TraceExit, 1, 1)                                                  \
382    F(Abort, 1, 1)                                                      \
383    F(AbortJS, 1, 1)                                                    \
384    /* ES5 */                                                           \
385    F(OwnKeys, 1, 1)                                                    \
386                                                                        \
387    /* Message objects */                                               \
388    F(MessageGetStartPosition, 1, 1)                                    \
389    F(MessageGetScript, 1, 1)                                           \
390                                                                        \
391    /* Pseudo functions - handled as macros by parser */                \
392    F(IS_VAR, 1, 1)                                                     \
393                                                                        \
394    /* expose boolean functions from objects-inl.h */                   \
395    F(HasFastSmiElements, 1, 1)                                         \
396    F(HasFastSmiOrObjectElements, 1, 1)                                 \
397    F(HasFastObjectElements, 1, 1)                                      \
398    F(HasFastDoubleElements, 1, 1)                                      \
399    F(HasFastHoleyElements, 1, 1)                                       \
400    F(HasDictionaryElements, 1, 1)                                      \
401    F(HasSloppyArgumentsElements, 1, 1)                                 \
402    F(HasExternalUint8ClampedElements, 1, 1)                            \
403    F(HasExternalArrayElements, 1, 1)                                   \
404    F(HasExternalInt8Elements, 1, 1)                                    \
405    F(HasExternalUint8Elements, 1, 1)                                   \
406    F(HasExternalInt16Elements, 1, 1)                                   \
407    F(HasExternalUint16Elements, 1, 1)                                  \
408    F(HasExternalInt32Elements, 1, 1)                                   \
409    F(HasExternalUint32Elements, 1, 1)                                  \
410    F(HasExternalFloat32Elements, 1, 1)                                 \
411    F(HasExternalFloat64Elements, 1, 1)                                 \
412    F(HasFixedUint8ClampedElements, 1, 1)                               \
413    F(HasFixedInt8Elements, 1, 1)                                       \
414    F(HasFixedUint8Elements, 1, 1)                                      \
415    F(HasFixedInt16Elements, 1, 1)                                      \
416    F(HasFixedUint16Elements, 1, 1)                                     \
417    F(HasFixedInt32Elements, 1, 1)                                      \
418    F(HasFixedUint32Elements, 1, 1)                                     \
419    F(HasFixedFloat32Elements, 1, 1)                                    \
420    F(HasFixedFloat64Elements, 1, 1)                                    \
421    F(HasFastProperties, 1, 1)                                          \
422    F(TransitionElementsKind, 2, 1)                                     \
423    F(HaveSameMap, 2, 1)                                                \
424    F(IsJSGlobalProxy, 1, 1)                                            \
425    F(ForInInit, 2, 2)             /* TODO(turbofan): Only temporary */ \
426    F(ForInNext, 4, 2)             /* TODO(turbofan): Only temporary */ \
427    F(ForInCacheArrayLength, 2, 1) /* TODO(turbofan): Only temporary */
428  
429  
430  #define RUNTIME_FUNCTION_LIST_ALWAYS_3(F)                    \
431    /* String and Regexp */                                    \
432    F(NumberToStringRT, 1, 1)                                  \
433    F(RegExpConstructResult, 3, 1)                             \
434    F(RegExpExecRT, 4, 1)                                      \
435    F(StringAdd, 2, 1)                                         \
436    F(SubString, 3, 1)                                         \
437    F(InternalizeString, 1, 1)                                 \
438    F(StringCompare, 2, 1)                                     \
439    F(StringCharCodeAtRT, 2, 1)                                \
440    F(GetFromCache, 2, 1)                                      \
441                                                               \
442    /* Compilation */                                          \
443    F(CompileLazy, 1, 1)                                       \
444    F(CompileOptimized, 2, 1)                                  \
445    F(TryInstallOptimizedCode, 1, 1)                           \
446    F(NotifyDeoptimized, 1, 1)                                 \
447    F(NotifyStubFailure, 0, 1)                                 \
448                                                               \
449    /* Utilities */                                            \
450    F(AllocateInNewSpace, 1, 1)                                \
451    F(AllocateInTargetSpace, 2, 1)                             \
452    F(AllocateHeapNumber, 0, 1)                                \
453    F(NumberToSmi, 1, 1)                                       \
454    F(NumberToStringSkipCache, 1, 1)                           \
455                                                               \
456    F(NewArguments, 1, 1) /* TODO(turbofan): Only temporary */ \
457    F(NewSloppyArguments, 3, 1)                                \
458    F(NewStrictArguments, 3, 1)                                \
459                                                               \
460    /* Harmony generators */                                   \
461    F(CreateJSGeneratorObject, 0, 1)                           \
462    F(SuspendJSGeneratorObject, 1, 1)                          \
463    F(ResumeJSGeneratorObject, 3, 1)                           \
464    F(ThrowGeneratorStateError, 1, 1)                          \
465                                                               \
466    /* Arrays */                                               \
467    F(ArrayConstructor, -1, 1)                                 \
468    F(InternalArrayConstructor, -1, 1)                         \
469                                                               \
470    /* Literals */                                             \
471    F(MaterializeRegExpLiteral, 4, 1)                          \
472    F(CreateObjectLiteral, 4, 1)                               \
473    F(CreateArrayLiteral, 4, 1)                                \
474    F(CreateArrayLiteralStubBailout, 3, 1)                     \
475                                                               \
476    /* Statements */                                           \
477    F(NewClosure, 3, 1)                                        \
478    F(NewClosureFromStubFailure, 1, 1)                         \
479    F(NewObject, 1, 1)                                         \
480    F(NewObjectWithAllocationSite, 2, 1)                       \
481    F(FinalizeInstanceSize, 1, 1)                              \
482    F(Throw, 1, 1)                                             \
483    F(ReThrow, 1, 1)                                           \
484    F(ThrowReferenceError, 1, 1)                               \
485    F(ThrowNotDateError, 0, 1)                                 \
486    F(StackGuard, 0, 1)                                        \
487    F(Interrupt, 0, 1)                                         \
488    F(PromoteScheduledException, 0, 1)                         \
489                                                               \
490    /* Contexts */                                             \
491    F(NewGlobalContext, 2, 1)                                  \
492    F(NewFunctionContext, 1, 1)                                \
493    F(PushWithContext, 2, 1)                                   \
494    F(PushCatchContext, 3, 1)                                  \
495    F(PushBlockContext, 2, 1)                                  \
496    F(PushModuleContext, 2, 1)                                 \
497    F(DeleteLookupSlot, 2, 1)                                  \
498    F(LoadLookupSlot, 2, 2)                                    \
499    F(LoadLookupSlotNoReferenceError, 2, 2)                    \
500    F(StoreLookupSlot, 4, 1)                                   \
501                                                               \
502    /* Declarations and initialization */                      \
503    F(DeclareGlobals, 3, 1)                                    \
504    F(DeclareModules, 1, 1)                                    \
505    F(DeclareLookupSlot, 4, 1)                                 \
506    F(InitializeConstGlobal, 2, 1)                             \
507    F(InitializeLegacyConstLookupSlot, 3, 1)                   \
508                                                               \
509    /* Eval */                                                 \
510    F(ResolvePossiblyDirectEval, 6, 2)                         \
511                                                               \
512    /* Maths */                                                \
513    F(MathPowSlow, 2, 1)                                       \
514    F(MathPowRT, 2, 1)
515  
516  
517  #define RUNTIME_FUNCTION_LIST_DEBUGGER(F) \
518    /* Debugger support*/ \
519    F(DebugBreak, 0, 1) \
520    F(SetDebugEventListener, 2, 1) \
521    F(Break, 0, 1) \
522    F(DebugGetPropertyDetails, 2, 1) \
523    F(DebugGetProperty, 2, 1) \
524    F(DebugPropertyTypeFromDetails, 1, 1) \
525    F(DebugPropertyAttributesFromDetails, 1, 1) \
526    F(DebugPropertyIndexFromDetails, 1, 1) \
527    F(DebugNamedInterceptorPropertyValue, 2, 1) \
528    F(DebugIndexedInterceptorElementValue, 2, 1) \
529    F(CheckExecutionState, 1, 1) \
530    F(GetFrameCount, 1, 1) \
531    F(GetFrameDetails, 2, 1) \
532    F(GetScopeCount, 2, 1) \
533    F(GetStepInPositions, 2, 1) \
534    F(GetScopeDetails, 4, 1) \
535    F(GetAllScopesDetails, 4, 1) \
536    F(GetFunctionScopeCount, 1, 1) \
537    F(GetFunctionScopeDetails, 2, 1) \
538    F(SetScopeVariableValue, 6, 1) \
539    F(DebugPrintScopes, 0, 1) \
540    F(GetThreadCount, 1, 1) \
541    F(GetThreadDetails, 2, 1) \
542    F(SetDisableBreak, 1, 1) \
543    F(GetBreakLocations, 2, 1) \
544    F(SetFunctionBreakPoint, 3, 1) \
545    F(SetScriptBreakPoint, 4, 1) \
546    F(ClearBreakPoint, 1, 1) \
547    F(ChangeBreakOnException, 2, 1) \
548    F(IsBreakOnException, 1, 1) \
549    F(PrepareStep, 4, 1) \
550    F(ClearStepping, 0, 1) \
551    F(DebugEvaluate, 6, 1) \
552    F(DebugEvaluateGlobal, 4, 1) \
553    F(DebugGetLoadedScripts, 0, 1) \
554    F(DebugReferencedBy, 3, 1) \
555    F(DebugConstructedBy, 2, 1) \
556    F(DebugGetPrototype, 1, 1) \
557    F(DebugSetScriptSource, 2, 1) \
558    F(DebugCallbackSupportsStepping, 1, 1) \
559    F(SystemBreak, 0, 1) \
560    F(DebugDisassembleFunction, 1, 1) \
561    F(DebugDisassembleConstructor, 1, 1) \
562    F(FunctionGetInferredName, 1, 1) \
563    F(LiveEditFindSharedFunctionInfosForScript, 1, 1) \
564    F(LiveEditGatherCompileInfo, 2, 1) \
565    F(LiveEditReplaceScript, 3, 1) \
566    F(LiveEditReplaceFunctionCode, 2, 1) \
567    F(LiveEditFunctionSourceUpdated, 1, 1) \
568    F(LiveEditFunctionSetScript, 2, 1) \
569    F(LiveEditReplaceRefToNestedFunction, 3, 1) \
570    F(LiveEditPatchFunctionPositions, 2, 1) \
571    F(LiveEditCheckAndDropActivations, 2, 1) \
572    F(LiveEditCompareStrings, 2, 1) \
573    F(LiveEditRestartFrame, 2, 1) \
574    F(GetFunctionCodePositionFromSource, 2, 1) \
575    F(ExecuteInDebugContext, 2, 1) \
576    \
577    F(SetFlags, 1, 1) \
578    F(CollectGarbage, 1, 1) \
579    F(GetHeapUsage, 0, 1) \
580  
581  
582  #ifdef V8_I18N_SUPPORT
583  #define RUNTIME_FUNCTION_LIST_I18N_SUPPORT(F) \
584    /* i18n support */ \
585    /* Standalone, helper methods. */ \
586    F(CanonicalizeLanguageTag, 1, 1) \
587    F(AvailableLocalesOf, 1, 1) \
588    F(GetDefaultICULocale, 0, 1) \
589    F(GetLanguageTagVariants, 1, 1) \
590    F(IsInitializedIntlObject, 1, 1) \
591    F(IsInitializedIntlObjectOfType, 2, 1) \
592    F(MarkAsInitializedIntlObjectOfType, 3, 1) \
593    F(GetImplFromInitializedIntlObject, 1, 1) \
594    \
595    /* Date format and parse. */ \
596    F(CreateDateTimeFormat, 3, 1) \
597    F(InternalDateFormat, 2, 1) \
598    F(InternalDateParse, 2, 1) \
599    \
600    /* Number format and parse. */ \
601    F(CreateNumberFormat, 3, 1) \
602    F(InternalNumberFormat, 2, 1) \
603    F(InternalNumberParse, 2, 1) \
604    \
605    /* Collator. */ \
606    F(CreateCollator, 3, 1) \
607    F(InternalCompare, 3, 1) \
608    \
609    /* String.prototype.normalize. */ \
610    F(StringNormalize, 2, 1) \
611    \
612    /* Break iterator. */ \
613    F(CreateBreakIterator, 3, 1) \
614    F(BreakIteratorAdoptText, 2, 1) \
615    F(BreakIteratorFirst, 1, 1) \
616    F(BreakIteratorNext, 1, 1) \
617    F(BreakIteratorCurrent, 1, 1) \
618    F(BreakIteratorBreakType, 1, 1) \
619  
620  #else
621  #define RUNTIME_FUNCTION_LIST_I18N_SUPPORT(F)
622  #endif
623  
624  
625  #ifdef DEBUG
626  #define RUNTIME_FUNCTION_LIST_DEBUG(F) \
627    /* Testing */ \
628    F(ListNatives, 0, 1)
629  #else
630  #define RUNTIME_FUNCTION_LIST_DEBUG(F)
631  #endif
632  
633  // ----------------------------------------------------------------------------
634  // RUNTIME_FUNCTION_LIST defines all runtime functions accessed
635  // either directly by id (via the code generator), or indirectly
636  // via a native call by name (from within JS code).
637  // Entries have the form F(name, number of arguments, number of return values).
638  
639  #define RUNTIME_FUNCTION_LIST(F) \
640    RUNTIME_FUNCTION_LIST_ALWAYS_1(F) \
641    RUNTIME_FUNCTION_LIST_ALWAYS_2(F) \
642    RUNTIME_FUNCTION_LIST_ALWAYS_3(F) \
643    RUNTIME_FUNCTION_LIST_DEBUG(F) \
644    RUNTIME_FUNCTION_LIST_DEBUGGER(F) \
645    RUNTIME_FUNCTION_LIST_I18N_SUPPORT(F)
646  
647  // ----------------------------------------------------------------------------
648  // INLINE_FUNCTION_LIST defines all inlined functions accessed
649  // with a native call of the form %_name from within JS code.
650  // Entries have the form F(name, number of arguments, number of return values).
651  #define INLINE_FUNCTION_LIST(F)                             \
652    F(IsSmi, 1, 1)                                            \
653    F(IsNonNegativeSmi, 1, 1)                                 \
654    F(IsArray, 1, 1)                                          \
655    F(IsRegExp, 1, 1)                                         \
656    F(IsConstructCall, 0, 1)                                  \
657    F(CallFunction, -1 /* receiver + n args + function */, 1) \
658    F(ArgumentsLength, 0, 1)                                  \
659    F(Arguments, 1, 1)                                        \
660    F(ValueOf, 1, 1)                                          \
661    F(SetValueOf, 2, 1)                                       \
662    F(DateField, 2 /* date object, field index */, 1)         \
663    F(StringCharFromCode, 1, 1)                               \
664    F(StringCharAt, 2, 1)                                     \
665    F(OneByteSeqStringSetChar, 3, 1)                          \
666    F(TwoByteSeqStringSetChar, 3, 1)                          \
667    F(ObjectEquals, 2, 1)                                     \
668    F(IsObject, 1, 1)                                         \
669    F(IsFunction, 1, 1)                                       \
670    F(IsUndetectableObject, 1, 1)                             \
671    F(IsSpecObject, 1, 1)                                     \
672    F(IsStringWrapperSafeForDefaultValueOf, 1, 1)             \
673    F(MathPow, 2, 1)                                          \
674    F(IsMinusZero, 1, 1)                                      \
675    F(HasCachedArrayIndex, 1, 1)                              \
676    F(GetCachedArrayIndex, 1, 1)                              \
677    F(FastOneByteArrayJoin, 2, 1)                             \
678    F(GeneratorNext, 2, 1)                                    \
679    F(GeneratorThrow, 2, 1)                                   \
680    F(DebugBreakInOptimizedCode, 0, 1)                        \
681    F(ClassOf, 1, 1)                                          \
682    F(StringCharCodeAt, 2, 1)                                 \
683    F(StringAdd, 2, 1)                                        \
684    F(SubString, 3, 1)                                        \
685    F(StringCompare, 2, 1)                                    \
686    F(RegExpExec, 4, 1)                                       \
687    F(RegExpConstructResult, 3, 1)                            \
688    F(GetFromCache, 2, 1)                                     \
689    F(NumberToString, 1, 1)                                   \
690    F(DebugIsActive, 0, 1)
691  
692  
693  // ----------------------------------------------------------------------------
694  // INLINE_OPTIMIZED_FUNCTION_LIST defines all inlined functions accessed
695  // with a native call of the form %_name from within JS code that also have
696  // a corresponding runtime function, that is called from non-optimized code.
697  // For the benefit of (fuzz) tests, the runtime version can also be called
698  // directly as %name (i.e. without the leading underscore).
699  // Entries have the form F(name, number of arguments, number of return values).
700  #define INLINE_OPTIMIZED_FUNCTION_LIST(F) \
701    /* Typed Arrays */                                                         \
702    F(TypedArrayInitialize, 5, 1)                                              \
703    F(DataViewInitialize, 4, 1)                                                \
704    F(MaxSmi, 0, 1)                                                            \
705    F(TypedArrayMaxSizeInHeap, 0, 1)                                           \
706    F(ArrayBufferViewGetByteLength, 1, 1)                                      \
707    F(ArrayBufferViewGetByteOffset, 1, 1)                                      \
708    F(TypedArrayGetLength, 1, 1)                                               \
709    /* ArrayBuffer */                                                          \
710    F(ArrayBufferGetByteLength, 1, 1)                                          \
711    /* Maths */                                                                \
712    F(ConstructDouble, 2, 1)                                                   \
713    F(DoubleHi, 1, 1)                                                          \
714    F(DoubleLo, 1, 1)                                                          \
715    F(MathSqrtRT, 1, 1)                                                        \
716    F(MathLogRT, 1, 1)
717  
718  
719  //---------------------------------------------------------------------------
720  // Runtime provides access to all C++ runtime functions.
721  
722  class RuntimeState {
723   public:
string_iterator()724    StaticResource<ConsStringIteratorOp>* string_iterator() {
725      return &string_iterator_;
726    }
to_upper_mapping()727    unibrow::Mapping<unibrow::ToUppercase, 128>* to_upper_mapping() {
728      return &to_upper_mapping_;
729    }
to_lower_mapping()730    unibrow::Mapping<unibrow::ToLowercase, 128>* to_lower_mapping() {
731      return &to_lower_mapping_;
732    }
string_iterator_compare_x()733    ConsStringIteratorOp* string_iterator_compare_x() {
734      return &string_iterator_compare_x_;
735    }
string_iterator_compare_y()736    ConsStringIteratorOp* string_iterator_compare_y() {
737      return &string_iterator_compare_y_;
738    }
string_locale_compare_it1()739    ConsStringIteratorOp* string_locale_compare_it1() {
740      return &string_locale_compare_it1_;
741    }
string_locale_compare_it2()742    ConsStringIteratorOp* string_locale_compare_it2() {
743      return &string_locale_compare_it2_;
744    }
745  
746   private:
RuntimeState()747    RuntimeState() {}
748    // Non-reentrant string buffer for efficient general use in the runtime.
749    StaticResource<ConsStringIteratorOp> string_iterator_;
750    unibrow::Mapping<unibrow::ToUppercase, 128> to_upper_mapping_;
751    unibrow::Mapping<unibrow::ToLowercase, 128> to_lower_mapping_;
752    ConsStringIteratorOp string_iterator_compare_x_;
753    ConsStringIteratorOp string_iterator_compare_y_;
754    ConsStringIteratorOp string_locale_compare_it1_;
755    ConsStringIteratorOp string_locale_compare_it2_;
756  
757    friend class Isolate;
758    friend class Runtime;
759  
760    DISALLOW_COPY_AND_ASSIGN(RuntimeState);
761  };
762  
763  
764  class Runtime : public AllStatic {
765   public:
766    enum FunctionId {
767  #define F(name, nargs, ressize) k##name,
768      RUNTIME_FUNCTION_LIST(F)
769      INLINE_OPTIMIZED_FUNCTION_LIST(F)
770  #undef F
771  #define F(name, nargs, ressize) kInline##name,
772      INLINE_FUNCTION_LIST(F)
773  #undef F
774  #define F(name, nargs, ressize) kInlineOptimized##name,
775      INLINE_OPTIMIZED_FUNCTION_LIST(F)
776  #undef F
777      kNumFunctions,
778      kFirstInlineFunction = kInlineIsSmi
779    };
780  
781    enum IntrinsicType {
782      RUNTIME,
783      INLINE,
784      INLINE_OPTIMIZED
785    };
786  
787    // Intrinsic function descriptor.
788    struct Function {
789      FunctionId function_id;
790      IntrinsicType intrinsic_type;
791      // The JS name of the function.
792      const char* name;
793  
794      // The C++ (native) entry point.  NULL if the function is inlined.
795      byte* entry;
796  
797      // The number of arguments expected. nargs is -1 if the function takes
798      // a variable number of arguments.
799      int nargs;
800      // Size of result.  Most functions return a single pointer, size 1.
801      int result_size;
802    };
803  
804    static const int kNotFound = -1;
805  
806    // Add internalized strings for all the intrinsic function names to a
807    // StringDictionary.
808    static void InitializeIntrinsicFunctionNames(Isolate* isolate,
809                                                 Handle<NameDictionary> dict);
810  
811    // Get the intrinsic function with the given name, which must be internalized.
812    static const Function* FunctionForName(Handle<String> name);
813  
814    // Get the intrinsic function with the given FunctionId.
815    static const Function* FunctionForId(FunctionId id);
816  
817    // Get the intrinsic function with the given function entry address.
818    static const Function* FunctionForEntry(Address ref);
819  
820    // General-purpose helper functions for runtime system.
821    static int StringMatch(Isolate* isolate,
822                           Handle<String> sub,
823                           Handle<String> pat,
824                           int index);
825  
826    static bool IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch);
827  
828    // TODO(1240886): Some of the following methods are *not* handle safe, but
829    // accept handle arguments. This seems fragile.
830  
831    // Support getting the characters in a string using [] notation as
832    // in Firefox/SpiderMonkey, Safari and Opera.
833    MUST_USE_RESULT static MaybeHandle<Object> GetElementOrCharAt(
834        Isolate* isolate,
835        Handle<Object> object,
836        uint32_t index);
837  
838    MUST_USE_RESULT static MaybeHandle<Object> SetObjectProperty(
839        Isolate* isolate, Handle<Object> object, Handle<Object> key,
840        Handle<Object> value, StrictMode strict_mode);
841  
842    MUST_USE_RESULT static MaybeHandle<Object> DefineObjectProperty(
843        Handle<JSObject> object, Handle<Object> key, Handle<Object> value,
844        PropertyAttributes attr);
845  
846    MUST_USE_RESULT static MaybeHandle<Object> DeleteObjectProperty(
847        Isolate* isolate,
848        Handle<JSReceiver> object,
849        Handle<Object> key,
850        JSReceiver::DeleteMode mode);
851  
852    MUST_USE_RESULT static MaybeHandle<Object> HasObjectProperty(
853        Isolate* isolate,
854        Handle<JSReceiver> object,
855        Handle<Object> key);
856  
857    MUST_USE_RESULT static MaybeHandle<Object> GetObjectProperty(
858        Isolate* isolate,
859        Handle<Object> object,
860        Handle<Object> key);
861  
862    static void SetupArrayBuffer(Isolate* isolate,
863                                 Handle<JSArrayBuffer> array_buffer,
864                                 bool is_external,
865                                 void* data,
866                                 size_t allocated_length);
867  
868    static bool SetupArrayBufferAllocatingData(
869        Isolate* isolate,
870        Handle<JSArrayBuffer> array_buffer,
871        size_t allocated_length,
872        bool initialize = true);
873  
874    static void NeuterArrayBuffer(Handle<JSArrayBuffer> array_buffer);
875  
876    static void FreeArrayBuffer(
877        Isolate* isolate,
878        JSArrayBuffer* phantom_array_buffer);
879  
880    enum TypedArrayId {
881      // arrayIds below should be synchromized with typedarray.js natives.
882      ARRAY_ID_UINT8 = 1,
883      ARRAY_ID_INT8 = 2,
884      ARRAY_ID_UINT16 = 3,
885      ARRAY_ID_INT16 = 4,
886      ARRAY_ID_UINT32 = 5,
887      ARRAY_ID_INT32 = 6,
888      ARRAY_ID_FLOAT32 = 7,
889      ARRAY_ID_FLOAT64 = 8,
890      ARRAY_ID_UINT8_CLAMPED = 9,
891  
892      ARRAY_ID_FIRST = ARRAY_ID_UINT8,
893      ARRAY_ID_LAST = ARRAY_ID_UINT8_CLAMPED
894    };
895  
896    static void ArrayIdToTypeAndSize(int array_id,
897        ExternalArrayType *type,
898        ElementsKind* external_elements_kind,
899        ElementsKind* fixed_elements_kind,
900        size_t *element_size);
901  
902    // Used in runtime.cc and hydrogen's VisitArrayLiteral.
903    MUST_USE_RESULT static MaybeHandle<Object> CreateArrayLiteralBoilerplate(
904        Isolate* isolate,
905        Handle<FixedArray> literals,
906        Handle<FixedArray> elements);
907  };
908  
909  
910  //---------------------------------------------------------------------------
911  // Constants used by interface to runtime functions.
912  
913  class AllocateDoubleAlignFlag:  public BitField<bool,            0, 1> {};
914  class AllocateTargetSpace:      public BitField<AllocationSpace, 1, 3> {};
915  
916  class DeclareGlobalsEvalFlag:   public BitField<bool,       0, 1> {};
917  class DeclareGlobalsNativeFlag: public BitField<bool,       1, 1> {};
918  class DeclareGlobalsStrictMode: public BitField<StrictMode, 2, 1> {};
919  
920  } }  // namespace v8::internal
921  
922  #endif  // V8_RUNTIME_H_
923