diff --git a/src/obj/bool.rs b/src/obj/bool.rs index f93b95d..b1464cd 100644 --- a/src/obj/bool.rs +++ b/src/obj/bool.rs @@ -1,7 +1,7 @@ use crate::obj::{Obj, VTable}; use crate::syn::span::Span; use crate::vm::{error::*, machine::Machine}; -use gc::{Finalize, Trace}; +use gc::{Finalize, Gc, Trace}; pub type Bool = bool; @@ -12,11 +12,14 @@ pub struct BoolObj { } impl BoolObj { - pub fn new(value: Bool) -> Self { - BoolObj { - value, - vtable: vtable! {}, + pub fn new(value: Bool) -> Gc { + thread_local! { + static BOOLS: [Gc; 2] = [ + Gc::new(BoolObj { value: false, vtable: vtable! {} }), + Gc::new(BoolObj { value: true, vtable: vtable! {} }), + ]; } + BOOLS.with(|bools| Gc::clone(&bools[value as usize])) } #[allow(dead_code)] diff --git a/src/vm/builtins.rs b/src/vm/builtins.rs index ad3d389..24f47d9 100644 --- a/src/vm/builtins.rs +++ b/src/vm/builtins.rs @@ -1,4 +1,4 @@ -use crate::obj::{builtin::BuiltinExit, str::StrObj, Obj}; +use crate::obj::prelude::*; use crate::vm::{ error::RuntimeError, machine::{Machine, MachineBuilder}, @@ -22,6 +22,16 @@ impl MachineBuilder { panic!(); }); + self.register_builtin_fun("T", |machine, _| { + machine.stack_push(BoolObj::new(true))?; + Ok(BuiltinExit::Return) + }); + + self.register_builtin_fun("F", |machine, _| { + machine.stack_push(BoolObj::new(false))?; + Ok(BuiltinExit::Return) + }); + /* // // if