builtins.h revision 756813857a4c2a4d8ad2e805969d5768d3cf43a0
1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2006-2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_BUILTINS_H_
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_BUILTINS_H_
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
34e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// Specifies extra arguments required by a C++ builtin.
35e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkeenum BuiltinExtraArguments {
36e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  NO_EXTRA_ARGUMENTS = 0,
37e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  NEEDS_CALLED_FUNCTION = 1
38e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke};
39e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
40e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
41e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// Define list of builtins implemented in C++.
42e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke#define BUILTIN_LIST_C(V)                                           \
43e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  V(Illegal, NO_EXTRA_ARGUMENTS)                                    \
44e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke                                                                    \
45e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  V(EmptyFunction, NO_EXTRA_ARGUMENTS)                              \
46e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke                                                                    \
47e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  V(ArrayCodeGeneric, NO_EXTRA_ARGUMENTS)                           \
48e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke                                                                    \
49e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  V(ArrayPush, NO_EXTRA_ARGUMENTS)                                  \
50e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  V(ArrayPop, NO_EXTRA_ARGUMENTS)                                   \
51402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  V(ArrayShift, NO_EXTRA_ARGUMENTS)                                 \
52402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  V(ArrayUnshift, NO_EXTRA_ARGUMENTS)                               \
53402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  V(ArraySlice, NO_EXTRA_ARGUMENTS)                                 \
54402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  V(ArraySplice, NO_EXTRA_ARGUMENTS)                                \
556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(ArrayConcat, NO_EXTRA_ARGUMENTS)                                \
56e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke                                                                    \
57e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  V(HandleApiCall, NEEDS_CALLED_FUNCTION)                           \
58402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  V(FastHandleApiCall, NO_EXTRA_ARGUMENTS)                          \
59e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  V(HandleApiCallConstruct, NEEDS_CALLED_FUNCTION)                  \
60e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  V(HandleApiCallAsFunction, NO_EXTRA_ARGUMENTS)                    \
61e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  V(HandleApiCallAsConstructor, NO_EXTRA_ARGUMENTS)
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Define list of builtins implemented in assembly.
653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block#define BUILTIN_LIST_A(V)                                                 \
663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(ArgumentsAdaptorTrampoline, BUILTIN, UNINITIALIZED)                   \
673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(JSConstructCall,            BUILTIN, UNINITIALIZED)                   \
683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(JSConstructStubGeneric,     BUILTIN, UNINITIALIZED)                   \
69e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  V(JSConstructStubApi,         BUILTIN, UNINITIALIZED)                   \
703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(JSEntryTrampoline,          BUILTIN, UNINITIALIZED)                   \
713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(JSConstructEntryTrampoline, BUILTIN, UNINITIALIZED)                   \
72756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  V(LazyCompile,                BUILTIN, UNINITIALIZED)                   \
733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block                                                                          \
743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(LoadIC_Miss,                BUILTIN, UNINITIALIZED)                   \
753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedLoadIC_Miss,           BUILTIN, UNINITIALIZED)                   \
763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(StoreIC_Miss,               BUILTIN, UNINITIALIZED)                   \
773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedStoreIC_Miss,          BUILTIN, UNINITIALIZED)                   \
783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block                                                                          \
793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(LoadIC_Initialize,          LOAD_IC, UNINITIALIZED)                   \
803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(LoadIC_PreMonomorphic,      LOAD_IC, PREMONOMORPHIC)                  \
813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(LoadIC_Normal,              LOAD_IC, MONOMORPHIC)                     \
823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(LoadIC_ArrayLength,         LOAD_IC, MONOMORPHIC)                     \
833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(LoadIC_StringLength,        LOAD_IC, MONOMORPHIC)                     \
843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(LoadIC_FunctionPrototype,   LOAD_IC, MONOMORPHIC)                     \
853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(LoadIC_Megamorphic,         LOAD_IC, MEGAMORPHIC)                     \
863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block                                                                          \
873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedLoadIC_Initialize,     KEYED_LOAD_IC, UNINITIALIZED)             \
883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedLoadIC_PreMonomorphic, KEYED_LOAD_IC, PREMONOMORPHIC)            \
893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedLoadIC_Generic,        KEYED_LOAD_IC, MEGAMORPHIC)               \
90e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  V(KeyedLoadIC_String,         KEYED_LOAD_IC, MEGAMORPHIC)               \
913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedLoadIC_ExternalByteArray,          KEYED_LOAD_IC, MEGAMORPHIC)   \
923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedLoadIC_ExternalUnsignedByteArray,  KEYED_LOAD_IC, MEGAMORPHIC)   \
933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedLoadIC_ExternalShortArray,         KEYED_LOAD_IC, MEGAMORPHIC)   \
943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedLoadIC_ExternalUnsignedShortArray, KEYED_LOAD_IC, MEGAMORPHIC)   \
953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedLoadIC_ExternalIntArray,           KEYED_LOAD_IC, MEGAMORPHIC)   \
963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedLoadIC_ExternalUnsignedIntArray,   KEYED_LOAD_IC, MEGAMORPHIC)   \
973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedLoadIC_ExternalFloatArray,         KEYED_LOAD_IC, MEGAMORPHIC)   \
98402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  V(KeyedLoadIC_IndexedInterceptor,         KEYED_LOAD_IC, MEGAMORPHIC)   \
993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block                                                                          \
1003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(StoreIC_Initialize,         STORE_IC, UNINITIALIZED)                  \
1016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(StoreIC_ArrayLength,        STORE_IC, MONOMORPHIC)                    \
1028defd9ff6930b4e24729971a61cf7469daf119beSteve Block  V(StoreIC_Normal,             STORE_IC, MONOMORPHIC)                    \
1033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(StoreIC_Megamorphic,        STORE_IC, MEGAMORPHIC)                    \
1043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block                                                                          \
1053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedStoreIC_Initialize,    KEYED_STORE_IC, UNINITIALIZED)            \
1063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedStoreIC_Generic,       KEYED_STORE_IC, MEGAMORPHIC)              \
1073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedStoreIC_ExternalByteArray,          KEYED_STORE_IC, MEGAMORPHIC) \
1083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedStoreIC_ExternalUnsignedByteArray,  KEYED_STORE_IC, MEGAMORPHIC) \
1093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedStoreIC_ExternalShortArray,         KEYED_STORE_IC, MEGAMORPHIC) \
1103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedStoreIC_ExternalUnsignedShortArray, KEYED_STORE_IC, MEGAMORPHIC) \
1113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedStoreIC_ExternalIntArray,           KEYED_STORE_IC, MEGAMORPHIC) \
1123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedStoreIC_ExternalUnsignedIntArray,   KEYED_STORE_IC, MEGAMORPHIC) \
1133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(KeyedStoreIC_ExternalFloatArray,         KEYED_STORE_IC, MEGAMORPHIC) \
1143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block                                                                          \
1153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  /* Uses KeyedLoadIC_Initialize; must be after in list. */               \
1163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(FunctionCall,               BUILTIN, UNINITIALIZED)                   \
1173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(FunctionApply,              BUILTIN, UNINITIALIZED)                   \
1183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block                                                                          \
1193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  V(ArrayCode,                  BUILTIN, UNINITIALIZED)                   \
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(ArrayConstructCode,         BUILTIN, UNINITIALIZED)
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Define list of builtins used by the debugger implemented in assembly.
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BUILTIN_LIST_DEBUG_A(V)                                \
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(Return_DebugBreak,          BUILTIN, DEBUG_BREAK)          \
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(ConstructCall_DebugBreak,   BUILTIN, DEBUG_BREAK)          \
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(StubNoRegisters_DebugBreak, BUILTIN, DEBUG_BREAK)          \
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(LoadIC_DebugBreak,          LOAD_IC, DEBUG_BREAK)          \
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(KeyedLoadIC_DebugBreak,     KEYED_LOAD_IC, DEBUG_BREAK)    \
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(StoreIC_DebugBreak,         STORE_IC, DEBUG_BREAK)         \
1316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(KeyedStoreIC_DebugBreak,    KEYED_STORE_IC, DEBUG_BREAK)   \
1327f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  V(Slot_DebugBreak,            BUILTIN, DEBUG_BREAK)          \
1336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(PlainReturn_LiveEdit,       BUILTIN, DEBUG_BREAK)          \
1346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(FrameDropper_LiveEdit,      BUILTIN, DEBUG_BREAK)
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BUILTIN_LIST_DEBUG_A(V)
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Define list of builtins implemented in JavaScript.
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BUILTINS_LIST_JS(V)              \
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(EQUALS, 1)                           \
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(STRICT_EQUALS, 1)                    \
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(COMPARE, 2)                          \
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(ADD, 1)                              \
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(SUB, 1)                              \
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(MUL, 1)                              \
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(DIV, 1)                              \
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(MOD, 1)                              \
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(BIT_OR, 1)                           \
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(BIT_AND, 1)                          \
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(BIT_XOR, 1)                          \
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(UNARY_MINUS, 0)                      \
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(BIT_NOT, 0)                          \
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(SHL, 1)                              \
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(SAR, 1)                              \
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(SHR, 1)                              \
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(DELETE, 1)                           \
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(IN, 1)                               \
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(INSTANCE_OF, 1)                      \
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(GET_KEYS, 0)                         \
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(FILTER_KEY, 1)                       \
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(CALL_NON_FUNCTION, 0)                \
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(CALL_NON_FUNCTION_AS_CONSTRUCTOR, 0) \
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(TO_OBJECT, 0)                        \
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(TO_NUMBER, 0)                        \
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(TO_STRING, 0)                        \
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(STRING_ADD_LEFT, 1)                  \
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(STRING_ADD_RIGHT, 1)                 \
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V(APPLY_PREPARE, 1)                    \
1706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(APPLY_OVERFLOW, 1)
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ObjectVisitor;
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Builtins : public AllStatic {
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Generate all builtin code objects. Should be called once during
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // VM initialization.
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void Setup(bool create_heap_objects);
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void TearDown();
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Garbage collection support.
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void IterateBuiltins(ObjectVisitor* v);
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Disassembler support.
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const char* Lookup(byte* pc);
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  enum Name {
190e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke#define DEF_ENUM_C(name, ignore) name,
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define DEF_ENUM_A(name, kind, state) name,
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    BUILTIN_LIST_C(DEF_ENUM_C)
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    BUILTIN_LIST_A(DEF_ENUM_A)
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    BUILTIN_LIST_DEBUG_A(DEF_ENUM_A)
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DEF_ENUM_C
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DEF_ENUM_A
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    builtin_count
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  enum CFunctionId {
201e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke#define DEF_ENUM_C(name, ignore) c_##name,
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    BUILTIN_LIST_C(DEF_ENUM_C)
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DEF_ENUM_C
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    cfunction_count
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  enum JavaScript {
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define DEF_ENUM(name, ignore) name,
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    BUILTINS_LIST_JS(DEF_ENUM)
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DEF_ENUM
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    id_count
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static Code* builtin(Name name) {
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Code::cast cannot be used here since we access builtins
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // during the marking phase of mark sweep. See IC::Clear.
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return reinterpret_cast<Code*>(builtins_[name]);
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static Address builtin_address(Name name) {
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return reinterpret_cast<Address>(&builtins_[name]);
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static Address c_function_address(CFunctionId id) {
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return c_functions_[id];
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const char* GetName(JavaScript id) { return javascript_names_[id]; }
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static int GetArgumentsCount(JavaScript id) { return javascript_argc_[id]; }
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static Handle<Code> GetCode(JavaScript id, bool* resolved);
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static int NumberOfJavaScriptBuiltins() { return id_count; }
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The external C++ functions called from the code.
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static Address c_functions_[cfunction_count];
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Note: These are always Code objects, but to conform with
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // IterateBuiltins() above which assumes Object**'s for the callback
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // function f, we use an Object* array here.
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static Object* builtins_[builtin_count];
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const char* names_[builtin_count];
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const char* javascript_names_[id_count];
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static int javascript_argc_[id_count];
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
245e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  static void Generate_Adaptor(MacroAssembler* masm,
246e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke                               CFunctionId id,
247e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke                               BuiltinExtraArguments extra_args);
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void Generate_JSConstructCall(MacroAssembler* masm);
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void Generate_JSConstructStubGeneric(MacroAssembler* masm);
250e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  static void Generate_JSConstructStubApi(MacroAssembler* masm);
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void Generate_JSEntryTrampoline(MacroAssembler* masm);
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void Generate_JSConstructEntryTrampoline(MacroAssembler* masm);
253756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  static void Generate_LazyCompile(MacroAssembler* masm);
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm);
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void Generate_FunctionCall(MacroAssembler* masm);
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void Generate_FunctionApply(MacroAssembler* masm);
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void Generate_ArrayCode(MacroAssembler* masm);
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static void Generate_ArrayConstructCode(MacroAssembler* masm);
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_BUILTINS_H_
266