Home | History | Annotate | Download | only in src
      1 // Copyright 2006-2008 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_BUILTINS_H_
     29 #define V8_BUILTINS_H_
     30 
     31 namespace v8 {
     32 namespace internal {
     33 
     34 // Specifies extra arguments required by a C++ builtin.
     35 enum BuiltinExtraArguments {
     36   NO_EXTRA_ARGUMENTS = 0,
     37   NEEDS_CALLED_FUNCTION = 1
     38 };
     39 
     40 
     41 // Define list of builtins implemented in C++.
     42 #define BUILTIN_LIST_C(V)                                           \
     43   V(Illegal, NO_EXTRA_ARGUMENTS)                                    \
     44                                                                     \
     45   V(EmptyFunction, NO_EXTRA_ARGUMENTS)                              \
     46                                                                     \
     47   V(ArrayCodeGeneric, NO_EXTRA_ARGUMENTS)                           \
     48                                                                     \
     49   V(ArrayPush, NO_EXTRA_ARGUMENTS)                                  \
     50   V(ArrayPop, NO_EXTRA_ARGUMENTS)                                   \
     51   V(ArrayShift, NO_EXTRA_ARGUMENTS)                                 \
     52   V(ArrayUnshift, NO_EXTRA_ARGUMENTS)                               \
     53   V(ArraySlice, NO_EXTRA_ARGUMENTS)                                 \
     54   V(ArraySplice, NO_EXTRA_ARGUMENTS)                                \
     55                                                                     \
     56   V(HandleApiCall, NEEDS_CALLED_FUNCTION)                           \
     57   V(FastHandleApiCall, NO_EXTRA_ARGUMENTS)                          \
     58   V(HandleApiCallConstruct, NEEDS_CALLED_FUNCTION)                  \
     59   V(HandleApiCallAsFunction, NO_EXTRA_ARGUMENTS)                    \
     60   V(HandleApiCallAsConstructor, NO_EXTRA_ARGUMENTS)
     61 
     62 
     63 // Define list of builtins implemented in assembly.
     64 #define BUILTIN_LIST_A(V)                                                 \
     65   V(ArgumentsAdaptorTrampoline, BUILTIN, UNINITIALIZED)                   \
     66   V(JSConstructCall,            BUILTIN, UNINITIALIZED)                   \
     67   V(JSConstructStubGeneric,     BUILTIN, UNINITIALIZED)                   \
     68   V(JSConstructStubApi,         BUILTIN, UNINITIALIZED)                   \
     69   V(JSEntryTrampoline,          BUILTIN, UNINITIALIZED)                   \
     70   V(JSConstructEntryTrampoline, BUILTIN, UNINITIALIZED)                   \
     71                                                                           \
     72   V(LoadIC_Miss,                BUILTIN, UNINITIALIZED)                   \
     73   V(KeyedLoadIC_Miss,           BUILTIN, UNINITIALIZED)                   \
     74   V(StoreIC_Miss,               BUILTIN, UNINITIALIZED)                   \
     75   V(KeyedStoreIC_Miss,          BUILTIN, UNINITIALIZED)                   \
     76                                                                           \
     77   V(LoadIC_Initialize,          LOAD_IC, UNINITIALIZED)                   \
     78   V(LoadIC_PreMonomorphic,      LOAD_IC, PREMONOMORPHIC)                  \
     79   V(LoadIC_Normal,              LOAD_IC, MONOMORPHIC)                     \
     80   V(LoadIC_ArrayLength,         LOAD_IC, MONOMORPHIC)                     \
     81   V(LoadIC_StringLength,        LOAD_IC, MONOMORPHIC)                     \
     82   V(LoadIC_FunctionPrototype,   LOAD_IC, MONOMORPHIC)                     \
     83   V(LoadIC_Megamorphic,         LOAD_IC, MEGAMORPHIC)                     \
     84                                                                           \
     85   V(KeyedLoadIC_Initialize,     KEYED_LOAD_IC, UNINITIALIZED)             \
     86   V(KeyedLoadIC_PreMonomorphic, KEYED_LOAD_IC, PREMONOMORPHIC)            \
     87   V(KeyedLoadIC_Generic,        KEYED_LOAD_IC, MEGAMORPHIC)               \
     88   V(KeyedLoadIC_String,         KEYED_LOAD_IC, MEGAMORPHIC)               \
     89   V(KeyedLoadIC_ExternalByteArray,          KEYED_LOAD_IC, MEGAMORPHIC)   \
     90   V(KeyedLoadIC_ExternalUnsignedByteArray,  KEYED_LOAD_IC, MEGAMORPHIC)   \
     91   V(KeyedLoadIC_ExternalShortArray,         KEYED_LOAD_IC, MEGAMORPHIC)   \
     92   V(KeyedLoadIC_ExternalUnsignedShortArray, KEYED_LOAD_IC, MEGAMORPHIC)   \
     93   V(KeyedLoadIC_ExternalIntArray,           KEYED_LOAD_IC, MEGAMORPHIC)   \
     94   V(KeyedLoadIC_ExternalUnsignedIntArray,   KEYED_LOAD_IC, MEGAMORPHIC)   \
     95   V(KeyedLoadIC_ExternalFloatArray,         KEYED_LOAD_IC, MEGAMORPHIC)   \
     96   V(KeyedLoadIC_IndexedInterceptor,         KEYED_LOAD_IC, MEGAMORPHIC)   \
     97                                                                           \
     98   V(StoreIC_Initialize,         STORE_IC, UNINITIALIZED)                  \
     99   V(StoreIC_Megamorphic,        STORE_IC, MEGAMORPHIC)                    \
    100                                                                           \
    101   V(KeyedStoreIC_Initialize,    KEYED_STORE_IC, UNINITIALIZED)            \
    102   V(KeyedStoreIC_Generic,       KEYED_STORE_IC, MEGAMORPHIC)              \
    103   V(KeyedStoreIC_ExternalByteArray,          KEYED_STORE_IC, MEGAMORPHIC) \
    104   V(KeyedStoreIC_ExternalUnsignedByteArray,  KEYED_STORE_IC, MEGAMORPHIC) \
    105   V(KeyedStoreIC_ExternalShortArray,         KEYED_STORE_IC, MEGAMORPHIC) \
    106   V(KeyedStoreIC_ExternalUnsignedShortArray, KEYED_STORE_IC, MEGAMORPHIC) \
    107   V(KeyedStoreIC_ExternalIntArray,           KEYED_STORE_IC, MEGAMORPHIC) \
    108   V(KeyedStoreIC_ExternalUnsignedIntArray,   KEYED_STORE_IC, MEGAMORPHIC) \
    109   V(KeyedStoreIC_ExternalFloatArray,         KEYED_STORE_IC, MEGAMORPHIC) \
    110                                                                           \
    111   /* Uses KeyedLoadIC_Initialize; must be after in list. */               \
    112   V(FunctionCall,               BUILTIN, UNINITIALIZED)                   \
    113   V(FunctionApply,              BUILTIN, UNINITIALIZED)                   \
    114                                                                           \
    115   V(ArrayCode,                  BUILTIN, UNINITIALIZED)                   \
    116   V(ArrayConstructCode,         BUILTIN, UNINITIALIZED)
    117 
    118 #ifdef ENABLE_DEBUGGER_SUPPORT
    119 // Define list of builtins used by the debugger implemented in assembly.
    120 #define BUILTIN_LIST_DEBUG_A(V)                                \
    121   V(Return_DebugBreak,          BUILTIN, DEBUG_BREAK)          \
    122   V(ConstructCall_DebugBreak,   BUILTIN, DEBUG_BREAK)          \
    123   V(StubNoRegisters_DebugBreak, BUILTIN, DEBUG_BREAK)          \
    124   V(LoadIC_DebugBreak,          LOAD_IC, DEBUG_BREAK)          \
    125   V(KeyedLoadIC_DebugBreak,     KEYED_LOAD_IC, DEBUG_BREAK)    \
    126   V(StoreIC_DebugBreak,         STORE_IC, DEBUG_BREAK)         \
    127   V(KeyedStoreIC_DebugBreak,    KEYED_STORE_IC, DEBUG_BREAK)
    128 #else
    129 #define BUILTIN_LIST_DEBUG_A(V)
    130 #endif
    131 
    132 // Define list of builtins implemented in JavaScript.
    133 #define BUILTINS_LIST_JS(V)              \
    134   V(EQUALS, 1)                           \
    135   V(STRICT_EQUALS, 1)                    \
    136   V(COMPARE, 2)                          \
    137   V(ADD, 1)                              \
    138   V(SUB, 1)                              \
    139   V(MUL, 1)                              \
    140   V(DIV, 1)                              \
    141   V(MOD, 1)                              \
    142   V(BIT_OR, 1)                           \
    143   V(BIT_AND, 1)                          \
    144   V(BIT_XOR, 1)                          \
    145   V(UNARY_MINUS, 0)                      \
    146   V(BIT_NOT, 0)                          \
    147   V(SHL, 1)                              \
    148   V(SAR, 1)                              \
    149   V(SHR, 1)                              \
    150   V(DELETE, 1)                           \
    151   V(IN, 1)                               \
    152   V(INSTANCE_OF, 1)                      \
    153   V(GET_KEYS, 0)                         \
    154   V(FILTER_KEY, 1)                       \
    155   V(CALL_NON_FUNCTION, 0)                \
    156   V(CALL_NON_FUNCTION_AS_CONSTRUCTOR, 0) \
    157   V(TO_OBJECT, 0)                        \
    158   V(TO_NUMBER, 0)                        \
    159   V(TO_STRING, 0)                        \
    160   V(STRING_ADD_LEFT, 1)                  \
    161   V(STRING_ADD_RIGHT, 1)                 \
    162   V(APPLY_PREPARE, 1)                    \
    163   V(APPLY_OVERFLOW, 1)                   \
    164   V(STRING_CHAR_AT, 1)
    165 
    166 
    167 class ObjectVisitor;
    168 
    169 
    170 class Builtins : public AllStatic {
    171  public:
    172   // Generate all builtin code objects. Should be called once during
    173   // VM initialization.
    174   static void Setup(bool create_heap_objects);
    175   static void TearDown();
    176 
    177   // Garbage collection support.
    178   static void IterateBuiltins(ObjectVisitor* v);
    179 
    180   // Disassembler support.
    181   static const char* Lookup(byte* pc);
    182 
    183   enum Name {
    184 #define DEF_ENUM_C(name, ignore) name,
    185 #define DEF_ENUM_A(name, kind, state) name,
    186     BUILTIN_LIST_C(DEF_ENUM_C)
    187     BUILTIN_LIST_A(DEF_ENUM_A)
    188     BUILTIN_LIST_DEBUG_A(DEF_ENUM_A)
    189 #undef DEF_ENUM_C
    190 #undef DEF_ENUM_A
    191     builtin_count
    192   };
    193 
    194   enum CFunctionId {
    195 #define DEF_ENUM_C(name, ignore) c_##name,
    196     BUILTIN_LIST_C(DEF_ENUM_C)
    197 #undef DEF_ENUM_C
    198     cfunction_count
    199   };
    200 
    201   enum JavaScript {
    202 #define DEF_ENUM(name, ignore) name,
    203     BUILTINS_LIST_JS(DEF_ENUM)
    204 #undef DEF_ENUM
    205     id_count
    206   };
    207 
    208   static Code* builtin(Name name) {
    209     // Code::cast cannot be used here since we access builtins
    210     // during the marking phase of mark sweep. See IC::Clear.
    211     return reinterpret_cast<Code*>(builtins_[name]);
    212   }
    213 
    214   static Address builtin_address(Name name) {
    215     return reinterpret_cast<Address>(&builtins_[name]);
    216   }
    217 
    218   static Address c_function_address(CFunctionId id) {
    219     return c_functions_[id];
    220   }
    221 
    222   static const char* GetName(JavaScript id) { return javascript_names_[id]; }
    223   static int GetArgumentsCount(JavaScript id) { return javascript_argc_[id]; }
    224   static Handle<Code> GetCode(JavaScript id, bool* resolved);
    225   static int NumberOfJavaScriptBuiltins() { return id_count; }
    226 
    227  private:
    228   // The external C++ functions called from the code.
    229   static Address c_functions_[cfunction_count];
    230 
    231   // Note: These are always Code objects, but to conform with
    232   // IterateBuiltins() above which assumes Object**'s for the callback
    233   // function f, we use an Object* array here.
    234   static Object* builtins_[builtin_count];
    235   static const char* names_[builtin_count];
    236   static const char* javascript_names_[id_count];
    237   static int javascript_argc_[id_count];
    238 
    239   static void Generate_Adaptor(MacroAssembler* masm,
    240                                CFunctionId id,
    241                                BuiltinExtraArguments extra_args);
    242   static void Generate_JSConstructCall(MacroAssembler* masm);
    243   static void Generate_JSConstructStubGeneric(MacroAssembler* masm);
    244   static void Generate_JSConstructStubApi(MacroAssembler* masm);
    245   static void Generate_JSEntryTrampoline(MacroAssembler* masm);
    246   static void Generate_JSConstructEntryTrampoline(MacroAssembler* masm);
    247   static void Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm);
    248 
    249   static void Generate_FunctionCall(MacroAssembler* masm);
    250   static void Generate_FunctionApply(MacroAssembler* masm);
    251 
    252   static void Generate_ArrayCode(MacroAssembler* masm);
    253   static void Generate_ArrayConstructCode(MacroAssembler* masm);
    254 };
    255 
    256 } }  // namespace v8::internal
    257 
    258 #endif  // V8_BUILTINS_H_
    259