Made some neatment updates
This commit is contained in:
parent
a5b8561d1f
commit
cf0f4fc0b9
@ -2,6 +2,7 @@ use std::collections::HashMap;
|
|||||||
|
|
||||||
use super::errors::CompilerError;
|
use super::errors::CompilerError;
|
||||||
use super::parser::{Expression, LiteralPattern, ParsedReid, Pattern, Position, Statement};
|
use super::parser::{Expression, LiteralPattern, ParsedReid, Pattern, Position, Statement};
|
||||||
|
use super::vm::VariableType;
|
||||||
|
|
||||||
type Variable = (HeapID, VariableType);
|
type Variable = (HeapID, VariableType);
|
||||||
pub type HeapID = usize;
|
pub type HeapID = usize;
|
||||||
@ -19,11 +20,6 @@ pub enum Command {
|
|||||||
StringLit(String), // Bring String Literal to Stack
|
StringLit(String), // Bring String Literal to Stack
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
|
||||||
pub enum VariableType {
|
|
||||||
TypeString,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Compiler {
|
pub struct Compiler {
|
||||||
parsed: ParsedReid,
|
parsed: ParsedReid,
|
||||||
root_scope: Scope,
|
root_scope: Scope,
|
||||||
|
@ -108,4 +108,5 @@ pub enum RuntimePanic {
|
|||||||
RegistryNotDefined,
|
RegistryNotDefined,
|
||||||
InvalidHeapAddress,
|
InvalidHeapAddress,
|
||||||
ValueNotInitialized,
|
ValueNotInitialized,
|
||||||
|
InvalidTypeAssign,
|
||||||
}
|
}
|
||||||
|
35
src/vm.rs
35
src/vm.rs
@ -1,6 +1,6 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use super::compiler::{Command, CompiledReid, HeapID, VariableType};
|
use super::compiler::{Command, CompiledReid, HeapID};
|
||||||
use super::errors::RuntimePanic;
|
use super::errors::RuntimePanic;
|
||||||
|
|
||||||
pub struct VirtualMachine {
|
pub struct VirtualMachine {
|
||||||
@ -103,7 +103,7 @@ impl VirtualMachine {
|
|||||||
Command::AssignVariable(heapid, regid) => {
|
Command::AssignVariable(heapid, regid) => {
|
||||||
if let Some(reg) = &self.registry[regid] {
|
if let Some(reg) = &self.registry[regid] {
|
||||||
if let Some(var) = self.heap.get_mut(&heapid) {
|
if let Some(var) = self.heap.get_mut(&heapid) {
|
||||||
var.1 = Some(reg.clone());
|
var.try_set(Some(reg.clone()))?;
|
||||||
dbg!("Variable assigned", heapid, regid, &self.heap);
|
dbg!("Variable assigned", heapid, regid, &self.heap);
|
||||||
Ok(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
@ -142,7 +142,36 @@ impl VirtualMachine {
|
|||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
struct AllocatedVar(VariableType, Option<Value>);
|
struct AllocatedVar(VariableType, Option<Value>);
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
impl AllocatedVar {
|
||||||
|
fn try_set(&mut self, new_val: Option<Value>) -> Result<(), RuntimePanic> {
|
||||||
|
if let Some(val) = new_val {
|
||||||
|
if val.get_type() == self.0 {
|
||||||
|
self.1 = Some(val);
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(RuntimePanic::InvalidTypeAssign)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.1 = None;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||||
|
pub enum VariableType {
|
||||||
|
TypeString,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
enum Value {
|
enum Value {
|
||||||
StringVal(String),
|
StringVal(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Value {
|
||||||
|
fn get_type(&self) -> VariableType {
|
||||||
|
match self {
|
||||||
|
Value::StringVal(_) => VariableType::TypeString,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user