summaryrefslogtreecommitdiff
path: root/matrix-lang/src/chunk.rs
diff options
context:
space:
mode:
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::*;