Heap bonus!
This commit is contained in:
44
src/ops.rs
44
src/ops.rs
@@ -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(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user