Revision: 10025
Author: [email protected]
Date: Fri Nov 18 00:59:33 2011
Log: Removing exit time destructors by leaking static members.
Note that some cctests and d8 still contain statical members with exit time
destructors.
BUG=v8:1828
Review URL: http://codereview.chromium.org/8586025
http://code.google.com/p/v8/source/detail?r=10025
Modified:
/branches/bleeding_edge/src/ast.cc
/branches/bleeding_edge/src/ast.h
/branches/bleeding_edge/src/elements.cc
/branches/bleeding_edge/src/extensions/gc-extension.cc
/branches/bleeding_edge/src/hashmap.cc
/branches/bleeding_edge/src/hashmap.h
/branches/bleeding_edge/src/parser.h
/branches/bleeding_edge/src/scopes.cc
=======================================
--- /branches/bleeding_edge/src/ast.cc Thu Nov 17 05:57:55 2011
+++ /branches/bleeding_edge/src/ast.cc Fri Nov 18 00:59:33 2011
@@ -897,8 +897,6 @@
FOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE)
#undef MAKE_TYPE_CASE
-RegExpEmpty RegExpEmpty::kInstance;
-
static Interval ListCaptureRegisters(ZoneList<RegExpTree*>* children) {
Interval result = Interval::Empty();
=======================================
--- /branches/bleeding_edge/src/ast.h Thu Nov 17 05:57:55 2011
+++ /branches/bleeding_edge/src/ast.h Fri Nov 18 00:59:33 2011
@@ -2131,9 +2131,10 @@
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;
+ }
};
=======================================
--- /branches/bleeding_edge/src/elements.cc Tue Nov 8 03:59:56 2011
+++ /branches/bleeding_edge/src/elements.cc Fri Nov 18 00:59:33 2011
@@ -801,42 +801,45 @@
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);
=======================================
--- /branches/bleeding_edge/src/extensions/gc-extension.cc Mon Sep 19
11:36:47 2011
+++ /branches/bleeding_edge/src/extensions/gc-extension.cc Fri Nov 18
00:59:33 2011
@@ -46,8 +46,8 @@
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
=======================================
--- /branches/bleeding_edge/src/hashmap.cc Wed Nov 2 01:32:40 2011
+++ /branches/bleeding_edge/src/hashmap.cc Fri Nov 18 00:59:33 2011
@@ -36,7 +36,7 @@
namespace v8 {
namespace internal {
-Allocator HashMap::DefaultAllocator;
+Allocator* HashMap::DefaultAllocator = ::new Allocator();
HashMap::HashMap(MatchFun match,
=======================================
--- /branches/bleeding_edge/src/hashmap.h Wed Nov 2 01:32:40 2011
+++ /branches/bleeding_edge/src/hashmap.h Fri Nov 18 00:59:33 2011
@@ -46,14 +46,14 @@
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();
=======================================
--- /branches/bleeding_edge/src/parser.h Tue Nov 15 05:48:40 2011
+++ /branches/bleeding_edge/src/parser.h Fri Nov 18 00:59:33 2011
@@ -681,8 +681,9 @@
// 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);
=======================================
--- /branches/bleeding_edge/src/scopes.cc Tue Nov 15 05:48:40 2011
+++ /branches/bleeding_edge/src/scopes.cc Fri Nov 18 00:59:33 2011
@@ -55,7 +55,7 @@
};
-static ZoneAllocator LocalsMapAllocator;
+static ZoneAllocator* LocalsMapAllocator = ::new ZoneAllocator();
//
----------------------------------------------------------------------------
@@ -76,7 +76,7 @@
}
-VariableMap::VariableMap() : HashMap(Match, &LocalsMapAllocator, 8) {}
+VariableMap::VariableMap() : HashMap(Match, LocalsMapAllocator, 8) {}
VariableMap::~VariableMap() {}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev