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