Add multi net conn
This commit is contained in:
@@ -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(),
|
||||||
|
|||||||
77
src/ops.rs
77
src/ops.rs
@@ -6,6 +6,7 @@ use std::num::Wrapping;
|
|||||||
use Result;
|
use Result;
|
||||||
use value::Value;
|
use value::Value;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
|
use 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")]
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ use heap::Heap;
|
|||||||
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"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user