diff --git a/src/obj/bool.rs b/src/obj/bool.rs new file mode 100644 index 0000000..f93b95d --- /dev/null +++ b/src/obj/bool.rs @@ -0,0 +1,44 @@ +use crate::obj::{Obj, VTable}; +use crate::syn::span::Span; +use crate::vm::{error::*, machine::Machine}; +use gc::{Finalize, Trace}; + +pub type Bool = bool; + +#[derive(Debug, Trace, Finalize)] +pub struct BoolObj { + value: Bool, + vtable: VTable, +} + +impl BoolObj { + pub fn new(value: Bool) -> Self { + BoolObj { + value, + vtable: vtable! {}, + } + } + + #[allow(dead_code)] + pub fn value(&self) -> Bool { + self.value + } +} + +impl Obj for BoolObj { + fn vtable(&self) -> &VTable { + &self.vtable + } + + fn vtable_mut(&mut self) -> &mut VTable { + &mut self.vtable + } + + fn call(&self, call_site: Option, _: &mut Machine) -> Result<()> { + Err(RuntimeError::CannotCall("bool value".to_string()).with_location(call_site)) + } + + fn as_any(&self) -> &(dyn std::any::Any + 'static) { + self + } +} diff --git a/src/obj/mod.rs b/src/obj/mod.rs index 9b1f162..0b0aa1f 100644 --- a/src/obj/mod.rs +++ b/src/obj/mod.rs @@ -1,5 +1,6 @@ #[macro_use] mod macros; +pub mod bool; pub mod builtin; pub mod float; pub mod int; @@ -7,6 +8,7 @@ pub mod quote; pub mod str; pub mod prelude { + pub use crate::obj::bool::*; pub use crate::obj::builtin::*; pub use crate::obj::float::*; pub use crate::obj::int::*;