use crate::state::{FinalizerObject, GlobalState, LuaState};
use crate::string::{LuaStringImpl, LuaUserDataImpl};
use lua_gc::{Marker, Trace};
impl Trace for LuaStringImpl {
fn type_name(&self) -> &'static str {
std::any::type_name::<Self>()
}
fn trace(&self, _m: &mut Marker) {}
}
impl Trace for LuaUserDataImpl {
fn type_name(&self) -> &'static str {
std::any::type_name::<Self>()
}
fn trace(&self, _m: &mut Marker) {}
}
impl Trace for FinalizerObject {
fn type_name(&self) -> &'static str {
std::any::type_name::<Self>()
}
fn trace(&self, m: &mut Marker) {
match self {
FinalizerObject::Table(t) => t.trace(m),
FinalizerObject::UserData(u) => u.trace(m),
}
}
}
impl Trace for LuaState {
fn type_name(&self) -> &'static str {
std::any::type_name::<Self>()
}
fn trace(&self, m: &mut Marker) {
let bound = self.gc_trace_bound();
for slot in &self.stack[..bound] {
slot.val.trace(m);
}
for uv in self.openupval.iter() {
uv.trace(m);
}
}
}
impl Trace for GlobalState {
fn type_name(&self) -> &'static str {
std::any::type_name::<Self>()
}
fn trace(&self, m: &mut Marker) {
self.l_registry.trace(m);
for value in self.external_roots.iter_values() {
value.trace(m);
}
for value in self.cross_thread_upvals.values() {
value.trace(m);
}
self.globals.trace(m);
self.loaded.trace(m);
if let Some(t) = &self.mainthread {
t.trace(m);
}
self.main_thread_value.trace(m);
if self.current_thread_id != self.main_thread_id {
if let Some(entry) = self.threads.get(&self.current_thread_id) {
entry.value.trace(m);
}
}
for slot in self.mt.iter() {
if let Some(t) = slot {
t.trace(m);
}
}
for s in self.tmname.iter() {
s.trace(m);
}
self.memerrmsg.trace(m);
for th in self.twups.iter() {
th.trace(m);
}
for row in self.strcache.iter() {
for s in row.iter() {
s.trace(m);
}
}
for object in self.finalizers.to_be_finalized().iter() {
object.trace(m);
}
for stack_snapshot in self.suspended_parent_stacks.iter() {
for v in stack_snapshot.iter() {
v.trace(m);
}
}
for upval_snapshot in self.suspended_parent_open_upvals.iter() {
for uv in upval_snapshot.iter() {
uv.trace(m);
}
}
}
}