better local vars/operand stack

This commit is contained in:
nora 2021-08-22 20:58:46 +02:00
parent 43e2c59e73
commit 5ec9260b59
2 changed files with 27 additions and 17 deletions

View file

@ -1,4 +1,7 @@
use coldsquare::{display_class, parse_class_file}; use crate::ui::display_class;
use file_parser::parse_class_file;
mod ui;
fn main() { fn main() {
let file = std::env::args().nth(1).unwrap_or_else(|| { let file = std::env::args().nth(1).unwrap_or_else(|| {

View file

@ -1,49 +1,56 @@
pub struct OperandStack { pub struct OperandStack {
vec: Vec<u32>, arr: [u32; 255],
sp: u8,
} }
impl OperandStack { impl OperandStack {
pub fn new() -> OperandStack { pub fn new() -> Self {
OperandStack { vec: vec![] } Self {
arr: [0; 255],
sp: 0,
}
} }
pub fn pop(&mut self) -> u32 { pub fn pop(&mut self) -> u32 {
self.vec.pop().unwrap() self.sp -= 1;
self.arr[self.sp as usize]
} }
pub fn push(&mut self, n: u32) { pub fn push(&mut self, n: u32) {
self.vec.push(n); self.arr[self.sp as usize] = n;
self.sp += 1;
} }
pub fn swap(&mut self) { pub fn swap(&mut self) {
let len = self.vec.len(); let tmp = self.arr[(self.sp - 1) as usize];
self.vec.swap(len - 1, len - 2); self.arr[(self.sp - 1) as usize] = self.arr[(self.sp - 2) as usize];
self.arr[(self.sp - 2) as usize] = tmp;
} }
} }
pub struct LocalVariables { pub struct LocalVariables {
vec: Vec<u32>, arr: [u32; 255],
} }
impl LocalVariables { impl LocalVariables {
pub fn new(size: usize) -> LocalVariables { pub fn new() -> Self {
LocalVariables { vec: vec![0; size] } Self { arr: [0; 255] }
} }
pub fn store(&mut self, address: u8, value: u32) { pub fn store(&mut self, address: u8, value: u32) {
self.vec.insert(address as usize, value); self.arr[address as usize] = value;
} }
pub fn store2(&mut self, address: u8, value1: u32, value2: u32) { pub fn store2(&mut self, address: u8, value1: u32, value2: u32) {
self.vec.insert(address as usize, value1); self.arr[address as usize] = value1;
self.vec.insert(address as usize + 1, value2); self.arr[address as usize + 1] = value2;
} }
pub fn load(&self, address: u8) -> u32 { pub fn load(&self, address: u8) -> u32 {
self.vec[address as usize] self.arr[address as usize]
} }
pub fn load2(&self, address: u8) -> (u32, u32) { pub fn load2(&self, address: u8) -> (u32, u32) {
(self.vec[address as usize], self.vec[address as usize + 1]) (self.arr[address as usize], self.arr[address as usize + 1])
} }
} }
@ -69,7 +76,7 @@ mod tests {
#[test] #[test]
fn local_vars() { fn local_vars() {
let mut vars = LocalVariables::new(10); let mut vars = LocalVariables::new();
vars.store(1, 546); vars.store(1, 546);
vars.store(2, 100); vars.store(2, 100);