• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // Copyright 2012 the V8 project authors. All rights reserved.
2  // Redistribution and use in source and binary forms, with or without
3  // modification, are permitted provided that the following conditions are
4  // met:
5  //
6  //     * Redistributions of source code must retain the above copyright
7  //       notice, this list of conditions and the following disclaimer.
8  //     * Redistributions in binary form must reproduce the above
9  //       copyright notice, this list of conditions and the following
10  //       disclaimer in the documentation and/or other materials provided
11  //       with the distribution.
12  //     * Neither the name of Google Inc. nor the names of its
13  //       contributors may be used to endorse or promote products derived
14  //       from this software without specific prior written permission.
15  //
16  // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  
28  #ifndef V8_RUNTIME_H_
29  #define V8_RUNTIME_H_
30  
31  #include "allocation.h"
32  #include "zone.h"
33  
34  namespace v8 {
35  namespace internal {
36  
37  // The interface to C++ runtime functions.
38  
39  // ----------------------------------------------------------------------------
40  // RUNTIME_FUNCTION_LIST_ALWAYS defines runtime calls available in both
41  // release and debug mode.
42  // This macro should only be used by the macro RUNTIME_FUNCTION_LIST.
43  
44  // WARNING: RUNTIME_FUNCTION_LIST_ALWAYS_* is a very large macro that caused
45  // MSVC Intellisense to crash.  It was broken into two macros to work around
46  // this problem. Please avoid large recursive macros whenever possible.
47  #define RUNTIME_FUNCTION_LIST_ALWAYS_1(F) \
48    /* Property access */ \
49    F(GetProperty, 2, 1) \
50    F(KeyedGetProperty, 2, 1) \
51    F(DeleteProperty, 3, 1) \
52    F(HasLocalProperty, 2, 1) \
53    F(HasProperty, 2, 1) \
54    F(HasElement, 2, 1) \
55    F(IsPropertyEnumerable, 2, 1) \
56    F(GetPropertyNames, 1, 1) \
57    F(GetPropertyNamesFast, 1, 1) \
58    F(GetLocalPropertyNames, 1, 1) \
59    F(GetLocalElementNames, 1, 1) \
60    F(GetInterceptorInfo, 1, 1) \
61    F(GetNamedInterceptorPropertyNames, 1, 1) \
62    F(GetIndexedInterceptorElementNames, 1, 1) \
63    F(GetArgumentsProperty, 1, 1) \
64    F(ToFastProperties, 1, 1) \
65    F(ToSlowProperties, 1, 1) \
66    F(FinishArrayPrototypeSetup, 1, 1) \
67    F(SpecialArrayFunctions, 1, 1) \
68    F(GetDefaultReceiver, 1, 1) \
69    \
70    F(GetPrototype, 1, 1) \
71    F(IsInPrototypeChain, 2, 1) \
72    \
73    F(GetOwnProperty, 2, 1) \
74    \
75    F(IsExtensible, 1, 1) \
76    F(PreventExtensions, 1, 1)\
77    \
78    /* Utilities */ \
79    F(CheckIsBootstrapping, 0, 1) \
80    F(GetRootNaN, 0, 1) \
81    F(Call, -1 /* >= 2 */, 1) \
82    F(Apply, 5, 1) \
83    F(GetFunctionDelegate, 1, 1) \
84    F(GetConstructorDelegate, 1, 1) \
85    F(NewArgumentsFast, 3, 1) \
86    F(NewStrictArgumentsFast, 3, 1) \
87    F(LazyCompile, 1, 1) \
88    F(LazyRecompile, 1, 1) \
89    F(NotifyDeoptimized, 1, 1) \
90    F(NotifyOSR, 0, 1) \
91    F(DeoptimizeFunction, 1, 1) \
92    F(RunningInSimulator, 0, 1) \
93    F(OptimizeFunctionOnNextCall, -1, 1) \
94    F(GetOptimizationStatus, 1, 1) \
95    F(GetOptimizationCount, 1, 1) \
96    F(CompileForOnStackReplacement, 1, 1) \
97    F(SetNewFunctionAttributes, 1, 1) \
98    F(AllocateInNewSpace, 1, 1) \
99    F(SetNativeFlag, 1, 1) \
100    F(StoreArrayLiteralElement, 5, 1) \
101    \
102    /* Array join support */ \
103    F(PushIfAbsent, 2, 1) \
104    F(ArrayConcat, 1, 1) \
105    \
106    /* Conversions */ \
107    F(ToBool, 1, 1) \
108    F(Typeof, 1, 1) \
109    \
110    F(StringToNumber, 1, 1) \
111    F(StringFromCharCodeArray, 1, 1) \
112    F(StringParseInt, 2, 1) \
113    F(StringParseFloat, 1, 1) \
114    F(StringToLowerCase, 1, 1) \
115    F(StringToUpperCase, 1, 1) \
116    F(StringSplit, 3, 1) \
117    F(CharFromCode, 1, 1) \
118    F(URIEscape, 1, 1) \
119    F(URIUnescape, 1, 1) \
120    F(QuoteJSONString, 1, 1) \
121    F(QuoteJSONStringComma, 1, 1) \
122    F(QuoteJSONStringArray, 1, 1) \
123    \
124    F(NumberToString, 1, 1) \
125    F(NumberToStringSkipCache, 1, 1) \
126    F(NumberToInteger, 1, 1) \
127    F(NumberToIntegerMapMinusZero, 1, 1) \
128    F(NumberToJSUint32, 1, 1) \
129    F(NumberToJSInt32, 1, 1) \
130    F(NumberToSmi, 1, 1) \
131    F(AllocateHeapNumber, 0, 1) \
132    \
133    /* Arithmetic operations */ \
134    F(NumberAdd, 2, 1) \
135    F(NumberSub, 2, 1) \
136    F(NumberMul, 2, 1) \
137    F(NumberDiv, 2, 1) \
138    F(NumberMod, 2, 1) \
139    F(NumberUnaryMinus, 1, 1) \
140    F(NumberAlloc, 0, 1) \
141    \
142    F(StringAdd, 2, 1) \
143    F(StringBuilderConcat, 3, 1) \
144    F(StringBuilderJoin, 3, 1) \
145    F(SparseJoinWithSeparator, 3, 1) \
146    \
147    /* Bit operations */ \
148    F(NumberOr, 2, 1) \
149    F(NumberAnd, 2, 1) \
150    F(NumberXor, 2, 1) \
151    F(NumberNot, 1, 1) \
152    \
153    F(NumberShl, 2, 1) \
154    F(NumberShr, 2, 1) \
155    F(NumberSar, 2, 1) \
156    \
157    /* Comparisons */ \
158    F(NumberEquals, 2, 1) \
159    F(StringEquals, 2, 1) \
160    \
161    F(NumberCompare, 3, 1) \
162    F(SmiLexicographicCompare, 2, 1) \
163    F(StringCompare, 2, 1) \
164    \
165    /* Math */ \
166    F(Math_acos, 1, 1) \
167    F(Math_asin, 1, 1) \
168    F(Math_atan, 1, 1) \
169    F(Math_atan2, 2, 1) \
170    F(Math_ceil, 1, 1) \
171    F(Math_cos, 1, 1) \
172    F(Math_exp, 1, 1) \
173    F(Math_floor, 1, 1) \
174    F(Math_log, 1, 1) \
175    F(Math_pow, 2, 1) \
176    F(Math_pow_cfunction, 2, 1) \
177    F(RoundNumber, 1, 1) \
178    F(Math_sin, 1, 1) \
179    F(Math_sqrt, 1, 1) \
180    F(Math_tan, 1, 1) \
181    \
182    /* Regular expressions */ \
183    F(RegExpCompile, 3, 1) \
184    F(RegExpExec, 4, 1) \
185    F(RegExpExecMultiple, 4, 1) \
186    F(RegExpInitializeObject, 5, 1) \
187    F(RegExpConstructResult, 3, 1) \
188    \
189    /* JSON */ \
190    F(ParseJson, 1, 1) \
191    \
192    /* Strings */ \
193    F(StringCharCodeAt, 2, 1) \
194    F(StringIndexOf, 3, 1) \
195    F(StringLastIndexOf, 3, 1) \
196    F(StringLocaleCompare, 2, 1) \
197    F(SubString, 3, 1) \
198    F(StringReplaceRegExpWithString, 4, 1) \
199    F(StringReplaceOneCharWithString, 3, 1) \
200    F(StringMatch, 3, 1) \
201    F(StringTrim, 3, 1) \
202    F(StringToArray, 2, 1) \
203    F(NewStringWrapper, 1, 1) \
204    \
205    /* Numbers */ \
206    F(NumberToRadixString, 2, 1) \
207    F(NumberToFixed, 2, 1) \
208    F(NumberToExponential, 2, 1) \
209    F(NumberToPrecision, 2, 1)
210  
211  #define RUNTIME_FUNCTION_LIST_ALWAYS_2(F) \
212    /* Reflection */ \
213    F(FunctionSetInstanceClassName, 2, 1) \
214    F(FunctionSetLength, 2, 1) \
215    F(FunctionSetPrototype, 2, 1) \
216    F(FunctionSetReadOnlyPrototype, 1, 1) \
217    F(FunctionGetName, 1, 1) \
218    F(FunctionSetName, 2, 1) \
219    F(FunctionNameShouldPrintAsAnonymous, 1, 1) \
220    F(FunctionMarkNameShouldPrintAsAnonymous, 1, 1) \
221    F(FunctionBindArguments, 4, 1) \
222    F(BoundFunctionGetBindings, 1, 1) \
223    F(FunctionRemovePrototype, 1, 1) \
224    F(FunctionGetSourceCode, 1, 1) \
225    F(FunctionGetScript, 1, 1) \
226    F(FunctionGetScriptSourcePosition, 1, 1) \
227    F(FunctionGetPositionForOffset, 2, 1) \
228    F(FunctionIsAPIFunction, 1, 1) \
229    F(FunctionIsBuiltin, 1, 1) \
230    F(GetScript, 1, 1) \
231    F(CollectStackTrace, 3, 1) \
232    F(GetV8Version, 0, 1) \
233    \
234    F(ClassOf, 1, 1) \
235    F(SetCode, 2, 1) \
236    F(SetExpectedNumberOfProperties, 2, 1) \
237    \
238    F(CreateApiFunction, 1, 1) \
239    F(IsTemplate, 1, 1) \
240    F(GetTemplateField, 2, 1) \
241    F(DisableAccessChecks, 1, 1) \
242    F(EnableAccessChecks, 1, 1) \
243    \
244    /* Dates */ \
245    F(DateCurrentTime, 0, 1) \
246    F(DateParseString, 2, 1) \
247    F(DateLocalTimezone, 1, 1) \
248    F(DateToUTC, 1, 1) \
249    F(DateMakeDay, 2, 1) \
250    F(DateSetValue, 3, 1) \
251    \
252    /* Numbers */ \
253    \
254    /* Globals */ \
255    F(CompileString, 1, 1) \
256    F(GlobalPrint, 1, 1) \
257    \
258    /* Eval */ \
259    F(GlobalReceiver, 1, 1) \
260    F(ResolvePossiblyDirectEval, 5, 2) \
261    \
262    F(SetProperty, -1 /* 4 or 5 */, 1) \
263    F(DefineOrRedefineDataProperty, 4, 1) \
264    F(DefineOrRedefineAccessorProperty, 5, 1) \
265    F(IgnoreAttributesAndSetProperty, -1 /* 3 or 4 */, 1) \
266    \
267    /* Arrays */ \
268    F(RemoveArrayHoles, 2, 1) \
269    F(GetArrayKeys, 2, 1) \
270    F(MoveArrayContents, 2, 1) \
271    F(EstimateNumberOfElements, 1, 1) \
272    \
273    /* Getters and Setters */ \
274    F(LookupAccessor, 3, 1) \
275    \
276    /* Literals */ \
277    F(MaterializeRegExpLiteral, 4, 1)\
278    F(CreateObjectLiteral, 4, 1) \
279    F(CreateObjectLiteralShallow, 4, 1) \
280    F(CreateArrayLiteral, 3, 1) \
281    F(CreateArrayLiteralShallow, 3, 1) \
282    \
283    /* Harmony proxies */ \
284    F(CreateJSProxy, 2, 1) \
285    F(CreateJSFunctionProxy, 4, 1) \
286    F(IsJSProxy, 1, 1) \
287    F(IsJSFunctionProxy, 1, 1) \
288    F(GetHandler, 1, 1) \
289    F(GetCallTrap, 1, 1) \
290    F(GetConstructTrap, 1, 1) \
291    F(Fix, 1, 1) \
292    \
293    /* Harmony sets */ \
294    F(SetInitialize, 1, 1) \
295    F(SetAdd, 2, 1) \
296    F(SetHas, 2, 1) \
297    F(SetDelete, 2, 1) \
298    \
299    /* Harmony maps */ \
300    F(MapInitialize, 1, 1) \
301    F(MapGet, 2, 1) \
302    F(MapSet, 3, 1) \
303    \
304    /* Harmony weakmaps */ \
305    F(WeakMapInitialize, 1, 1) \
306    F(WeakMapGet, 2, 1) \
307    F(WeakMapSet, 3, 1) \
308    \
309    /* Statements */ \
310    F(NewClosure, 3, 1) \
311    F(NewObject, 1, 1) \
312    F(NewObjectFromBound, 1, 1) \
313    F(FinalizeInstanceSize, 1, 1) \
314    F(Throw, 1, 1) \
315    F(ReThrow, 1, 1) \
316    F(ThrowReferenceError, 1, 1) \
317    F(StackGuard, 0, 1) \
318    F(Interrupt, 0, 1) \
319    F(PromoteScheduledException, 0, 1) \
320    \
321    /* Contexts */ \
322    F(NewFunctionContext, 1, 1) \
323    F(PushWithContext, 2, 1) \
324    F(PushCatchContext, 3, 1) \
325    F(PushBlockContext, 2, 1) \
326    F(DeleteContextSlot, 2, 1) \
327    F(LoadContextSlot, 2, 2) \
328    F(LoadContextSlotNoReferenceError, 2, 2) \
329    F(StoreContextSlot, 4, 1) \
330    \
331    /* Declarations and initialization */ \
332    F(DeclareGlobals, 3, 1) \
333    F(DeclareContextSlot, 4, 1) \
334    F(InitializeVarGlobal, -1 /* 2 or 3 */, 1) \
335    F(InitializeConstGlobal, 2, 1) \
336    F(InitializeConstContextSlot, 3, 1) \
337    F(OptimizeObjectForAddingMultipleProperties, 2, 1) \
338    \
339    /* Debugging */ \
340    F(DebugPrint, 1, 1) \
341    F(DebugTrace, 0, 1) \
342    F(TraceEnter, 0, 1) \
343    F(TraceExit, 1, 1) \
344    F(Abort, 2, 1) \
345    /* Logging */ \
346    F(Log, 2, 1) \
347    /* ES5 */ \
348    F(LocalKeys, 1, 1) \
349    /* Cache suport */ \
350    F(GetFromCache, 2, 1) \
351    \
352    /* Message objects */ \
353    F(NewMessageObject, 2, 1) \
354    F(MessageGetType, 1, 1) \
355    F(MessageGetArguments, 1, 1) \
356    F(MessageGetStartPosition, 1, 1) \
357    F(MessageGetScript, 1, 1) \
358    \
359    /* Pseudo functions - handled as macros by parser */ \
360    F(IS_VAR, 1, 1) \
361    \
362    /* expose boolean functions from objects-inl.h */ \
363    F(HasFastSmiOnlyElements, 1, 1) \
364    F(HasFastElements, 1, 1) \
365    F(HasFastDoubleElements, 1, 1) \
366    F(HasDictionaryElements, 1, 1) \
367    F(HasExternalPixelElements, 1, 1) \
368    F(HasExternalArrayElements, 1, 1) \
369    F(HasExternalByteElements, 1, 1) \
370    F(HasExternalUnsignedByteElements, 1, 1) \
371    F(HasExternalShortElements, 1, 1) \
372    F(HasExternalUnsignedShortElements, 1, 1) \
373    F(HasExternalIntElements, 1, 1) \
374    F(HasExternalUnsignedIntElements, 1, 1) \
375    F(HasExternalFloatElements, 1, 1) \
376    F(HasExternalDoubleElements, 1, 1) \
377    F(TransitionElementsSmiToDouble, 1, 1) \
378    F(TransitionElementsDoubleToObject, 1, 1) \
379    F(HaveSameMap, 2, 1) \
380    /* profiler */ \
381    F(ProfilerResume, 0, 1) \
382    F(ProfilerPause, 0, 1)
383  
384  
385  #ifdef ENABLE_DEBUGGER_SUPPORT
386  #define RUNTIME_FUNCTION_LIST_DEBUGGER_SUPPORT(F) \
387    /* Debugger support*/ \
388    F(DebugBreak, 0, 1) \
389    F(SetDebugEventListener, 2, 1) \
390    F(Break, 0, 1) \
391    F(DebugGetPropertyDetails, 2, 1) \
392    F(DebugGetProperty, 2, 1) \
393    F(DebugPropertyTypeFromDetails, 1, 1) \
394    F(DebugPropertyAttributesFromDetails, 1, 1) \
395    F(DebugPropertyIndexFromDetails, 1, 1) \
396    F(DebugNamedInterceptorPropertyValue, 2, 1) \
397    F(DebugIndexedInterceptorElementValue, 2, 1) \
398    F(CheckExecutionState, 1, 1) \
399    F(GetFrameCount, 1, 1) \
400    F(GetFrameDetails, 2, 1) \
401    F(GetScopeCount, 2, 1) \
402    F(GetScopeDetails, 4, 1) \
403    F(DebugPrintScopes, 0, 1) \
404    F(GetThreadCount, 1, 1) \
405    F(GetThreadDetails, 2, 1) \
406    F(SetDisableBreak, 1, 1) \
407    F(GetBreakLocations, 1, 1) \
408    F(SetFunctionBreakPoint, 3, 1) \
409    F(SetScriptBreakPoint, 3, 1) \
410    F(ClearBreakPoint, 1, 1) \
411    F(ChangeBreakOnException, 2, 1) \
412    F(IsBreakOnException, 1, 1) \
413    F(PrepareStep, 3, 1) \
414    F(ClearStepping, 0, 1) \
415    F(DebugEvaluate, 6, 1) \
416    F(DebugEvaluateGlobal, 4, 1) \
417    F(DebugGetLoadedScripts, 0, 1) \
418    F(DebugReferencedBy, 3, 1) \
419    F(DebugConstructedBy, 2, 1) \
420    F(DebugGetPrototype, 1, 1) \
421    F(DebugSetScriptSource, 2, 1) \
422    F(SystemBreak, 0, 1) \
423    F(DebugDisassembleFunction, 1, 1) \
424    F(DebugDisassembleConstructor, 1, 1) \
425    F(FunctionGetInferredName, 1, 1) \
426    F(LiveEditFindSharedFunctionInfosForScript, 1, 1) \
427    F(LiveEditGatherCompileInfo, 2, 1) \
428    F(LiveEditReplaceScript, 3, 1) \
429    F(LiveEditReplaceFunctionCode, 2, 1) \
430    F(LiveEditFunctionSourceUpdated, 1, 1) \
431    F(LiveEditFunctionSetScript, 2, 1) \
432    F(LiveEditReplaceRefToNestedFunction, 3, 1) \
433    F(LiveEditPatchFunctionPositions, 2, 1) \
434    F(LiveEditCheckAndDropActivations, 2, 1) \
435    F(LiveEditCompareStrings, 2, 1) \
436    F(GetFunctionCodePositionFromSource, 2, 1) \
437    F(ExecuteInDebugContext, 2, 1) \
438    \
439    F(SetFlags, 1, 1) \
440    F(CollectGarbage, 1, 1) \
441    F(GetHeapUsage, 0, 1) \
442    \
443    /* LiveObjectList support*/ \
444    F(HasLOLEnabled, 0, 1) \
445    F(CaptureLOL, 0, 1) \
446    F(DeleteLOL, 1, 1) \
447    F(DumpLOL, 5, 1) \
448    F(GetLOLObj, 1, 1) \
449    F(GetLOLObjId, 1, 1) \
450    F(GetLOLObjRetainers, 6, 1) \
451    F(GetLOLPath, 3, 1) \
452    F(InfoLOL, 2, 1) \
453    F(PrintLOLObj, 1, 1) \
454    F(ResetLOL, 0, 1) \
455    F(SummarizeLOL, 3, 1)
456  
457  #else
458  #define RUNTIME_FUNCTION_LIST_DEBUGGER_SUPPORT(F)
459  #endif
460  
461  #ifdef DEBUG
462  #define RUNTIME_FUNCTION_LIST_DEBUG(F) \
463    /* Testing */ \
464    F(ListNatives, 0, 1)
465  #else
466  #define RUNTIME_FUNCTION_LIST_DEBUG(F)
467  #endif
468  
469  // ----------------------------------------------------------------------------
470  // RUNTIME_FUNCTION_LIST defines all runtime functions accessed
471  // either directly by id (via the code generator), or indirectly
472  // via a native call by name (from within JS code).
473  
474  #define RUNTIME_FUNCTION_LIST(F) \
475    RUNTIME_FUNCTION_LIST_ALWAYS_1(F) \
476    RUNTIME_FUNCTION_LIST_ALWAYS_2(F) \
477    RUNTIME_FUNCTION_LIST_DEBUG(F) \
478    RUNTIME_FUNCTION_LIST_DEBUGGER_SUPPORT(F)
479  
480  // ----------------------------------------------------------------------------
481  // INLINE_FUNCTION_LIST defines all inlined functions accessed
482  // with a native call of the form %_name from within JS code.
483  // Entries have the form F(name, number of arguments, number of return values).
484  #define INLINE_FUNCTION_LIST(F) \
485    F(IsSmi, 1, 1)                                                             \
486    F(IsNonNegativeSmi, 1, 1)                                                  \
487    F(IsArray, 1, 1)                                                           \
488    F(IsRegExp, 1, 1)                                                          \
489    F(IsConstructCall, 0, 1)                                                   \
490    F(CallFunction, -1 /* receiver + n args + function */, 1)                  \
491    F(ArgumentsLength, 0, 1)                                                   \
492    F(Arguments, 1, 1)                                                         \
493    F(ValueOf, 1, 1)                                                           \
494    F(SetValueOf, 2, 1)                                                        \
495    F(DateField, 2 /* date object, field index */, 1)                          \
496    F(StringCharFromCode, 1, 1)                                                \
497    F(StringCharAt, 2, 1)                                                      \
498    F(ObjectEquals, 2, 1)                                                      \
499    F(RandomHeapNumber, 0, 1)                                                  \
500    F(IsObject, 1, 1)                                                          \
501    F(IsFunction, 1, 1)                                                        \
502    F(IsUndetectableObject, 1, 1)                                              \
503    F(IsSpecObject, 1, 1)                                                      \
504    F(IsStringWrapperSafeForDefaultValueOf, 1, 1)                              \
505    F(MathPow, 2, 1)                                                           \
506    F(MathSin, 1, 1)                                                           \
507    F(MathCos, 1, 1)                                                           \
508    F(MathTan, 1, 1)                                                           \
509    F(MathSqrt, 1, 1)                                                          \
510    F(MathLog, 1, 1)                                                           \
511    F(IsRegExpEquivalent, 2, 1)                                                \
512    F(HasCachedArrayIndex, 1, 1)                                               \
513    F(GetCachedArrayIndex, 1, 1)                                               \
514    F(FastAsciiArrayJoin, 2, 1)
515  
516  
517  // ----------------------------------------------------------------------------
518  // INLINE_AND_RUNTIME_FUNCTION_LIST defines all inlined functions accessed
519  // with a native call of the form %_name from within JS code that also have
520  // a corresponding runtime function, that is called for slow cases.
521  // Entries have the form F(name, number of arguments, number of return values).
522  #define INLINE_RUNTIME_FUNCTION_LIST(F) \
523    F(ClassOf, 1, 1)                                                           \
524    F(StringCharCodeAt, 2, 1)                                                  \
525    F(Log, 3, 1)                                                               \
526    F(StringAdd, 2, 1)                                                         \
527    F(SubString, 3, 1)                                                         \
528    F(StringCompare, 2, 1)                                                     \
529    F(RegExpExec, 4, 1)                                                        \
530    F(RegExpConstructResult, 3, 1)                                             \
531    F(GetFromCache, 2, 1)                                                      \
532    F(NumberToString, 1, 1)
533  
534  
535  //---------------------------------------------------------------------------
536  // Runtime provides access to all C++ runtime functions.
537  
538  class RuntimeState {
539   public:
string_input_buffer()540    StaticResource<StringInputBuffer>* string_input_buffer() {
541      return &string_input_buffer_;
542    }
to_upper_mapping()543    unibrow::Mapping<unibrow::ToUppercase, 128>* to_upper_mapping() {
544      return &to_upper_mapping_;
545    }
to_lower_mapping()546    unibrow::Mapping<unibrow::ToLowercase, 128>* to_lower_mapping() {
547      return &to_lower_mapping_;
548    }
string_input_buffer_compare_bufx()549    StringInputBuffer* string_input_buffer_compare_bufx() {
550      return &string_input_buffer_compare_bufx_;
551    }
string_input_buffer_compare_bufy()552    StringInputBuffer* string_input_buffer_compare_bufy() {
553      return &string_input_buffer_compare_bufy_;
554    }
string_locale_compare_buf1()555    StringInputBuffer* string_locale_compare_buf1() {
556      return &string_locale_compare_buf1_;
557    }
string_locale_compare_buf2()558    StringInputBuffer* string_locale_compare_buf2() {
559      return &string_locale_compare_buf2_;
560    }
561  
562   private:
RuntimeState()563    RuntimeState() {}
564    // Non-reentrant string buffer for efficient general use in the runtime.
565    StaticResource<StringInputBuffer> string_input_buffer_;
566    unibrow::Mapping<unibrow::ToUppercase, 128> to_upper_mapping_;
567    unibrow::Mapping<unibrow::ToLowercase, 128> to_lower_mapping_;
568    StringInputBuffer string_input_buffer_compare_bufx_;
569    StringInputBuffer string_input_buffer_compare_bufy_;
570    StringInputBuffer string_locale_compare_buf1_;
571    StringInputBuffer string_locale_compare_buf2_;
572  
573    friend class Isolate;
574    friend class Runtime;
575  
576    DISALLOW_COPY_AND_ASSIGN(RuntimeState);
577  };
578  
579  
580  class Runtime : public AllStatic {
581   public:
582    enum FunctionId {
583  #define F(name, nargs, ressize) k##name,
584      RUNTIME_FUNCTION_LIST(F)
585  #undef F
586  #define F(name, nargs, ressize) kInline##name,
587      INLINE_FUNCTION_LIST(F)
588      INLINE_RUNTIME_FUNCTION_LIST(F)
589  #undef F
590      kNumFunctions,
591      kFirstInlineFunction = kInlineIsSmi
592    };
593  
594    enum IntrinsicType {
595      RUNTIME,
596      INLINE
597    };
598  
599    // Intrinsic function descriptor.
600    struct Function {
601      FunctionId function_id;
602      IntrinsicType intrinsic_type;
603      // The JS name of the function.
604      const char* name;
605  
606      // The C++ (native) entry point.  NULL if the function is inlined.
607      byte* entry;
608  
609      // The number of arguments expected. nargs is -1 if the function takes
610      // a variable number of arguments.
611      int nargs;
612      // Size of result.  Most functions return a single pointer, size 1.
613      int result_size;
614    };
615  
616    static const int kNotFound = -1;
617  
618    // Add symbols for all the intrinsic function names to a StringDictionary.
619    // Returns failure if an allocation fails.  In this case, it must be
620    // retried with a new, empty StringDictionary, not with the same one.
621    // Alternatively, heap initialization can be completely restarted.
622    MUST_USE_RESULT static MaybeObject* InitializeIntrinsicFunctionNames(
623        Heap* heap, Object* dictionary);
624  
625    // Get the intrinsic function with the given name, which must be a symbol.
626    static const Function* FunctionForSymbol(Handle<String> name);
627  
628    // Get the intrinsic function with the given FunctionId.
629    static const Function* FunctionForId(FunctionId id);
630  
631    static Handle<String> StringReplaceOneCharWithString(Isolate* isolate,
632                                                         Handle<String> subject,
633                                                         Handle<String> search,
634                                                         Handle<String> replace,
635                                                         bool* found,
636                                                         int recursion_limit);
637  
638    // General-purpose helper functions for runtime system.
639    static int StringMatch(Isolate* isolate,
640                           Handle<String> sub,
641                           Handle<String> pat,
642                           int index);
643  
644    static bool IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch);
645  
646    // TODO(1240886): Some of the following methods are *not* handle safe, but
647    // accept handle arguments. This seems fragile.
648  
649    // Support getting the characters in a string using [] notation as
650    // in Firefox/SpiderMonkey, Safari and Opera.
651    MUST_USE_RESULT static MaybeObject* GetElementOrCharAt(Isolate* isolate,
652                                                           Handle<Object> object,
653                                                           uint32_t index);
654  
655    MUST_USE_RESULT static MaybeObject* SetObjectProperty(
656        Isolate* isolate,
657        Handle<Object> object,
658        Handle<Object> key,
659        Handle<Object> value,
660        PropertyAttributes attr,
661        StrictModeFlag strict_mode);
662  
663    MUST_USE_RESULT static MaybeObject* ForceSetObjectProperty(
664        Isolate* isolate,
665        Handle<JSObject> object,
666        Handle<Object> key,
667        Handle<Object> value,
668        PropertyAttributes attr);
669  
670    MUST_USE_RESULT static MaybeObject* ForceDeleteObjectProperty(
671        Isolate* isolate,
672        Handle<JSReceiver> object,
673        Handle<Object> key);
674  
675    MUST_USE_RESULT static MaybeObject* GetObjectProperty(
676        Isolate* isolate,
677        Handle<Object> object,
678        Handle<Object> key);
679  
680    // This function is used in FunctionNameUsing* tests.
681    static Object* FindSharedFunctionInfoInScript(Isolate* isolate,
682                                                  Handle<Script> script,
683                                                  int position);
684  
685    // Helper functions used stubs.
686    static void PerformGC(Object* result);
687  
688    // Used in runtime.cc and hydrogen's VisitArrayLiteral.
689    static Handle<Object> CreateArrayLiteralBoilerplate(
690        Isolate* isolate,
691        Handle<FixedArray> literals,
692        Handle<FixedArray> elements);
693  };
694  
695  
696  //---------------------------------------------------------------------------
697  // Constants used by interface to runtime functions.
698  
699  class DeclareGlobalsEvalFlag:     public BitField<bool,         0, 1> {};
700  class DeclareGlobalsNativeFlag:   public BitField<bool,         1, 1> {};
701  class DeclareGlobalsLanguageMode: public BitField<LanguageMode, 2, 2> {};
702  
703  } }  // namespace v8::internal
704  
705  #endif  // V8_RUNTIME_H_
706