Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(197)

Unified Diff: src/global-handles.h

Issue 753553002: Phantom references support internal fields (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Queue up phantom callbacks during GC to dispatch later Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/global-handles.h
diff --git a/src/global-handles.h b/src/global-handles.h
index aacdcbc072d0ae26af7ce6264767d8366ee17f7a..7d70173e85b74f2e861df97375a5749fcd9a37ee 100644
--- a/src/global-handles.h
+++ b/src/global-handles.h
@@ -97,6 +97,24 @@ struct ObjectGroupRetainerInfo {
};
+class PendingPhantomCallback {
+ public:
+ typedef PhantomCallbackData<void>::Callback Callback;
+ typedef PhantomCallbackData<void> Data;
+ PendingPhantomCallback(Data data, Callback callback)
+ : data_(data),
+ callback_(callback) { }
+
+ void invoke() {
+ callback_(data_);
+ }
+
+ private:
+ PhantomCallbackData<void>::Callback callback_;
+ PhantomCallbackData<void> data_;
+};
+
+
class GlobalHandles {
public:
~GlobalHandles();
@@ -111,6 +129,7 @@ class GlobalHandles {
static void Destroy(Object** location);
typedef WeakCallbackData<v8::Value, void>::Callback WeakCallback;
+ typedef PhantomCallbackData<void>::Callback PhantomCallback;
// For a phantom weak reference, the callback does not have access to the
// dying object. Phantom weak references are preferred because they allow
@@ -127,9 +146,14 @@ class GlobalHandles {
// GC. For a phantom weak handle the handle is cleared (set to a Smi)
// before the callback is invoked, but the handle can still be identified
// in the callback by using the location() of the handle.
- static void MakeWeak(Object** location, void* parameter,
- WeakCallback weak_callback,
- PhantomState phantom = Nonphantom);
+ static void MakeWeak(
+ Object** location, void* parameter, WeakCallback weak_callback);
+
+ static void MakePhantom(
+ Object** location, void* parameter,
+ PhantomCallback weak_callback,
+ int16_t internal_field_index1 = v8::Object::kNoInternalFieldIndex,
+ int16_t internal_field_index2 = v8::Object::kNoInternalFieldIndex);
void RecordStats(HeapStats* stats);
@@ -145,6 +169,10 @@ class GlobalHandles {
return number_of_global_handles_;
}
+ // Collect up data for the weak handle callbacks after GC has completed, but
+ // before memory is reclaimed.
+ void CollectPhantomCallbackData();
+
// Clear the weakness of a global handle.
static void* ClearWeakness(Object** location);
@@ -270,6 +298,12 @@ class GlobalHandles {
// don't assign any initial capacity.
static const int kObjectGroupConnectionsCapacity = 20;
+ // Helpers for PostGarbageCollectionProcessing.
+ int PostScavengeProcessing(int initial_post_gc_processing_count);
+ int PostMarkSweepProcessing(int initial_post_gc_processing_count);
+ int DispatchPendingPhantomCallbacks();
+ void UpdateListOfNewSpaceNodes();
+
// Internal node structures.
class Node;
class NodeBlock;
@@ -306,6 +340,8 @@ class GlobalHandles {
List<ObjectGroupRetainerInfo> retainer_infos_;
List<ObjectGroupConnection> implicit_ref_connections_;
+ List<PendingPhantomCallback> pending_phantom_callbacks_;
+
friend class Isolate;
DISALLOW_COPY_AND_ASSIGN(GlobalHandles);

Powered by Google App Engine
This is Rietveld 408576698