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