| Index: include/v8.h
|
| diff --git a/include/v8.h b/include/v8.h
|
| index edba8eaece01ae12955c89426ef8c57edf7a973d..1aff704a7599873f1e8ede14c5751226dbd9f457 100644
|
| --- a/include/v8.h
|
| +++ b/include/v8.h
|
| @@ -468,6 +468,16 @@ class WeakCallbackInfo {
|
| enum class WeakCallbackType { kParameter, kInternalFields, kFinalizer };
|
|
|
| /**
|
| + * A reporter class that embedder will use to report reachable references found
|
| + * by EmbedderHeapTracer.
|
| + */
|
| +class V8_EXPORT EmbedderReachableReferenceReporter {
|
| + public:
|
| + virtual void ReportExternalReference(Value* object) = 0;
|
| + virtual ~EmbedderReachableReferenceReporter() = default;
|
| +};
|
| +
|
| +/**
|
| * An object reference that is independent of any handle scope. Where
|
| * a Local handle only lives as long as the HandleScope in which it was
|
| * allocated, a PersistentBase handle remains valid until it is explicitly
|
| @@ -564,11 +574,18 @@ template <class T> class PersistentBase {
|
| V8_INLINE void ClearWeak() { ClearWeak<void>(); }
|
|
|
| /**
|
| + * Deprecated.
|
| + * TODO(hlopko): remove once migration to reporter is finished.
|
| + */
|
| + V8_INLINE void RegisterExternalReference(Isolate* isolate) const {}
|
| +
|
| + /**
|
| * Allows the embedder to tell the v8 garbage collector that a certain object
|
| * is alive. Only allowed when the embedder is asked to trace its heap by
|
| * EmbedderHeapTracer.
|
| */
|
| - V8_INLINE void RegisterExternalReference(Isolate* isolate) const;
|
| + V8_INLINE void RegisterExternalReference(
|
| + EmbedderReachableReferenceReporter* reporter) const;
|
|
|
| /**
|
| * Marks the reference to this object independent. Garbage collector is free
|
| @@ -6074,8 +6091,8 @@ enum class MemoryPressureLevel { kNone, kModerate, kCritical };
|
| * Interface for tracing through the embedder heap. During the v8 garbage
|
| * collection, v8 collects hidden fields of all potential wrappers, and at the
|
| * end of its marking phase iterates the collection and asks the embedder to
|
| - * trace through its heap and call PersistentBase::RegisterExternalReference on
|
| - * each js object reachable from any of the given wrappers.
|
| + * trace through its heap and use reporter to report each js object reachable
|
| + * from any of the given wrappers.
|
| *
|
| * Before the first call to the TraceWrappersFrom function TracePrologue will be
|
| * called. When the garbage collection cycle is finished, TraceEpilogue will be
|
| @@ -6101,14 +6118,21 @@ class V8_EXPORT EmbedderHeapTracer {
|
| const std::vector<std::pair<void*, void*> >& internal_fields) = 0;
|
|
|
| /**
|
| - * V8 will call this method at the beginning of a GC cycle.
|
| + * Deprecated.
|
| + * TODO(hlopko) Remove once the migration to reporter is finished.
|
| + */
|
| + virtual void TracePrologue() {}
|
| +
|
| + /**
|
| + * V8 will call this method at the beginning of a GC cycle. Embedder is
|
| + * expected to use EmbedderReachableReferenceReporter for reporting all
|
| + * reachable v8 objects.
|
| */
|
| - virtual void TracePrologue() = 0;
|
| + virtual void TracePrologue(EmbedderReachableReferenceReporter* reporter) {}
|
|
|
| /**
|
| * Embedder is expected to trace its heap starting from wrappers reported by
|
| - * RegisterV8References method, and call
|
| - * PersistentBase::RegisterExternalReference() on all reachable wrappers.
|
| + * RegisterV8References method, and use reporter for all reachable wrappers.
|
| * Embedder is expected to stop tracing by the given deadline.
|
| *
|
| * Returns true if there is still work to do.
|
| @@ -7425,8 +7449,6 @@ class V8_EXPORT V8 {
|
| int* index);
|
| static Local<Value> GetEternal(Isolate* isolate, int index);
|
|
|
| - static void RegisterExternallyReferencedObject(internal::Object** object,
|
| - internal::Isolate* isolate);
|
| template <class K, class V, class T>
|
| friend class PersistentValueMapBase;
|
|
|
| @@ -8487,11 +8509,10 @@ P* PersistentBase<T>::ClearWeak() {
|
| }
|
|
|
| template <class T>
|
| -void PersistentBase<T>::RegisterExternalReference(Isolate* isolate) const {
|
| +void PersistentBase<T>::RegisterExternalReference(
|
| + EmbedderReachableReferenceReporter* reporter) const {
|
| if (IsEmpty()) return;
|
| - V8::RegisterExternallyReferencedObject(
|
| - reinterpret_cast<internal::Object**>(this->val_),
|
| - reinterpret_cast<internal::Isolate*>(isolate));
|
| + reporter->ReportExternalReference(this->val_);
|
| }
|
|
|
| template <class T>
|
|
|