Index: src/builtins.h |
=================================================================== |
--- src/builtins.h (revision 3427) |
+++ src/builtins.h (working copy) |
@@ -152,9 +152,43 @@ |
class ObjectVisitor; |
+class BuiltinTypes { |
+ public: |
+ enum Name { |
+ #define DEF_ENUM_C(name) name, |
+ #define DEF_ENUM_A(name, kind, state) name, |
+ BUILTIN_LIST_C(DEF_ENUM_C) |
+ BUILTIN_LIST_A(DEF_ENUM_A) |
+ BUILTIN_LIST_DEBUG_A(DEF_ENUM_A) |
+ #undef DEF_ENUM_C |
+ #undef DEF_ENUM_A |
+ builtin_count |
+ }; |
+}; |
-class Builtins : public AllStatic { |
+class BuiltinsData: public BuiltinTypes { |
public: |
+ // TODO(1238487): This is a nasty hack. We need to improve the way we |
+ // call builtins considerable to get rid of this and the hairy macros |
+ // in builtins.cc. |
+ Object* builtin_passed_function_; |
+ private: |
+ // Note: These are always Code objects, but to conform with |
+ // IterateBuiltins() above which assumes Object**'s for the callback |
+ // function f, we use an Object* array here. |
+ Object* builtins_[builtin_count]; |
+ const char* names_[builtin_count]; |
+ bool is_initialized_; |
+ |
+ friend class V8Context; |
+ friend class Builtins; |
+ |
+ BuiltinsData(); |
+ DISALLOW_COPY_AND_ASSIGN(BuiltinsData); |
+}; |
+ |
+class Builtins : public AllStatic, public BuiltinTypes { |
+ public: |
// Generate all builtin code objects. Should be called once during |
// VM initialization. |
static void Setup(bool create_heap_objects); |
@@ -166,17 +200,6 @@ |
// Disassembler support. |
static const char* Lookup(byte* pc); |
- enum Name { |
-#define DEF_ENUM_C(name) name, |
-#define DEF_ENUM_A(name, kind, state) name, |
- BUILTIN_LIST_C(DEF_ENUM_C) |
- BUILTIN_LIST_A(DEF_ENUM_A) |
- BUILTIN_LIST_DEBUG_A(DEF_ENUM_A) |
-#undef DEF_ENUM_C |
-#undef DEF_ENUM_A |
- builtin_count |
- }; |
- |
enum CFunctionId { |
#define DEF_ENUM_C(name) c_##name, |
BUILTIN_LIST_C(DEF_ENUM_C) |
@@ -194,11 +217,13 @@ |
static Code* builtin(Name name) { |
// Code::cast cannot be used here since we access builtins |
// during the marking phase of mark sweep. See IC::Clear. |
- return reinterpret_cast<Code*>(builtins_[name]); |
+ return reinterpret_cast<Code*>( |
+ v8_context()->builtins_data_.builtins_[name]); |
} |
static Address builtin_address(Name name) { |
- return reinterpret_cast<Address>(&builtins_[name]); |
+ return reinterpret_cast<Address>( |
+ &v8_context()->builtins_data_.builtins_[name]); |
} |
static Address c_function_address(CFunctionId id) { |
@@ -210,17 +235,11 @@ |
static Handle<Code> GetCode(JavaScript id, bool* resolved); |
static int NumberOfJavaScriptBuiltins() { return id_count; } |
- static Object* builtin_passed_function; |
private: |
// The external C++ functions called from the code. |
static Address c_functions_[cfunction_count]; |
- // Note: These are always Code objects, but to conform with |
- // IterateBuiltins() above which assumes Object**'s for the callback |
- // function f, we use an Object* array here. |
- static Object* builtins_[builtin_count]; |
- static const char* names_[builtin_count]; |
static const char* javascript_names_[id_count]; |
static int javascript_argc_[id_count]; |