@@ -706,4 +706,45 @@ TEST_F(UnifiedHeapTest, TracedReferenceHandlesDoNotLeak) {
706
706
EXPECT_EQ (initial_count, final_count + 1 );
707
707
}
708
708
709
+ namespace {
710
+ class Wrappable2 final : public cppgc::GarbageCollected<Wrappable2> {
711
+ public:
712
+ static size_t destructor_call_count;
713
+ void Trace (cppgc::Visitor* visitor) const {}
714
+ ~Wrappable2 () { destructor_call_count++; }
715
+ };
716
+
717
+ size_t Wrappable2::destructor_call_count = 0 ;
718
+ } // namespace
719
+
720
+ TEST_F (UnifiedHeapTest, WrapperDescriptorGetter) {
721
+ v8::Isolate* isolate = v8_isolate ();
722
+ v8::HandleScope scope (isolate);
723
+ auto * wrappable_object =
724
+ cppgc::MakeGarbageCollected<Wrappable2>(allocation_handle ());
725
+ v8::WrapperDescriptor descriptor =
726
+ isolate->GetCppHeap ()->wrapper_descriptor ();
727
+ v8::Local<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New (isolate);
728
+ int size = std::max (descriptor.wrappable_type_index ,
729
+ descriptor.wrappable_instance_index ) +
730
+ 1 ;
731
+ tmpl->SetInternalFieldCount (size);
732
+ v8::Local<v8::Object> api_object =
733
+ tmpl->NewInstance (isolate->GetCurrentContext ()).ToLocalChecked ();
734
+ api_object->SetAlignedPointerInInternalField (
735
+ descriptor.wrappable_type_index ,
736
+ &descriptor.embedder_id_for_garbage_collected );
737
+ api_object->SetAlignedPointerInInternalField (
738
+ descriptor.wrappable_instance_index , wrappable_object);
739
+
740
+ Wrappable2::destructor_call_count = 0 ;
741
+ EXPECT_EQ (0u , Wrappable2::destructor_call_count);
742
+ CollectGarbageWithoutEmbedderStack (cppgc::Heap::SweepingType::kAtomic );
743
+ EXPECT_EQ (0u , Wrappable2::destructor_call_count);
744
+ api_object->SetAlignedPointerInInternalField (
745
+ descriptor.wrappable_instance_index , nullptr );
746
+ CollectGarbageWithoutEmbedderStack (cppgc::Heap::SweepingType::kAtomic );
747
+ EXPECT_EQ (1u , Wrappable2::destructor_call_count);
748
+ }
749
+
709
750
} // namespace v8::internal
0 commit comments