Commit 47d6ada7 authored by Michael Lippautz's avatar Michael Lippautz Committed by Commit Bot

bindings: Fix TraceWrapperV8Reference in HeapVector and ephemerons

- Allow TraceWrapperV8Reference in HeapVector (previously, the test
  would not compile)
- Fix usage of TraceWrapperV8Reference in ephemerons

Change-Id: I1430307a5c8692a7fa38fd4857be391c2a243a26
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1886857
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarJeremy Roman <jbroman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#710449}
parent e053db30
......@@ -197,4 +197,50 @@ TEST_F(TraceWrapperV8ReferenceTest, MoveOverNonEmpty) {
CHECK(observer1.IsEmpty());
}
TEST_F(TraceWrapperV8ReferenceTest, HeapVector) {
V8TestingScope testing_scope;
SetIsolate(testing_scope.GetIsolate());
using VectorContainer = HeapVector<TraceWrapperV8Reference<v8::Value>>;
Persistent<VectorContainer> holder(MakeGarbageCollected<VectorContainer>());
v8::Persistent<v8::Value> observer;
{
v8::HandleScope handle_scope(GetIsolate());
v8::Local<v8::Value> value = v8::Object::New(GetIsolate());
observer.Reset(GetIsolate(), value);
observer.SetWeak();
holder->push_back(TraceWrapperV8Reference<v8::Value>(GetIsolate(), value));
}
RunV8FullGC();
CHECK(!observer.IsEmpty());
holder.Clear();
RunV8FullGC();
CHECK(observer.IsEmpty());
}
TEST_F(TraceWrapperV8ReferenceTest, Ephemeron) {
V8TestingScope testing_scope;
SetIsolate(testing_scope.GetIsolate());
using EphemeronMap = HeapHashMap<WeakMember<TraceWrapperV8ReferenceHolder>,
TraceWrapperV8Reference<v8::Value>>;
Persistent<EphemeronMap> holder(MakeGarbageCollected<EphemeronMap>());
v8::Persistent<v8::Value> observer;
Persistent<TraceWrapperV8ReferenceHolder> object(
MakeGarbageCollected<TraceWrapperV8ReferenceHolder>());
{
v8::HandleScope handle_scope(GetIsolate());
v8::Local<v8::Value> value = v8::Object::New(GetIsolate());
observer.Reset(GetIsolate(), value);
observer.SetWeak();
holder->insert(WeakMember<TraceWrapperV8ReferenceHolder>(object),
TraceWrapperV8Reference<v8::Value>(GetIsolate(), value));
}
RunV8FullGC();
EXPECT_TRUE(!observer.IsEmpty());
holder.Clear();
RunV8FullGC();
CHECK(observer.IsEmpty());
}
} // namespace blink
......@@ -120,4 +120,25 @@ class TraceWrapperV8Reference {
} // namespace blink
namespace WTF {
template <typename T>
struct IsTraceable<blink::TraceWrapperV8Reference<T>> {
STATIC_ONLY(IsTraceable);
static const bool value = true;
};
template <typename T>
struct VectorTraits<blink::TraceWrapperV8Reference<T>>
: VectorTraitsBase<blink::TraceWrapperV8Reference<T>> {
STATIC_ONLY(VectorTraits);
static const bool kNeedsDestruction = false;
static const bool kCanInitializeWithMemset = true;
static const bool kCanClearUnusedSlotsWithMemset = true;
static const bool kCanCopyWithMemcpy = false;
static const bool kCanMoveWithMemcpy = false;
};
} // namespace WTF
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_TRACE_WRAPPER_V8_REFERENCE_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment