Compare commits

...

2 Commits

Author SHA1 Message Date
682c732955 Upgrade to edition 2021 2022-06-12 15:46:13 +02:00
3c15045e60 Add multi net conn 2022-06-12 00:29:47 +02:00
32 changed files with 154 additions and 127 deletions

View File

@@ -1,6 +1,7 @@
[package] [package]
name = "rustijvm" name = "rustijvm"
version = "1.1.0" version = "1.1.0"
edition = "2021"
authors = ["Jur van den Berg <Jurl.berg@gmail.com>"] authors = ["Jur van den Berg <Jurl.berg@gmail.com>"]
[dependencies] [dependencies]

View File

@@ -10,7 +10,7 @@ use test::Bencher;
fn run_bfi(file: &str) { fn run_bfi(file: &str) {
let file = File::open(file).expect("Missing bf file"); let file = File::open(file).expect("Missing bf file");
let rc = Arc::new(Mutex::new(Cursor::new(Vec::new()))); let rc = Arc::new(Mutex::new(Cursor::new(Vec::new())));
let mut machine = rustijvm::Machine::new_from_file("files/bonus/bfi.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/bonus/bfi.ijvm").unwrap();
machine.set_output(rc); machine.set_output(rc);
machine.set_input(Box::new(file)); machine.set_input(Box::new(file));
machine.run().unwrap(); machine.run().unwrap();

View File

@@ -8,7 +8,7 @@ use test::Bencher;
fn run_calc(input: &'static str) { fn run_calc(input: &'static str) {
let rc = Arc::new(Mutex::new(Cursor::new(Vec::new()))); let rc = Arc::new(Mutex::new(Cursor::new(Vec::new())));
let mut machine = rustijvm::Machine::new_from_file("files/advanced/SimpleCalc.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/SimpleCalc.ijvm").unwrap();
machine.set_output(rc); machine.set_output(rc);
machine.set_input(Box::new(input.as_bytes())); machine.set_input(Box::new(input.as_bytes()));
machine.run().unwrap(); machine.run().unwrap();

View File

@@ -1,6 +1,6 @@
extern crate rustijvm; extern crate rustijvm;
use rustijvm::Disassembly; use rustijvm::disassembler::Disassembly;
use std::env; use std::env;

View File

@@ -1,6 +1,6 @@
use block::Block; use crate::block::Block;
use ops::{num_to_op, Operation}; use crate::ops::{num_to_op, Operation};
use Result; use crate::Result;
pub trait BinReadable { pub trait BinReadable {
fn get(&mut self) -> Result<u8>; fn get(&mut self) -> Result<u8>;

View File

@@ -1,7 +1,7 @@
use std::ops; use std::ops;
use Result; use crate::Result;
use binread::BinReadable; use crate::binread::BinReadable;
#[derive(Debug)] #[derive(Debug)]
pub struct Block { pub struct Block {

View File

@@ -1,9 +1,9 @@
use binread::{BinRead, BinReadable}; use crate::binread::{BinRead, BinReadable};
use block::Block; use crate::block::Block;
use ijvmreader::IJVMReader; use crate::ijvmreader::IJVMReader;
use machine::MAGIC_HEADER; use crate::machine::MAGIC_HEADER;
use ops; use crate::ops;
use Result; use crate::Result;
use std::clone::Clone; use std::clone::Clone;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};

View File

@@ -1,6 +1,6 @@
use stack::Stack; use crate::stack::Stack;
use Result; use crate::Result;
use value::Value; use crate::value::Value;
#[derive(Debug)] #[derive(Debug)]
pub struct Frame { pub struct Frame {

View File

@@ -1,4 +1,4 @@
use value::Value; use crate::value::Value;
use std::rc::{Rc, Weak}; use std::rc::{Rc, Weak};
use std::cell::RefCell; use std::cell::RefCell;

View File

@@ -1,7 +1,7 @@
use std::io::Read; use std::io::Read;
use std::fs::File; use std::fs::File;
use Result; use crate::Result;
use binread::BinReadable; use crate::binread::BinReadable;
pub struct IJVMReader { pub struct IJVMReader {
pointer: usize, pointer: usize,

View File

@@ -22,7 +22,4 @@ pub mod heap;
type Result<T> = ::std::result::Result<T, &'static str>; type Result<T> = ::std::result::Result<T, &'static str>;
pub mod machine; pub mod machine;
pub use machine::Machine;
pub mod disassembler; pub mod disassembler;
pub use disassembler::{Disassembler, Disassembly};

View File

@@ -1,19 +1,19 @@
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use binread::{BinRead, BinReadable}; use crate::binread::{BinRead, BinReadable};
use block::Block; use crate::block::Block;
use frame::Frame; use crate::frame::Frame;
use ijvmreader::IJVMReader; use crate::ijvmreader::IJVMReader;
use ops::{num_to_op, Args, Operation}; use crate::ops::{num_to_op, Args, Operation};
use pool::Pool; use crate::pool::Pool;
use stack::Stack; use crate::stack::Stack;
use Result; use crate::Result;
#[cfg(feature = "bonus.heap")] #[cfg(feature = "bonus.heap")]
use heap::Heaps; use crate::heap::Heaps;
#[cfg(feature = "bonus.network")] #[cfg(feature = "bonus.network")]
use netstack::NetStack; use crate::netstack::NetStack;
use std::convert::TryInto; use std::convert::TryInto;
pub const MAGIC_HEADER: u32 = 0x1DEA_DFAD; pub const MAGIC_HEADER: u32 = 0x1DEA_DFAD;
@@ -26,7 +26,7 @@ pub struct Machine {
pub frame: Vec<Frame>, pub frame: Vec<Frame>,
#[cfg(feature = "bonus.network")] #[cfg(feature = "bonus.network")]
pub net: NetStack, pub net: Vec<NetStack>,
#[cfg(feature = "bonus.heap")] #[cfg(feature = "bonus.heap")]
pub heap: Heaps, pub heap: Heaps,
@@ -46,7 +46,7 @@ impl Machine {
stream_out: Arc::new(Mutex::new(::std::io::stdout())), stream_out: Arc::new(Mutex::new(::std::io::stdout())),
#[cfg(feature = "bonus.network")] #[cfg(feature = "bonus.network")]
net: NetStack::new(), net: Vec::new(),
#[cfg(feature = "bonus.heap")] #[cfg(feature = "bonus.heap")]
heap: Heaps::new(), heap: Heaps::new(),

View File

@@ -1,6 +1,6 @@
use std::net::TcpStream; use std::net::TcpStream;
use Result; use crate::Result;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::net::TcpListener; use std::net::TcpListener;

View File

@@ -1,11 +1,12 @@
use binread::BinRead; use crate::binread::BinRead;
use frame::Frame; use crate::frame::Frame;
use machine::Machine; use crate::machine::Machine;
use std::io::Read; use std::io::Read;
use std::num::Wrapping; use std::num::Wrapping;
use Result; use crate::Result;
use value::Value; use crate::value::Value;
use std::convert::TryInto; use std::convert::TryInto;
use crate::netstack::NetStack;
pub type OpFunc = fn(&mut Machine) -> Result<()>; pub type OpFunc = fn(&mut Machine) -> Result<()>;
@@ -179,8 +180,15 @@ fn halt(machine: &mut Machine) -> Result<()> {
fn ifeq(machine: &mut Machine) -> Result<()> { fn ifeq(machine: &mut Machine) -> Result<()> {
let offset = i32::from(machine.block.read_i16()?) - JUMP_OFFSET; let offset = i32::from(machine.block.read_i16()?) - JUMP_OFFSET;
let compare: i32 = machine.cur_stack().pop()?.try_into()?; let tos = machine.cur_stack().pop()?;
if compare == 0 { // IFEQ is special because it gets special support for NetRefs
let val = match tos {
Value::NetRef(v) => v as i32,
Value::Int(v) => v,
Value::HeapRef(_) => Err("cannot use heapref in IFEQ")?,
};
if val == 0 {
return machine.block.jump(offset); return machine.block.jump(offset);
} }
Ok(()) Ok(())
@@ -311,11 +319,16 @@ fn slp(machine: &mut Machine) -> Result<()> {
fn netbind(machine: &mut Machine) -> Result<()> { fn netbind(machine: &mut Machine) -> Result<()> {
let port: i32 = machine.cur_stack().pop()?.try_into()?; let port: i32 = machine.cur_stack().pop()?.try_into()?;
let result = match machine.net.bind(port as u16) { let mut stack = NetStack::new();
Ok(_) => 1, if stack.bind(port as u16).is_err() {
Err(_) => 0, machine.cur_stack().push(Value::Int(0));
}; return Ok(());
machine.cur_stack().push(Value::Int(result)); }
machine.net.push(stack);
let idx = machine.net.len();
machine.cur_stack().push(Value::NetRef(idx));
Ok(()) Ok(())
} }
@@ -323,44 +336,54 @@ fn netbind(machine: &mut Machine) -> Result<()> {
fn netconnect(machine: &mut Machine) -> Result<()> { fn netconnect(machine: &mut Machine) -> Result<()> {
let port: i32 = machine.cur_stack().pop()?.try_into()?; let port: i32 = machine.cur_stack().pop()?.try_into()?;
let host: i32 = machine.cur_stack().pop()?.try_into()?; let host: i32 = machine.cur_stack().pop()?.try_into()?;
let result = match machine.net.connect(host as u32, port as u16) {
Ok(_) => 1, let mut stack = NetStack::new();
Err(_) => 0, if stack.connect(host as u32, port as u16).is_err() {
}; machine.cur_stack().push(Value::Int(0));
machine.cur_stack().push(Value::Int(result)); return Ok(());
}
machine.net.push(stack);
let idx = machine.net.len();
machine.cur_stack().push(Value::NetRef(idx));
Ok(()) Ok(())
} }
#[cfg(feature = "bonus.network")] #[cfg(feature = "bonus.network")]
fn netin(machine: &mut Machine) -> Result<()> { fn netin(machine: &mut Machine) -> Result<()> {
let netref: i32 = machine.cur_stack().pop()?.try_into()?; let idx = match machine.cur_stack().pop()? {
if netref != 1 { Value::NetRef(x) => x,
return Err("Invalid netref to netin"); _ => Err("Invalid netref given to network instruction")?,
} };
let byte = i32::from(machine.net.read_byte()?); let conn = machine.net.get_mut(idx - 1).ok_or("Invalid network connection")?;
let byte = i32::from(conn.read_byte()?);
machine.cur_stack().push(Value::Int(byte)); machine.cur_stack().push(Value::Int(byte));
Ok(()) Ok(())
} }
#[cfg(feature = "bonus.network")] #[cfg(feature = "bonus.network")]
fn netout(machine: &mut Machine) -> Result<()> { fn netout(machine: &mut Machine) -> Result<()> {
let netref: i32 = machine.cur_stack().pop()?.try_into()?; let idx = match machine.cur_stack().pop()? {
if netref != 1 { Value::NetRef(x) => x,
return Err("Invalid netref to netout"); _ => Err("Invalid netref given to network instruction")?,
} };
let val: i32 = machine.cur_stack().pop()?.try_into()?; let val: i32 = machine.cur_stack().pop()?.try_into()?;
machine.net.write_byte(val as u8) let conn = machine.net.get_mut(idx - 1).ok_or("Invalid network connection")?;
conn.write_byte(val as u8)?;
Ok(())
} }
#[cfg(feature = "bonus.network")] #[cfg(feature = "bonus.network")]
fn netclose(machine: &mut Machine) -> Result<()> { fn netclose(machine: &mut Machine) -> Result<()> {
let netref: i32 = machine.cur_stack().pop()?.try_into()?; let idx = match machine.cur_stack().pop()? {
if netref != 1 { Value::NetRef(x) => x,
return Err("Invalid netref to netclose"); _ => Err("Invalid netref given to network instruction")?,
} };
machine.net.close()
machine.net.get_mut(idx - 1).ok_or("Invalid network connection")?.close()?;
Ok(())
} }
#[cfg(feature = "bonus.heap")] #[cfg(feature = "bonus.heap")]

View File

@@ -1,6 +1,6 @@
use Result; use crate::Result;
use block::Block; use crate::block::Block;
use binread::{BinRead, BinReadable}; use crate::binread::{BinRead, BinReadable};
#[derive(Debug)] #[derive(Debug)]
pub struct Pool { pub struct Pool {

View File

@@ -1,5 +1,5 @@
use Result; use crate::Result;
use value::Value; use crate::value::Value;
#[derive(Debug, Default)] #[derive(Debug, Default)]

View File

@@ -1,11 +1,13 @@
use Result; use crate::Result;
use std::convert::TryInto; use std::convert::TryInto;
use heap::Heap; use crate::heap::Heap;
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
pub enum Value { pub enum Value {
Int(i32), Int(i32),
HeapRef(Heap), HeapRef(Heap),
#[cfg(feature = "bonus.network")]
NetRef(usize),
} }
impl TryInto<i32> for Value { impl TryInto<i32> for Value {
@@ -15,6 +17,8 @@ impl TryInto<i32> for Value {
match self { match self {
Value::Int(a) => Ok(a), Value::Int(a) => Ok(a),
Value::HeapRef(_) => Err("Cannot use HeapRef as i32"), Value::HeapRef(_) => Err("Cannot use HeapRef as i32"),
#[cfg(feature = "bonus.network")]
Value::NetRef(_) => Err("Cannot use NetRef as i32"),
} }
} }
} }
@@ -26,6 +30,8 @@ impl TryInto<i32> for &Value {
match *self { match *self {
Value::Int(a) => Ok(a), Value::Int(a) => Ok(a),
Value::HeapRef(_) => Err("Cannot use HeapRef as i32"), Value::HeapRef(_) => Err("Cannot use HeapRef as i32"),
#[cfg(feature = "bonus.network")]
Value::NetRef(_) => Err("Cannot use NetRef as i32"),
} }
} }
} }

View File

@@ -2,7 +2,7 @@ extern crate rustijvm;
use std::io::{Seek, SeekFrom, Read}; use std::io::{Seek, SeekFrom, Read};
fn steps(machine: &mut rustijvm::Machine, num: usize) { fn steps(machine: &mut rustijvm::machine::Machine, num: usize) {
for _ in 0..num { for _ in 0..num {
machine.step().unwrap(); machine.step().unwrap();
} }
@@ -12,7 +12,7 @@ fn steps(machine: &mut rustijvm::Machine, num: usize) {
fn advanced1() { fn advanced1() {
let output = rustijvm::stubs::output_stub(); let output = rustijvm::stubs::output_stub();
let input = Box::new("A".as_bytes()); let input = Box::new("A".as_bytes());
let mut machine = rustijvm::Machine::new_from_file("files/task5/all_regular.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task5/all_regular.ijvm").unwrap();
machine.set_input(input); machine.set_input(input);
machine.set_output(output.clone()); machine.set_output(output.clone());

View File

@@ -1,6 +1,6 @@
extern crate rustijvm; extern crate rustijvm;
fn steps(machine: &mut rustijvm::Machine, num: usize) { fn steps(machine: &mut rustijvm::machine::Machine, num: usize) {
for _ in 0..num { for _ in 0..num {
machine.step().unwrap(); machine.step().unwrap();
} }
@@ -8,7 +8,7 @@ fn steps(machine: &mut rustijvm::Machine, num: usize) {
#[test] #[test]
fn advanced2_nested_invoke_simple() { fn advanced2_nested_invoke_simple() {
let mut machine = rustijvm::Machine::new_from_file("files/advanced/test-nestedinvoke-simple.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/test-nestedinvoke-simple.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -35,7 +35,7 @@ fn advanced2_nested_invoke_simple() {
#[test] #[test]
fn advanced2_nested_invoke() { fn advanced2_nested_invoke() {
let mut machine = rustijvm::Machine::new_from_file("files/advanced/test-nestedinvoke.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/test-nestedinvoke.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 8); steps(&mut machine, 8);

View File

@@ -1,6 +1,6 @@
extern crate rustijvm; extern crate rustijvm;
fn steps(machine: &mut rustijvm::Machine, num: usize) { fn steps(machine: &mut rustijvm::machine::Machine, num: usize) {
for _ in 0..num { for _ in 0..num {
machine.step().unwrap(); machine.step().unwrap();
} }
@@ -10,7 +10,7 @@ fn steps(machine: &mut rustijvm::Machine, num: usize) {
fn advanced3_wide1() { fn advanced3_wide1() {
use rustijvm::value::Value::Int; use rustijvm::value::Value::Int;
let mut machine = rustijvm::Machine::new_from_file("files/advanced/test-wide1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/test-wide1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 6); steps(&mut machine, 6);
@@ -27,7 +27,7 @@ fn advanced3_wide1() {
#[test] #[test]
fn advanced3_wide2() { fn advanced3_wide2() {
use rustijvm::value::Value::Int; use rustijvm::value::Value::Int;
let mut machine = rustijvm::Machine::new_from_file("files/advanced/test-wide2.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/test-wide2.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 6); steps(&mut machine, 6);

View File

@@ -5,7 +5,7 @@ use std::io::{Seek, SeekFrom, Read};
#[test] #[test]
fn advanced4_tanenbaum() { fn advanced4_tanenbaum() {
let rc = rustijvm::stubs::output_stub(); let rc = rustijvm::stubs::output_stub();
let mut machine = rustijvm::Machine::new_from_file("files/advanced/Tanenbaum.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/Tanenbaum.ijvm").unwrap();
machine.set_output(rc.clone()); machine.set_output(rc.clone());
machine.run().unwrap(); machine.run().unwrap();

View File

@@ -4,7 +4,7 @@ use std::io::{Seek, SeekFrom, Read};
fn run_calc(input: &'static str, expected: &str) { fn run_calc(input: &'static str, expected: &str) {
let rc = rustijvm::stubs::output_stub(); let rc = rustijvm::stubs::output_stub();
let mut machine = rustijvm::Machine::new_from_file("files/advanced/SimpleCalc.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/SimpleCalc.ijvm").unwrap();
machine.set_input(Box::new(input.as_bytes())); machine.set_input(Box::new(input.as_bytes()));
machine.set_output(rc.clone()); machine.set_output(rc.clone());

View File

@@ -4,7 +4,7 @@ use std::io::{Seek, SeekFrom, Read};
fn run_calc(input: &'static str, expected: &str) { fn run_calc(input: &'static str, expected: &str) {
let rc = rustijvm::stubs::output_stub(); let rc = rustijvm::stubs::output_stub();
let mut machine = rustijvm::Machine::new_from_file("files/advanced/SimpleCalc.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/SimpleCalc.ijvm").unwrap();
machine.set_input(Box::new(input.as_bytes())); machine.set_input(Box::new(input.as_bytes()));
machine.set_output(rc.clone()); machine.set_output(rc.clone());

View File

@@ -6,7 +6,7 @@ use std::io::{SeekFrom, Seek, Read};
#[ignore] #[ignore]
fn advanced7() { fn advanced7() {
let output = rustijvm::stubs::output_stub(); let output = rustijvm::stubs::output_stub();
let mut machine = rustijvm::Machine::new_from_file("files/advanced/mandelbread.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/mandelbread.ijvm").unwrap();
machine.set_output(output.clone()); machine.set_output(output.clone());
machine.run().unwrap(); machine.run().unwrap();

View File

@@ -2,7 +2,7 @@ extern crate rustijvm;
use std::convert::TryInto; use std::convert::TryInto;
fn steps(machine: &mut rustijvm::Machine, num: usize) { fn steps(machine: &mut rustijvm::machine::Machine, num: usize) {
for _ in 0..num { for _ in 0..num {
machine.step().unwrap(); machine.step().unwrap();
} }
@@ -10,7 +10,7 @@ fn steps(machine: &mut rustijvm::Machine, num: usize) {
#[test] #[test]
fn advancedstack_100() { fn advancedstack_100() {
let mut machine = rustijvm::Machine::new_from_file("files/advanced/teststack.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/teststack.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -20,7 +20,7 @@ fn advancedstack_100() {
#[test] #[test]
fn advancedstack_3000() { fn advancedstack_3000() {
let mut machine = rustijvm::Machine::new_from_file("files/advanced/teststack.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/teststack.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -30,7 +30,7 @@ fn advancedstack_3000() {
#[test] #[test]
fn advancedstack_50000() { fn advancedstack_50000() {
let mut machine = rustijvm::Machine::new_from_file("files/advanced/teststack.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/teststack.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -40,7 +40,7 @@ fn advancedstack_50000() {
#[test] #[test]
fn advancedstack_contents() { fn advancedstack_contents() {
let mut machine = rustijvm::Machine::new_from_file("files/advanced/teststack.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/teststack.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -58,7 +58,7 @@ fn advancedstack_contents() {
#[test] #[test]
fn advancedstack_method() { fn advancedstack_method() {
let mut machine = rustijvm::Machine::new_from_file("files/advanced/teststack2.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/advanced/teststack2.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 8); steps(&mut machine, 8);

View File

@@ -6,7 +6,7 @@ use std::io::{Seek, SeekFrom, Read};
fn run_bfi(file: &str) -> String { fn run_bfi(file: &str) -> String {
let file = File::open(file).expect("Missing bf file"); let file = File::open(file).expect("Missing bf file");
let rc = rustijvm::stubs::output_stub(); let rc = rustijvm::stubs::output_stub();
let mut machine = rustijvm::Machine::new_from_file("files/bonus/bfi.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/bonus/bfi.ijvm").unwrap();
machine.set_output(rc.clone()); machine.set_output(rc.clone());
machine.set_input(Box::new(file)); machine.set_input(Box::new(file));

View File

@@ -9,7 +9,7 @@ fn test_create_from_slice() {
let mut vec = Vec::<u8>::new(); let mut vec = Vec::<u8>::new();
File::open("files/task1/program1.ijvm").unwrap().read_to_end(&mut vec).unwrap(); File::open("files/task1/program1.ijvm").unwrap().read_to_end(&mut vec).unwrap();
let machine = rustijvm::Machine::new_from_slice(&vec).unwrap(); let machine = rustijvm::machine::Machine::new_from_slice(&vec).unwrap();
assert_eq!(machine.block.len(), 7); assert_eq!(machine.block.len(), 7);
assert_eq!(machine.block[0], 0x10); // BIPUSH assert_eq!(machine.block[0], 0x10); // BIPUSH

View File

@@ -4,7 +4,7 @@ use rustijvm::binread::BinReadable;
#[test] #[test]
fn task1_program1() { fn task1_program1() {
let machine = rustijvm::Machine::new_from_file("files/task1/program1.ijvm").unwrap(); let machine = rustijvm::machine::Machine::new_from_file("files/task1/program1.ijvm").unwrap();
assert_eq!(machine.block.len(), 7); assert_eq!(machine.block.len(), 7);
assert_eq!(machine.block[0], 0x10); // BIPUSH assert_eq!(machine.block[0], 0x10); // BIPUSH
@@ -15,7 +15,7 @@ fn task1_program1() {
#[test] #[test]
fn task1_program2() { fn task1_program2() {
let machine = rustijvm::Machine::new_from_file("files/task1/program2.ijvm").unwrap(); let machine = rustijvm::machine::Machine::new_from_file("files/task1/program2.ijvm").unwrap();
assert_eq!(machine.block.len(), 16); assert_eq!(machine.block.len(), 16);
assert_eq!(machine.block[0], 0x0); assert_eq!(machine.block[0], 0x0);
@@ -31,7 +31,7 @@ fn task1_program2() {
#[test] #[test]
fn task1_program_counter() { fn task1_program_counter() {
let machine = rustijvm::Machine::new_from_file("files/task1/program1.ijvm").unwrap(); let machine = rustijvm::machine::Machine::new_from_file("files/task1/program1.ijvm").unwrap();
assert_eq!(machine.get_program_counter(), 0); assert_eq!(machine.get_program_counter(), 0);
} }

View File

@@ -1,6 +1,6 @@
extern crate rustijvm; extern crate rustijvm;
fn steps(machine: &mut rustijvm::Machine, num: usize) { fn steps(machine: &mut rustijvm::machine::Machine, num: usize) {
for _ in 0..num { for _ in 0..num {
machine.step().unwrap(); machine.step().unwrap();
} }
@@ -8,7 +8,7 @@ fn steps(machine: &mut rustijvm::Machine, num: usize) {
#[test] #[test]
fn task2_simple_bipush() { fn task2_simple_bipush() {
let mut machine = rustijvm::Machine::new_from_file("files/task2/TestBipush1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task2/TestBipush1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -17,7 +17,7 @@ fn task2_simple_bipush() {
#[test] #[test]
fn task2_signed_bipush() { fn task2_signed_bipush() {
let mut machine = rustijvm::Machine::new_from_file("files/task2/TestBipush2.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task2/TestBipush2.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -26,7 +26,7 @@ fn task2_signed_bipush() {
#[test] #[test]
fn task2_simple_iadd() { fn task2_simple_iadd() {
let mut machine = rustijvm::Machine::new_from_file("files/task2/TestIadd1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task2/TestIadd1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 3); steps(&mut machine, 3);
@@ -35,7 +35,7 @@ fn task2_simple_iadd() {
#[test] #[test]
fn task2_signed_iadd() { fn task2_signed_iadd() {
let mut machine = rustijvm::Machine::new_from_file("files/task2/TestIadd2.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task2/TestIadd2.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 3); steps(&mut machine, 3);
@@ -44,7 +44,7 @@ fn task2_signed_iadd() {
#[test] #[test]
fn task2_simple_isub() { fn task2_simple_isub() {
let mut machine = rustijvm::Machine::new_from_file("files/task2/TestIsub1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task2/TestIsub1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 3); steps(&mut machine, 3);
@@ -53,7 +53,7 @@ fn task2_simple_isub() {
#[test] #[test]
fn task2_signed_isub() { fn task2_signed_isub() {
let mut machine = rustijvm::Machine::new_from_file("files/task2/TestIsub2.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task2/TestIsub2.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 3); steps(&mut machine, 3);
@@ -62,7 +62,7 @@ fn task2_signed_isub() {
#[test] #[test]
fn task2_simple_iand() { fn task2_simple_iand() {
let mut machine = rustijvm::Machine::new_from_file("files/task2/TestIAND1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task2/TestIAND1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 5); steps(&mut machine, 5);
@@ -71,7 +71,7 @@ fn task2_simple_iand() {
#[test] #[test]
fn task2_simple_ior() { fn task2_simple_ior() {
let mut machine = rustijvm::Machine::new_from_file("files/task2/TestIOR1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task2/TestIOR1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 5); steps(&mut machine, 5);
@@ -80,7 +80,7 @@ fn task2_simple_ior() {
#[test] #[test]
fn task2_swap() { fn task2_swap() {
let mut machine = rustijvm::Machine::new_from_file("files/task2/TestSwap1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task2/TestSwap1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -95,7 +95,7 @@ fn task2_swap() {
#[test] #[test]
fn task2_simple_stack_operations() { fn task2_simple_stack_operations() {
let mut machine = rustijvm::Machine::new_from_file("files/task2/TestPop1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task2/TestPop1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 3); steps(&mut machine, 3);

View File

@@ -1,6 +1,6 @@
extern crate rustijvm; extern crate rustijvm;
fn steps(machine: &mut rustijvm::Machine, num: usize) { fn steps(machine: &mut rustijvm::machine::Machine, num: usize) {
for _ in 0..num { for _ in 0..num {
machine.step().unwrap(); machine.step().unwrap();
} }
@@ -8,7 +8,7 @@ fn steps(machine: &mut rustijvm::Machine, num: usize) {
#[test] #[test]
fn task3_goto1() { fn task3_goto1() {
let mut machine = rustijvm::Machine::new_from_file("files/task3/GOTO1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task3/GOTO1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -20,7 +20,7 @@ fn task3_goto1() {
#[test] #[test]
fn task3_goto2() { fn task3_goto2() {
let mut machine = rustijvm::Machine::new_from_file("files/task3/GOTO2.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task3/GOTO2.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -34,7 +34,7 @@ fn task3_goto2() {
#[test] #[test]
fn task3_ifeq1() { fn task3_ifeq1() {
let mut machine = rustijvm::Machine::new_from_file("files/task3/IFEQ1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task3/IFEQ1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -73,7 +73,7 @@ fn task3_ifeq1() {
#[test] #[test]
fn task3_iflt1() { fn task3_iflt1() {
let mut machine = rustijvm::Machine::new_from_file("files/task3/IFLT1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task3/IFLT1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
let mut pc = 0; let mut pc = 0;
@@ -102,7 +102,7 @@ fn task3_iflt1() {
#[test] #[test]
fn task3_ificmpeq1() { fn task3_ificmpeq1() {
let mut machine = rustijvm::Machine::new_from_file("files/task3/IFICMPEQ1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task3/IFICMPEQ1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
let mut pc = 0; let mut pc = 0;

View File

@@ -2,7 +2,7 @@ extern crate rustijvm;
use std::io::{Read, Seek, SeekFrom}; use std::io::{Read, Seek, SeekFrom};
fn steps(machine: &mut rustijvm::Machine, num: usize) { fn steps(machine: &mut rustijvm::machine::Machine, num: usize) {
for _ in 0..num { for _ in 0..num {
machine.step().unwrap(); machine.step().unwrap();
} }
@@ -10,7 +10,7 @@ fn steps(machine: &mut rustijvm::Machine, num: usize) {
#[test] #[test]
fn task4_ldcw1() { fn task4_ldcw1() {
let mut machine = rustijvm::Machine::new_from_file("files/task4/LoadTest1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task4/LoadTest1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -23,7 +23,7 @@ fn task4_ldcw1() {
#[test] #[test]
fn task4_simple_load() { fn task4_simple_load() {
let mut machine = rustijvm::Machine::new_from_file("files/task4/LoadTest3.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task4/LoadTest3.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -52,7 +52,7 @@ fn task4_simple_load() {
#[test] #[test]
fn task4_complex_load() { fn task4_complex_load() {
let mut machine = rustijvm::Machine::new_from_file("files/task4/LoadTest2.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task4/LoadTest2.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1); steps(&mut machine, 1);
@@ -87,7 +87,7 @@ fn task4_complex_load() {
fn task4_iteration_load() { fn task4_iteration_load() {
let rc = rustijvm::stubs::output_stub(); let rc = rustijvm::stubs::output_stub();
let mut machine = rustijvm::Machine::new_from_file("files/task4/LoadTest4.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task4/LoadTest4.ijvm").unwrap();
machine.set_output(rc.clone()); machine.set_output(rc.clone());
machine.run().unwrap(); machine.run().unwrap();
@@ -103,7 +103,7 @@ fn task4_iteration_load() {
#[test] #[test]
fn task4_iinc() { fn task4_iinc() {
use rustijvm::value::Value::Int; use rustijvm::value::Value::Int;
let mut machine = rustijvm::Machine::new_from_file("files/task4/IINCTest.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task4/IINCTest.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 4); steps(&mut machine, 4);

View File

@@ -1,5 +1,5 @@
extern crate rustijvm; extern crate rustijvm;
fn steps(machine: &mut rustijvm::Machine, num: usize) { fn steps(machine: &mut rustijvm::machine::Machine, num: usize) {
for _ in 0..num { for _ in 0..num {
machine.step().unwrap(); machine.step().unwrap();
} }
@@ -7,7 +7,7 @@ fn steps(machine: &mut rustijvm::Machine, num: usize) {
#[test] #[test]
fn task5_invokenoargs() { fn task5_invokenoargs() {
let mut machine = rustijvm::Machine::new_from_file("files/task5/TestInvokeNoArgs.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task5/TestInvokeNoArgs.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 2); steps(&mut machine, 2);
@@ -20,7 +20,7 @@ fn task5_invokenoargs() {
#[test] #[test]
fn task5_invoke1() { fn task5_invoke1() {
let mut machine = rustijvm::Machine::new_from_file("files/task5/test-invokevirtual1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task5/test-invokevirtual1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 3); steps(&mut machine, 3);
@@ -34,7 +34,7 @@ fn task5_invoke1() {
#[test] #[test]
fn task5_ireturn1() { fn task5_ireturn1() {
let mut machine = rustijvm::Machine::new_from_file("files/task5/test-invokevirtual1.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task5/test-invokevirtual1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 6); steps(&mut machine, 6);
@@ -45,7 +45,7 @@ fn task5_ireturn1() {
#[test] #[test]
fn task5_invoke2() { fn task5_invoke2() {
let mut machine = rustijvm::Machine::new_from_file("files/task5/test-invokevirtual2.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task5/test-invokevirtual2.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 5); steps(&mut machine, 5);
@@ -61,7 +61,7 @@ fn task5_invoke2() {
#[test] #[test]
fn task5_ireturn2() { fn task5_ireturn2() {
let mut machine = rustijvm::Machine::new_from_file("files/task5/test-invokevirtual2.ijvm").unwrap(); let mut machine = rustijvm::machine::Machine::new_from_file("files/task5/test-invokevirtual2.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub()); machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 10); steps(&mut machine, 10);