summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2026-01-01 09:04:15 -0500
committergit <svn-admin@ruby-lang.org>2026-01-02 17:58:49 +0000
commit31fb970c18734455c2a2e6eb93bdc67db1edb88c (patch)
tree4c245e441ec77244e4943aa1cc4afa09d3b7746d
parentc47a8052f6ecd3fb981416d6bfd918590572bb37 (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.rs14
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}");