Heap bonus!

This commit is contained in:
2018-05-23 14:22:01 +02:00
parent 7e044abb53
commit a652dc1a17
6 changed files with 120 additions and 3 deletions

View File

@@ -53,6 +53,13 @@ pub fn num_to_op(op: u8) -> Operation {
#[cfg(feature = "bonus:network")]
0xE5 => Operation::Op("NETCLOSE", netclose),
#[cfg(feature = "bonus:heap")]
0xD1 => Operation::Op("NEWARRAY", newarray),
#[cfg(feature = "bonus:heap")]
0xD2 => Operation::Op("IALOAD", iaload),
#[cfg(feature = "bonus:heap")]
0xD3 => Operation::Op("IASTORE", iastore),
x => Operation::Invalid(x)
}
}
@@ -282,4 +289,39 @@ fn netout(machine: &mut Machine) -> Result<()> {
#[cfg(feature = "bonus:network")]
fn netclose(machine: &mut Machine) -> Result<()> {
machine.net.close()
}
}
#[cfg(feature = "bonus:heap")]
fn newarray(machine: &mut Machine) -> Result<()> {
let size = machine.cur_stack().pop()? as usize;
let heapref = machine.heap.alloc(size);
machine.cur_stack().push(heapref as i32);
Ok(())
}
#[cfg(feature = "bonus:heap")]
fn iastore(machine: &mut Machine) -> Result<()> {
let heapref = machine.cur_stack().pop()? as usize;
let index = machine.cur_stack().pop()? as usize;
let value = machine.cur_stack().pop()?;
let heap = machine.heap.get(heapref);
heap[index] = value;
Ok(())
}
#[cfg(feature = "bonus:heap")]
fn iaload(machine: &mut Machine) -> Result<()> {
let heapref = machine.cur_stack().pop()? as usize;
let index = machine.cur_stack().pop()? as usize;
let value: i32;
{
let heap = machine.heap.get(heapref);
value = heap[index];
}
machine.cur_stack().push(value);
Ok(())
}