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 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10025 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
f808f4ae7b
commit
6551e8d47d
@ -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<RegExpTree*>* children) {
|
||||
Interval result = Interval::Empty();
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -46,8 +46,8 @@ v8::Handle<v8::Value> 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
|
||||
|
@ -36,7 +36,7 @@
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
|
||||
Allocator HashMap::DefaultAllocator;
|
||||
Allocator* HashMap::DefaultAllocator = ::new Allocator();
|
||||
|
||||
|
||||
HashMap::HashMap(MatchFun match,
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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() {}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user