Renamed Machine::init_machine and fixed stack overflow by allocating main_memory to the heap

This commit is contained in:
François Autin
2023-03-11 23:49:20 +01:00
parent 1f54ed35db
commit 177abfe846
4 changed files with 45 additions and 43 deletions

View File

@ -73,7 +73,7 @@ pub struct Machine {
pub sp: usize,
pub int_reg : Register<i64>,
pub fp_reg : Register<f32>,
pub main_memory : [u8 ; MEM_SIZE],
pub main_memory : Vec<u8>,
pub shiftmask : [u64 ; 64],
pub registers_trace : String, // for tests
pub interrupt: Interrupt
@ -84,7 +84,7 @@ pub struct Machine {
impl Machine {
pub fn _init_machine() -> Machine {
pub fn init_machine() -> Machine {
let mut shiftmask : [u64 ; 64] = [0 ; 64];
let mut value : u64 = 0xffffffff;
@ -99,7 +99,7 @@ impl Machine {
sp: 0,
int_reg : Register::<i64>::init(),
fp_reg : Register::<f32>::init(),
main_memory : [0; MEM_SIZE],
main_memory : vec![0_u8; MEM_SIZE],
shiftmask,
interrupt: Interrupt::new(),
registers_trace : String::from("")
@ -700,9 +700,14 @@ mod test {
use crate::simulator::{machine::Machine, mem_cmp};
#[test]
fn test_init_machine() {
let _ = Machine::init_machine();
}
#[test]
fn test_read_memory() {
let mut m = Machine::_init_machine();
let mut m = Machine::init_machine();
m.main_memory[4] = 43;
m.main_memory[5] = 150;
assert_eq!((43 << 8) + 150, Machine::read_memory(&mut m, 2, 4));
@ -710,7 +715,7 @@ mod test {
#[test]
fn test_write_memory() {
let mut m = Machine::_init_machine();
let mut m = Machine::init_machine();
Machine::write_memory(&mut m, 2, 6, (43 << 8) + 150);
assert_eq!(43, m.main_memory[6]);
assert_eq!(150, m.main_memory[7]);
@ -723,11 +728,11 @@ mod test {
#[test]
fn test_comp() {
let mut m = Machine::_init_machine();
let mut m = Machine::init_machine();
let path_before = "memoryComp.txt".to_string();
let path_after = "memoryCompEnd.txt".to_string();
let memory_before = mem_cmp::MemChecker::from(&path_before);
let memory_after = mem_cmp::MemChecker::from(&path_after);
let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap();
let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap();
mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m);
Machine::run(&mut m);
@ -740,11 +745,11 @@ mod test {
#[test]
fn test_div() {
let mut m = Machine::_init_machine();
let path_before = "memoryDiv.txt".to_string();
let path_after = "memoryDivEnd.txt".to_string();
let memory_before = mem_cmp::MemChecker::from(&path_before);
let memory_after = mem_cmp::MemChecker::from(&path_after);
let mut m = Machine::init_machine();
let path_before = "memoryDiv.txt";
let path_after = "memoryDivEnd.txt";
let memory_before = mem_cmp::MemChecker::from(path_before).unwrap();
let memory_after = mem_cmp::MemChecker::from(path_after).unwrap();
mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m);
Machine::run(&mut m);
@ -757,11 +762,11 @@ mod test {
#[test]
fn test_if() {
let mut m = Machine::_init_machine();
let mut m = Machine::init_machine();
let path_before = "memoryIf.txt".to_string();
let path_after = "memoryIfEnd.txt".to_string();
let memory_before = mem_cmp::MemChecker::from(&path_before);
let memory_after = mem_cmp::MemChecker::from(&path_after);
let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap();
let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap();
mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m);
Machine::run(&mut m);
@ -774,11 +779,11 @@ mod test {
#[test]
fn test_jump() {
let mut m = Machine::_init_machine();
let mut m = Machine::init_machine();
let path_before = "memoryJump.txt".to_string();
let path_after = "memoryJumpEnd.txt".to_string();
let memory_before = mem_cmp::MemChecker::from(&path_before);
let memory_after = mem_cmp::MemChecker::from(&path_after);
let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap();
let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap();
mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m);
Machine::run(&mut m);
@ -791,11 +796,11 @@ mod test {
#[test]
fn test_mul() {
let mut m = Machine::_init_machine();
let mut m = Machine::init_machine();
let path_before = "memoryMul.txt".to_string();
let path_after = "memoryMulEnd.txt".to_string();
let memory_before = mem_cmp::MemChecker::from(&path_before);
let memory_after = mem_cmp::MemChecker::from(&path_after);
let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap();
let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap();
mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m);
Machine::run(&mut m);
@ -808,11 +813,11 @@ mod test {
#[test]
fn test_ret() {
let mut m = Machine::_init_machine();
let mut m = Machine::init_machine();
let path_before = "memoryRet.txt".to_string();
let path_after = "memoryRetEnd.txt".to_string();
let memory_before = mem_cmp::MemChecker::from(&path_before);
let memory_after = mem_cmp::MemChecker::from(&path_after);
let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap();
let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap();
mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m);
Machine::run(&mut m);
@ -825,11 +830,11 @@ mod test {
#[test]
fn test_sub() {
let mut m = Machine::_init_machine();
let mut m = Machine::init_machine();
let path_before = "memorySub.txt".to_string();
let path_after = "memorySubEnd.txt".to_string();
let memory_before = mem_cmp::MemChecker::from(&path_before);
let memory_after = mem_cmp::MemChecker::from(&path_after);
let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap();
let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap();
mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m);
Machine::run(&mut m);
@ -842,11 +847,11 @@ mod test {
#[test]
fn test_switch() {
let mut m = Machine::_init_machine();
let mut m = Machine::init_machine();
let path_before = "memorySwitch.txt".to_string();
let path_after = "memorySwitchEnd.txt".to_string();
let memory_before = mem_cmp::MemChecker::from(&path_before);
let memory_after = mem_cmp::MemChecker::from(&path_after);
let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap();
let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap();
mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m);
Machine::run(&mut m);