From d15768a51b17ed0924d56772a7de4e0f5994f0c1 Mon Sep 17 00:00:00 2001
From: Yi Lin <qinsoon@gmail.com>
Date: Tue, 26 Mar 2024 04:21:59 +0000
Subject: [PATCH] Use mark sweep space as the non moving space

---
 src/plan/global.rs                            |  8 ++++----
 src/plan/mutator_context.rs                   | 11 ++++-------
 src/policy/marksweepspace/native_ms/global.rs |  2 +-
 3 files changed, 9 insertions(+), 12 deletions(-)

diff --git a/src/plan/global.rs b/src/plan/global.rs
index 5b28c4b720..0697a35919 100644
--- a/src/plan/global.rs
+++ b/src/plan/global.rs
@@ -7,6 +7,7 @@ use crate::plan::tracing::ObjectQueue;
 use crate::plan::Mutator;
 use crate::policy::immortalspace::ImmortalSpace;
 use crate::policy::largeobjectspace::LargeObjectSpace;
+use crate::policy::marksweepspace::native_ms::MarkSweepSpace;
 use crate::policy::space::{PlanCreateSpaceArgs, Space};
 #[cfg(feature = "vm_space")]
 use crate::policy::vmspace::VMSpace;
@@ -561,9 +562,8 @@ pub struct CommonPlan<VM: VMBinding> {
     pub immortal: ImmortalSpace<VM>,
     #[space]
     pub los: LargeObjectSpace<VM>,
-    // TODO: We should use a marksweep space for nonmoving.
     #[space]
-    pub nonmoving: ImmortalSpace<VM>,
+    pub nonmoving: MarkSweepSpace<VM>,
     #[parent]
     pub base: BasePlan<VM>,
 }
@@ -580,7 +580,7 @@ impl<VM: VMBinding> CommonPlan<VM> {
                 args.get_space_args("los", true, VMRequest::discontiguous()),
                 false,
             ),
-            nonmoving: ImmortalSpace::new(args.get_space_args(
+            nonmoving: MarkSweepSpace::new(args.get_space_args(
                 "nonmoving",
                 true,
                 VMRequest::discontiguous(),
@@ -639,7 +639,7 @@ impl<VM: VMBinding> CommonPlan<VM> {
         &self.los
     }
 
-    pub fn get_nonmoving(&self) -> &ImmortalSpace<VM> {
+    pub fn get_nonmoving(&self) -> &MarkSweepSpace<VM> {
         &self.nonmoving
     }
 }
diff --git a/src/plan/mutator_context.rs b/src/plan/mutator_context.rs
index 5b2ce60703..759bf4e68d 100644
--- a/src/plan/mutator_context.rs
+++ b/src/plan/mutator_context.rs
@@ -423,10 +423,8 @@ pub(crate) fn create_allocator_mapping(
         map[AllocationSemantics::Los] = AllocatorSelector::LargeObject(reserved.n_large_object);
         reserved.n_large_object += 1;
 
-        // TODO: This should be freelist allocator once we use marksweep for nonmoving space.
-        map[AllocationSemantics::NonMoving] =
-            AllocatorSelector::BumpPointer(reserved.n_bump_pointer);
-        reserved.n_bump_pointer += 1;
+        map[AllocationSemantics::NonMoving] = AllocatorSelector::FreeList(reserved.n_free_list);
+        reserved.n_free_list += 1;
     }
 
     reserved.validate();
@@ -488,12 +486,11 @@ pub(crate) fn create_space_mapping<VM: VMBinding>(
             plan.common().get_los(),
         ));
         reserved.n_large_object += 1;
-        // TODO: This should be freelist allocator once we use marksweep for nonmoving space.
         vec.push((
-            AllocatorSelector::BumpPointer(reserved.n_bump_pointer),
+            AllocatorSelector::FreeList(reserved.n_free_list),
             plan.common().get_nonmoving(),
         ));
-        reserved.n_bump_pointer += 1;
+        reserved.n_free_list += 1;
     }
 
     reserved.validate();
diff --git a/src/policy/marksweepspace/native_ms/global.rs b/src/policy/marksweepspace/native_ms/global.rs
index a533fcde33..a5c2f809eb 100644
--- a/src/policy/marksweepspace/native_ms/global.rs
+++ b/src/policy/marksweepspace/native_ms/global.rs
@@ -236,7 +236,7 @@ impl<VM: VMBinding> MarkSweepSpace<VM> {
         }
     }
 
-    fn trace_object<Q: ObjectQueue>(
+    pub fn trace_object<Q: ObjectQueue>(
         &self,
         queue: &mut Q,
         object: ObjectReference,