HyphaeVM Garbage Collection
All checks were successful
per-push tests / build (push) Successful in 36s
per-push tests / test-utility (push) Successful in 36s
per-push tests / test-frontend (push) Successful in 37s
per-push tests / test-backend (push) Successful in 31s
per-push tests / timed-decomposer-parse (push) Successful in 34s
All checks were successful
per-push tests / build (push) Successful in 36s
per-push tests / test-utility (push) Successful in 36s
per-push tests / test-frontend (push) Successful in 37s
per-push tests / test-backend (push) Successful in 31s
per-push tests / timed-decomposer-parse (push) Successful in 34s
This commit removes the dependency upon Mycelium::sexpr::Datum from Hyphae
and instead adds a heap.rs module including three types:
- Gc: This is essentially a Box<Rc<T>> but passed around as a *const Rc<T>.
not only does this allow the wrapped T to be passed around in a format
that fits completely within a single physical register, this also
applies a greedy reference counting garbage collection to each and
every object allocated in the VM.
- Datum: This is a simplified enum for type polymorphism. Similar to the
original Mycelium::sexpr::Datum.
- Cons: This is a very standard Cons cell type.
Additionally, two new instructions are added:
- DUPL: a deep copy instruction
- CONST: an instruction to create number datum from embedded constants
- NTOI: casts a number to its inexact form
- NTOE: casts a number to its exact form
Fixes: #35 and #36
Signed-off-by: Ava Affine <ava@sunnypup.io>
This commit is contained in:
parent
8d2d0ebf0c
commit
cf626b2bfc
7 changed files with 324 additions and 295 deletions
|
|
@ -5,4 +5,4 @@ edition = "2024"
|
|||
|
||||
[dependencies]
|
||||
organelle = { path = "../organelle" }
|
||||
|
||||
hyphae = { path = "../hyphae" }
|
||||
|
|
|
|||
|
|
@ -110,34 +110,6 @@ impl fmt::Debug for Datum {
|
|||
pub struct Ast(pub Rc<Datum>, pub Rc<Datum>);
|
||||
|
||||
impl Ast {
|
||||
pub fn subsl(&self, start: isize, end: isize) -> Ast {
|
||||
if end - start == 1 {
|
||||
return Ast(Rc::from(self[start as usize].clone()), Rc::from(Datum::None))
|
||||
}
|
||||
|
||||
if end == 0 {
|
||||
return Ast(
|
||||
Rc::from((*(self.0)).clone()),
|
||||
Rc::from(Datum::None)
|
||||
)
|
||||
}
|
||||
|
||||
let Datum::List(ref next) = *self.1 else {
|
||||
panic!("index into improper list form")
|
||||
};
|
||||
|
||||
if start <= 0 {
|
||||
Ast(
|
||||
Rc::from((*(self.0)).clone()),
|
||||
Rc::from(Datum::List(
|
||||
Rc::from(next.subsl(start - 1, end - 1))))
|
||||
)
|
||||
|
||||
} else {
|
||||
next.subsl(start - 1, end - 1)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn len(&self) -> usize {
|
||||
let Datum::List(ref next) = *self.1 else {
|
||||
return 1
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue