Add custom arithmetic functions, created md5.jas

This commit is contained in:
2019-06-19 23:01:15 +02:00
parent fa49500139
commit 2e58861285
7 changed files with 1734 additions and 40 deletions

View File

@@ -15,8 +15,9 @@ bonus = ["bonus:network", "bonus:heap"]
"bonus:network" = [] "bonus:network" = []
"bonus:heap" = [] "bonus:heap" = []
extra = ["extra:sleep"] extra = ["extra:sleep", "extra:arithmetic"]
"extra:sleep" = [] "extra:sleep" = []
"extra:arithmetic" = []
debug = ["debug:instr", "debug:frame", "debug:gc"] debug = ["debug:instr", "debug:frame", "debug:gc"]
"debug:instr" = [] "debug:instr" = []

BIN
files/custom/md5.ijvm Normal file

Binary file not shown.

1602
files/custom/md5.jas Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,27 +1,38 @@
0x00 NOP
0x10 BIPUSH byte 0x10 BIPUSH byte
0x13 LDC_W constant
0x15 ILOAD var
0x36 ISTORE var
0x57 POP
0x59 DUP 0x59 DUP
0xA7 GOTO label 0x5F SWAP
0x60 IADD 0x60 IADD
0x64 ISUB
0x70 SHL
0x71 SHR
0x72 IMUL
0x73 IDIV
0x7E IAND 0x7E IAND
0x84 IINC var byte
0x99 IFEQ label 0x99 IFEQ label
0x9B IFLT label 0x9B IFLT label
0x9F IF_ICMPEQ label 0x9F IF_ICMPEQ label
0x84 IINC var byte
0x15 ILOAD var 0xA7 GOTO label
0xB6 INVOKEVIRTUAL method
0xB0 IOR
0xAC IRETURN 0xAC IRETURN
0x36 ISTORE var
0x64 ISUB 0xB0 IOR
0x13 LDC_W constant 0xB6 INVOKEVIRTUAL method
0x00 NOP
0x57 POP
0x5F SWAP
0xC4 WIDE 0xC4 WIDE
0xFF HALT
0xFE ERR
0xFD OUT
0xFC IN
0xD1 NEWARRAY 0xD1 NEWARRAY
0xD2 IALOAD 0xD2 IALOAD
@@ -34,4 +45,7 @@
0xE4 NETOUT 0xE4 NETOUT
0xE5 NETCLOSE 0xE5 NETCLOSE
0xF0 SLP byte 0xFC IN
0xFD OUT
0xFE ERR
0xFF HALT

View File

@@ -48,10 +48,8 @@ impl Heaps {
} }
pub fn gc(&mut self) { pub fn gc(&mut self) {
println!("GC PRE : {} weaks", self.len());
for i in 0..self.len() { for i in 0..self.len() {
println!("\theap: {} = {:?}", i, self.get(i)); self.get(i);
} }
println!("GC POST: {} weaks", self.len());
} }
} }

View File

