Home | History | Annotate | Download | only in src
      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:
    540   StaticResource<StringInputBuffer>* string_input_buffer() {
    541     return &string_input_buffer_;
    542   }
    543   unibrow::Mapping<unibrow::ToUppercase, 128>* to_upper_mapping() {
    544     return &to_upper_mapping_;
    545   }
    546   unibrow::Mapping<unibrow::ToLowercase, 128>* to_lower_mapping() {
    547     return &to_lower_mapping_;
    548   }
    549   StringInputBuffer* string_input_buffer_compare_bufx() {
    550     return &string_input_buffer_compare_bufx_;
    551   }
    552   StringInputBuffer* string_input_buffer_compare_bufy() {
    553     return &string_input_buffer_compare_bufy_;
    554   }
    555   StringInputBuffer* string_locale_compare_buf1() {
    556     return &string_locale_compare_buf1_;
    557   }
    558   StringInputBuffer* string_locale_compare_buf2() {
    559     return &string_locale_compare_buf2_;
    560   }
    561 
    562  private:
    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