diff options
| author | Peter Zhu <peter@peterzhu.ca> | 2026-01-01 09:04:15 -0500 |
|---|---|---|
| committer | git <svn-admin@ruby-lang.org> | 2026-01-02 17:58:49 +0000 |
| commit | 31fb970c18734455c2a2e6eb93bdc67db1edb88c (patch) | |
| tree | 4c245e441ec77244e4943aa1cc4afa09d3b7746d | |
| parent | c47a8052f6ecd3fb981416d6bfd918590572bb37 (diff) | |
[ruby/mmtk] Assert target is not pinned during normal tracing
https://github.com/ruby/mmtk/commit/58210c88ed
| -rw-r--r-- | gc/mmtk/src/scanning.rs | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/gc/mmtk/src/scanning.rs b/gc/mmtk/src/scanning.rs index be834bdd0b..355a2e7759 100644 --- a/gc/mmtk/src/scanning.rs +++ b/gc/mmtk/src/scanning.rs @@ -4,6 +4,7 @@ use crate::upcalls; use crate::utils::ChunkedVecCollector; use crate::Ruby; use crate::RubySlot; +use mmtk::memory_manager; use mmtk::scheduler::GCWork; use mmtk::scheduler::GCWorker; use mmtk::scheduler::WorkBucketStage; @@ -53,6 +54,19 @@ impl Scanning<Ruby> for VMScanning { mmtk::memory_manager::is_mmtk_object(target_object.to_raw_address()).is_some(), "Destination is not an MMTk object. Src: {object} dst: {target_object}" ); + + debug_assert!( + // If we are in a moving GC, all objects should be pinned by PinningRegistry. + // If it is requested that target_object be pinned but it is not pinned, then + // it is a bug because it could be moved. + if crate::mmtk().get_plan().current_gc_may_move_object() && pin { + memory_manager::is_pinned(target_object) + } else { + true + }, + "Object {object} is trying to pin {target_object}" + ); + let forwarded_target = object_tracer.trace_object(target_object); if forwarded_target != target_object { trace!(" Forwarded target {target_object} -> {forwarded_target}"); |
