diff options
Diffstat (limited to '')
-rw-r--r-- | matrix-lang/src/chunk.rs (renamed from matrix/src/chunk.rs) | 71 |
1 files changed, 22 insertions, 49 deletions
diff --git a/matrix/src/chunk.rs b/matrix-lang/src/chunk.rs index 495b787..2fc3d9e 100644 --- a/matrix/src/chunk.rs +++ b/matrix-lang/src/chunk.rs @@ -1,5 +1,5 @@ -use crate::{value::Value, ast::{UnaryOp, BinaryOp}, vm::{Vm, StackFrame}, Result, lex::Position}; -use std::{fmt::{Debug, Display}, rc::Rc}; +use std::fmt::{Debug, Display}; +use crate::prelude::*; #[derive(Clone, Default)] pub struct Chunk { @@ -18,53 +18,6 @@ impl Chunk { } } -impl Debug for Chunk { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Chunk({})", self.code.len()) - } -} - -impl Display for Chunk { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - writeln!(f, "constants: ")?; - for (i, c) in self.constants.iter().enumerate() { - writeln!(f, " {i:04}: {c}")?; - } - writeln!(f, "code:")?; - for (i, ins) in self.code.iter().enumerate() { - writeln!(f, " {i:04}: {ins}")?; - } - Ok(()) - } -} - -pub struct Function { - pub name: Rc<str>, - pub arity: usize, - pub variadic: bool, - pub fun: InnerFunction -} - -#[derive(Clone)] -pub enum InnerFunction { - Compiled(Rc<Chunk>), - Native(Rc<dyn Fn((&mut Vm, &mut StackFrame), Vec<Value>) -> Result<Value>>), -} - -impl Debug for Function { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - use InnerFunction as F; - match self.fun { - F::Compiled(_) => { - write!(f, "[Function {}]", self.name) - }, - F::Native(_) => { - write!(f, "[NativeFunction {}]", self.name) - } - } - } -} - #[derive(Clone, Debug)] #[repr(align(4))] pub enum Instruction { @@ -113,6 +66,26 @@ pub enum Instruction { Return, } +impl Debug for Chunk { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "[Chunk {}]", self.code.len()) + } +} + +impl Display for Chunk { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, "constants: ")?; + for (i, c) in self.constants.iter().enumerate() { + writeln!(f, " {i:04}: {c}")?; + } + writeln!(f, "code:")?; + for (i, ins) in self.code.iter().enumerate() { + writeln!(f, " {i:04}: {ins}")?; + } + Ok(()) + } +} + impl Display for Instruction { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { use Instruction::*; |