diff --git a/src/ast.cc b/src/ast.cc index 91f4d9aabd..6af15258a2 100644 --- a/src/ast.cc +++ b/src/ast.cc @@ -897,8 +897,6 @@ FOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE) FOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE) #undef MAKE_TYPE_CASE -RegExpEmpty RegExpEmpty::kInstance; - static Interval ListCaptureRegisters(ZoneList* children) { Interval result = Interval::Empty(); diff --git a/src/ast.h b/src/ast.h index ab300db7fb..c2d9412a90 100644 --- a/src/ast.h +++ b/src/ast.h @@ -2131,9 +2131,10 @@ class RegExpEmpty: public RegExpTree { virtual bool IsEmpty(); virtual int min_match() { return 0; } virtual int max_match() { return 0; } - static RegExpEmpty* GetInstance() { return &kInstance; } - private: - static RegExpEmpty kInstance; + static RegExpEmpty* GetInstance() { + static RegExpEmpty* instance = ::new RegExpEmpty(); + return instance; + } }; diff --git a/src/elements.cc b/src/elements.cc index 1d50099bca..4376df62c6 100644 --- a/src/elements.cc +++ b/src/elements.cc @@ -801,42 +801,45 @@ ElementsAccessor* ElementsAccessor::ForArray(FixedArrayBase* array) { void ElementsAccessor::InitializeOncePerProcess() { + // First argument in list is the accessor class, the second argument is can + // be any arbitrary unique identifier, in this case chosen to be the + // corresponding enum. Use the fast element handler for smi-only arrays. + // The implementation is currently identical. Note that the order must match + // that of the ElementsKind enum for the |accessor_array[]| below to work. +#define ELEMENTS_LIST(V) \ + V(FastObjectElementsAccessor, FAST_SMI_ONLY_ELEMENTS) \ + V(FastObjectElementsAccessor, FAST_ELEMENTS) \ + V(FastDoubleElementsAccessor, FAST_DOUBLE_ELEMENTS) \ + V(DictionaryElementsAccessor, DICTIONARY_ELEMENTS) \ + V(NonStrictArgumentsElementsAccessor, NON_STRICT_ARGUMENTS_ELEMENTS) \ + V(ExternalByteElementsAccessor, EXTERNAL_BYTE_ELEMENTS) \ + V(ExternalUnsignedByteElementsAccessor, EXTERNAL_UNSIGNED_BYTE_ELEMENTS) \ + V(ExternalShortElementsAccessor, EXTERNAL_SHORT_ELEMENTS) \ + V(ExternalUnsignedShortElementsAccessor, EXTERNAL_UNSIGNED_SHORT_ELEMENTS) \ + V(ExternalIntElementsAccessor, EXTERNAL_INT_ELEMENTS) \ + V(ExternalUnsignedIntElementsAccessor, EXTERNAL_UNSIGNED_INT_ELEMENTS) \ + V(ExternalFloatElementsAccessor, EXTERNAL_FLOAT_ELEMENTS) \ + V(ExternalDoubleElementsAccessor, EXTERNAL_DOUBLE_ELEMENTS) \ + V(PixelElementsAccessor, EXTERNAL_PIXEL_ELEMENTS) + static struct ConcreteElementsAccessors { - // Use the fast element handler for smi-only arrays. The implementation is - // currently identical. - FastObjectElementsAccessor fast_smi_elements_handler; - FastObjectElementsAccessor fast_elements_handler; - FastDoubleElementsAccessor fast_double_elements_handler; - DictionaryElementsAccessor dictionary_elements_handler; - NonStrictArgumentsElementsAccessor non_strict_arguments_elements_handler; - ExternalByteElementsAccessor byte_elements_handler; - ExternalUnsignedByteElementsAccessor unsigned_byte_elements_handler; - ExternalShortElementsAccessor short_elements_handler; - ExternalUnsignedShortElementsAccessor unsigned_short_elements_handler; - ExternalIntElementsAccessor int_elements_handler; - ExternalUnsignedIntElementsAccessor unsigned_int_elements_handler; - ExternalFloatElementsAccessor float_elements_handler; - ExternalDoubleElementsAccessor double_elements_handler; - PixelElementsAccessor pixel_elements_handler; - } element_accessors; +#define ACCESSOR_STRUCT(Class, Name) Class* Name##_handler; + ELEMENTS_LIST(ACCESSOR_STRUCT) +#undef ACCESSOR_STRUCT + } element_accessors = { +#define ACCESSOR_INIT(Class, Name) ::new Class(), + ELEMENTS_LIST(ACCESSOR_INIT) +#undef ACCESSOR_INIT + }; static ElementsAccessor* accessor_array[] = { - &element_accessors.fast_smi_elements_handler, - &element_accessors.fast_elements_handler, - &element_accessors.fast_double_elements_handler, - &element_accessors.dictionary_elements_handler, - &element_accessors.non_strict_arguments_elements_handler, - &element_accessors.byte_elements_handler, - &element_accessors.unsigned_byte_elements_handler, - &element_accessors.short_elements_handler, - &element_accessors.unsigned_short_elements_handler, - &element_accessors.int_elements_handler, - &element_accessors.unsigned_int_elements_handler, - &element_accessors.float_elements_handler, - &element_accessors.double_elements_handler, - &element_accessors.pixel_elements_handler +#define ACCESSOR_ARRAY(Class, Name) element_accessors.Name##_handler, + ELEMENTS_LIST(ACCESSOR_ARRAY) +#undef ACCESSOR_ARRAY }; +#undef ELEMENTS_LIST + STATIC_ASSERT((sizeof(accessor_array) / sizeof(*accessor_array)) == kElementsKindCount); diff --git a/src/extensions/gc-extension.cc b/src/extensions/gc-extension.cc index 48e8c42057..238e305f3d 100644 --- a/src/extensions/gc-extension.cc +++ b/src/extensions/gc-extension.cc @@ -46,8 +46,8 @@ v8::Handle GCExtension::GC(const v8::Arguments& args) { void GCExtension::Register() { - static GCExtension gc_extension; - static v8::DeclareExtension gc_extension_declaration(&gc_extension); + static GCExtension* gc_extension = ::new GCExtension(); + static v8::DeclareExtension gc_extension_declaration(gc_extension); } } } // namespace v8::internal diff --git a/src/hashmap.cc b/src/hashmap.cc index 37748a34f8..0b404a97e1 100644 --- a/src/hashmap.cc +++ b/src/hashmap.cc @@ -36,7 +36,7 @@ namespace v8 { namespace internal { -Allocator HashMap::DefaultAllocator; +Allocator* HashMap::DefaultAllocator = ::new Allocator(); HashMap::HashMap(MatchFun match, diff --git a/src/hashmap.h b/src/hashmap.h index 4e6a454a3c..d2d1fafa32 100644 --- a/src/hashmap.h +++ b/src/hashmap.h @@ -46,14 +46,14 @@ class Allocator BASE_EMBEDDED { class HashMap { public: - static Allocator DefaultAllocator; + static Allocator* DefaultAllocator; typedef bool (*MatchFun) (void* key1, void* key2); // initial_capacity is the size of the initial hash map; // it must be a power of 2 (and thus must not be 0). explicit HashMap(MatchFun match, - Allocator* allocator = &DefaultAllocator, + Allocator* allocator = DefaultAllocator, uint32_t initial_capacity = 8); ~HashMap(); diff --git a/src/parser.h b/src/parser.h index 1436bf9066..5e2c27a90f 100644 --- a/src/parser.h +++ b/src/parser.h @@ -681,8 +681,9 @@ class Parser { // Factory methods. Statement* EmptyStatement() { - static v8::internal::EmptyStatement empty; - return ∅ + static v8::internal::EmptyStatement* empty = + ::new v8::internal::EmptyStatement(); + return empty; } Scope* NewScope(Scope* parent, ScopeType type); diff --git a/src/scopes.cc b/src/scopes.cc index f9cd620653..60ea20f16d 100644 --- a/src/scopes.cc +++ b/src/scopes.cc @@ -55,7 +55,7 @@ class ZoneAllocator: public Allocator { }; -static ZoneAllocator LocalsMapAllocator; +static ZoneAllocator* LocalsMapAllocator = ::new ZoneAllocator(); // ---------------------------------------------------------------------------- @@ -76,7 +76,7 @@ static bool Match(void* key1, void* key2) { } -VariableMap::VariableMap() : HashMap(Match, &LocalsMapAllocator, 8) {} +VariableMap::VariableMap() : HashMap(Match, LocalsMapAllocator, 8) {} VariableMap::~VariableMap() {}