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 &empty;
+    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

Reply via email to