Skip to content

Commit 58210c8

Browse files
committed
Assert target is not pinned during normal tracing
1 parent ca15fec commit 58210c8

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

gc/mmtk/src/scanning.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::upcalls;
44
use crate::utils::ChunkedVecCollector;
55
use crate::Ruby;
66
use crate::RubySlot;
7+
use mmtk::memory_manager;
78
use mmtk::scheduler::GCWork;
89
use mmtk::scheduler::GCWorker;
910
use mmtk::scheduler::WorkBucketStage;
@@ -53,6 +54,19 @@ impl Scanning<Ruby> for VMScanning {
5354
mmtk::memory_manager::is_mmtk_object(target_object.to_raw_address()).is_some(),
5455
"Destination is not an MMTk object. Src: {object} dst: {target_object}"
5556
);
57+
58+
debug_assert!(
59+
// If we are in a moving GC, all objects should be pinned by PinningRegistry.
60+
// If it is requested that target_object be pinned but it is not pinned, then
61+
// it is a bug because it could be moved.
62+
if crate::mmtk().get_plan().current_gc_may_move_object() && pin {
63+
memory_manager::is_pinned(target_object)
64+
} else {
65+
true
66+
},
67+
"Object {object} is trying to pin {target_object}"
68+
);
69+
5670
let forwarded_target = object_tracer.trace_object(target_object);
5771
if forwarded_target != target_object {
5872
trace!(" Forwarded target {target_object} -> {forwarded_target}");

0 commit comments

Comments
 (0)