Index: src/global-handles.h |
diff --git a/src/global-handles.h b/src/global-handles.h |
index cd75133a24367092ec07e87bd9fc451a8a9e9d64..5a4ad13e2f59c3b8342a6b03328f2336f4bcb06f 100644 |
--- a/src/global-handles.h |
+++ b/src/global-handles.h |
@@ -31,6 +31,7 @@ |
#include "../include/v8.h" |
#include "../include/v8-profiler.h" |
+#include "handles.h" |
#include "list.h" |
#include "v8utils.h" |
@@ -331,6 +332,76 @@ class GlobalHandles { |
}; |
+class EternalHandles { |
+ public: |
+ enum SingletonHandle { |
+ I18N_TEMPLATE_ONE, |
+ I18N_TEMPLATE_TWO, |
+ |
+ NUMBER_OF_SINGLETON_HANDLES |
+ }; |
+ |
+ EternalHandles(); |
+ ~EternalHandles(); |
+ |
+ int NumberOfHandles() { return size_; } |
+ |
+ // Create an EternalHandle, returning the index. |
+ int Create(Isolate* isolate, Object* object); |
+ |
+ // Grab the handle for an existing EternalHandle. |
+ inline Handle<Object> Get(int index) { |
+ return Handle<Object>(GetLocation(index)); |
+ } |
+ |
+ // Grab the handle for an existing SingletonHandle. |
+ inline Handle<Object> GetSingleton(SingletonHandle singleton) { |
+ ASSERT(Exists(singleton)); |
+ return Get(singleton_handles_[singleton]); |
+ } |
+ |
+ // Checks whether a SingletonHandle has been assigned. |
+ inline bool Exists(SingletonHandle singleton) { |
+ return singleton_handles_[singleton] != kInvalidIndex; |
+ } |
+ |
+ // Assign a SingletonHandle to an empty slot and returns the handle. |
+ Handle<Object> CreateSingleton(Isolate* isolate, |
+ Object* object, |
+ SingletonHandle singleton) { |
+ ASSERT(singleton_handles_[singleton] == kInvalidIndex); |
+ singleton_handles_[singleton] = Create(isolate, object); |
+ return Get(singleton_handles_[singleton]); |
+ } |
+ |
+ // Iterates over all handles. |
+ void IterateAllRoots(ObjectVisitor* visitor); |
+ // Iterates over all handles which might be in new space. |
+ void IterateNewSpaceRoots(ObjectVisitor* visitor); |
+ // Rebuilds new space list. |
+ void PostGarbageCollectionProcessing(Heap* heap); |
+ |
+ private: |
+ static const int kInvalidIndex = -1; |
+ static const int kShift = 8; |
+ static const int kSize = 1 << kShift; |
+ static const int kMask = 0xff; |
+ |
+ // Gets the slot for an index |
+ inline Object** GetLocation(int index) { |
+ ASSERT(index >= 0 && index < size_); |
+ return &blocks_[index >> kShift][index & kMask]; |
+ } |
+ |
+ int size_; |
+ List<Object**> blocks_; |
+ List<int> new_space_indices_; |
+ int singleton_handles_[NUMBER_OF_SINGLETON_HANDLES]; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(EternalHandles); |
+}; |
+ |
+ |
} } // namespace v8::internal |
#endif // V8_GLOBAL_HANDLES_H_ |