@@ -32,10 +32,10 @@ impl NetStack {
} }
pub fn connect(&mut self, host: u32, port: u16) -> Result<()> { pub fn connect(&mut self, host: u32, port: u16) -> Result<()> {
let h1 = (host & (0xFF << 24)) >> 24 as u8; let h1 = ((host >> 24) & 0xFF) as u8;
let h2 = (host & (0xFF << 16)) >> 16 as u8; let h2 = ((host >> 16) & 0xFF) as u8;
let h3 = (host & (0xFF << 8)) >> 8 as u8; let h3 = ((host >> 8) & 0xFF) as u8;
let h4 = (host & 0xFF) >> 0 as u8; let h4 = ((host >> 0) & 0xFF) as u8;
let addr: String = format!("{}.{}.{}.{}:{}", h1, h2, h3, h4, port); let addr: String = format!("{}.{}.{}.{}:{}", h1, h2, h3, h4, port);
if let Ok(stream) = TcpStream::connect(addr) { if let Ok(stream) = TcpStream::connect(addr) {

View File

@@ -31,33 +31,49 @@ lazy_static! {
let mut m = vec![Operation::Invalid; 0xFF + 1]; let mut m = vec![Operation::Invalid; 0xFF + 1];
m[0x00] = Operation::Op("NOP", nop, vec![]); m[0x00] = Operation::Op("NOP", nop, vec![]);
m[0x10] = Operation::Op("BIPUSH", bipush, vec![Args::Byte]); m[0x10] = Operation::Op("BIPUSH", bipush, vec![Args::Byte]);
m[0x13] = Operation::Op("LDC_W", ldc_w, vec![Args::Constant]); m[0x13] = Operation::Op("LDC_W", ldc_w, vec![Args::Constant]);
m[0x15] = Operation::Op("ILOAD", iload, vec![Args::Var]); m[0x15] = Operation::Op("ILOAD", iload, vec![Args::Var]);
m[0x36] = Operation::Op("ISTORE", istore, vec![Args::Var]); m[0x36] = Operation::Op("ISTORE", istore, vec![Args::Var]);
m[0x57] = Operation::Op("POP", pop, vec![]); m[0x57] = Operation::Op("POP", pop, vec![]);
m[0x59] = Operation::Op("DUP", dup, vec![]); m[0x59] = Operation::Op("DUP", dup, vec![]);
m[0x5F] = Operation::Op("SWAP", swap, vec![]); m[0x5F] = Operation::Op("SWAP", swap, vec![]);
m[0x60] = Operation::Op("IADD", iadd, vec![]); m[0x60] = Operation::Op("IADD", iadd, vec![]);
m[0x64] = Operation::Op("ISUB", isub, vec![]); m[0x64] = Operation::Op("ISUB", isub, vec![]);
#[cfg(feature = "extra:arithmetic")]
{
m[0x70] = Operation::Op("SHL", shl, vec![]);
m[0x71] = Operation::Op("SHR", shr, vec![]);
m[0x72] = Operation::Op("IMUL", imul, vec![]);
m[0x73] = Operation::Op("IDIV", idiv, vec![]);
}
m[0x7E] = Operation::Op("IAND", iand, vec![]); m[0x7E] = Operation::Op("IAND", iand, vec![]);
m[0xB0] = Operation::Op("IOR", ior, vec![]);
m[0x84] = Operation::Op("IINC", iinc, vec![Args::Var, Args::Byte]); m[0x84] = Operation::Op("IINC", iinc, vec![Args::Var, Args::Byte]);
m[0x99] = Operation::Op("IFEQ", ifeq, vec![Args::Label]); m[0x99] = Operation::Op("IFEQ", ifeq, vec![Args::Label]);
m[0x9b] = Operation::Op("IFLT", iflt, vec![Args::Label]); m[0x9b] = Operation::Op("IFLT", iflt, vec![Args::Label]);
m[0x9F] = Operation::Op("IF_ICMPEQ", if_icmpeq, vec![Args::Label]); m[0x9F] = Operation::Op("IF_ICMPEQ", if_icmpeq, vec![Args::Label]);
m[0xA7] = Operation::Op("GOTO", goto, vec![Args::Label]); m[0xA7] = Operation::Op("GOTO", goto, vec![Args::Label]);
m[0xAC] = Operation::Op("IRETURN", ireturn, vec![]); m[0xAC] = Operation::Op("IRETURN", ireturn, vec![]);
m[0xB6] = Operation::Op("INVOKEVIRTUAL", invokevirtual, vec![Args::Constant]);
m[0xC4] = Operation::Op("WIDE", wide, vec![]);
m[0xFC] = Operation::Op("IN", _in, vec![]);
m[0xFD] = Operation::Op("OUT", out, vec![]);
m[0xFE] = Operation::Op("ERR", err, vec![]);
m[0xFF] = Operation::Op("HALT", halt, vec![]);
#[cfg(feature = "extra:sleep")] m[0xB0] = Operation::Op("IOR", ior, vec![]);
m[0xB6] = Operation::Op("INVOKEVIRTUAL", invokevirtual, vec![Args::Constant]);
m[0xC4] = Operation::Op("WIDE", wide, vec![]);
#[cfg(feature = "bonus:heap")]
{ {
m[0xF0] = Operation::Op("SLP", slp, vec![Args::Byte]); m[0xD1] = Operation::Op("NEWARRAY", newarray, vec![]);
m[0xD2] = Operation::Op("IALOAD", iaload, vec![]);
m[0xD3] = Operation::Op("IASTORE", iastore, vec![]);
m[0xD4] = Operation::Op("GC", gc, vec![]);
} }
#[cfg(feature = "bonus:network")] #[cfg(feature = "bonus:network")]
@@ -69,13 +85,14 @@ lazy_static! {
m[0xE5] = Operation::Op("NETCLOSE", netclose, vec![]); m[0xE5] = Operation::Op("NETCLOSE", netclose, vec![]);
} }
#[cfg(feature = "bonus:heap")] #[cfg(feature = "extra:sleep")]
{ {
m[0xD1] = Operation::Op("NEWARRAY", newarray, vec![]); m[0xF0] = Operation::Op("SLP", slp, vec![Args::Byte]);
m[0xD2] = Operation::Op("IALOAD", iaload, vec![]);
m[0xD3] = Operation::Op("IASTORE", iastore, vec![]);
m[0xD4] = Operation::Op("GC", gc, vec![]);
} }
m[0xFC] = Operation::Op("IN", _in, vec![]);
m[0xFD] = Operation::Op("OUT", out, vec![]);
m[0xFE] = Operation::Op("ERR", err, vec![]);
m[0xFF] = Operation::Op("HALT", halt, vec![]);
m m
}; };
@@ -293,18 +310,34 @@ fn slp(machine: &mut Machine) -> Result<()> {
#[cfg(feature = "bonus:network")] #[cfg(feature = "bonus:network")]
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()?;
machine.net.bind(port as u16)
let result = match machine.net.bind(port as u16) {
Ok(_) => 1,
Err(_) => 0,
};
machine.cur_stack().push(Value::Int(result));
Ok(())
} }
#[cfg(feature = "bonus:network")] #[cfg(feature = "bonus:network")]
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()?;
machine.net.connect(host as u32, port as u16) let result = match machine.net.connect(host as u32, port as u16) {
Ok(_) => 1,
Err(_) => 0,
};
machine.cur_stack().push(Value::Int(result));
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()?;
if netref != 1 {
return Err("Invalid netref to netin");
}
let byte = i32::from(machine.net.read_byte()?); let byte = i32::from(machine.net.read_byte()?);
machine.cur_stack().push(Value::Int(byte)); machine.cur_stack().push(Value::Int(byte));
Ok(()) Ok(())
@@ -312,12 +345,21 @@ fn netin(machine: &mut Machine) -> Result<()> {
#[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()?;
if netref != 1 {
return Err("Invalid netref to netout");
}
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) machine.net.write_byte(val as u8)
} }
#[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()?;
if netref != 1 {
return Err("Invalid netref to netclose");
}
machine.net.close() machine.net.close()
} }
@@ -367,3 +409,40 @@ fn gc(machine: &mut Machine) -> Result<()> {
machine.heap.gc(); machine.heap.gc();
Ok(()) Ok(())
} }
#[cfg(feature = "extra:arithmetic")]
fn shl(machine: &mut Machine) -> Result<()> {
let shift: i32 = machine.cur_stack().pop()?.try_into()?;
let value: i32 = machine.cur_stack().pop()?.try_into()?;
machine.cur_stack().push(Value::Int(value << shift));
Ok(())
}
#[cfg(feature = "extra:arithmetic")]
fn shr(machine: &mut Machine) -> Result<()> {
let shift: i32 = machine.cur_stack().pop()?.try_into()?;
let value: i32 = machine.cur_stack().pop()?.try_into()?;
let result: u32 = (value as u32) >> (shift as u32);
machine.cur_stack().push(Value::Int(result as i32));
Ok(())
}
#[cfg(feature = "extra:arithmetic")]
fn imul(machine: &mut Machine) -> Result<()> {
let a: i32 = machine.cur_stack().pop()?.try_into()?;
let b: i32 = machine.cur_stack().pop()?.try_into()?;
machine.cur_stack().push(Value::Int(a * b));
Ok(())
}
#[cfg(feature = "extra:arithmetic")]
fn idiv(machine: &mut Machine) -> Result<()> {
let divisor: i32 = machine.cur_stack().pop()?.try_into()?;
let value: i32 = machine.cur_stack().pop()?.try_into()?;
machine.cur_stack().push(Value::Int(value / divisor));
Ok(())
}