Add multi net conn

This commit is contained in:
2022-06-12 00:29:47 +02:00
parent 8bd11678ab
commit 3c15045e60
3 changed files with 58 additions and 29 deletions

View File

@@ -26,7 +26,7 @@ pub struct Machine {
pub frame: Vec<Frame>,
#[cfg(feature = "bonus.network")]
pub net: NetStack,
pub net: Vec<NetStack>,
#[cfg(feature = "bonus.heap")]
pub heap: Heaps,
@@ -46,7 +46,7 @@ impl Machine {
stream_out: Arc::new(Mutex::new(::std::io::stdout())),
#[cfg(feature = "bonus.network")]
net: NetStack::new(),
net: Vec::new(),
#[cfg(feature = "bonus.heap")]
heap: Heaps::new(),

View File

@@ -6,6 +6,7 @@ use std::num::Wrapping;
use Result;
use value::Value;
use std::convert::TryInto;
use netstack::NetStack;
pub type OpFunc = fn(&mut Machine) -> Result<()>;
@@ -179,8 +180,15 @@ fn halt(machine: &mut Machine) -> Result<()> {
fn ifeq(machine: &mut Machine) -> Result<()> {
let offset = i32::from(machine.block.read_i16()?) - JUMP_OFFSET;
let compare: i32 = machine.cur_stack().pop()?.try_into()?;
if compare == 0 {
let tos = machine.cur_stack().pop()?;
// 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);
}
Ok(())
@@ -311,11 +319,16 @@ fn slp(machine: &mut Machine) -> Result<()> {
fn netbind(machine: &mut Machine) -> Result<()> {
let port: i32 = machine.cur_stack().pop()?.try_into()?;
let result = match machine.net.bind(port as u16) {
Ok(_) => 1,
Err(_) => 0,
};
machine.cur_stack().push(Value::Int(result));
let mut stack = NetStack::new();
if stack.bind(port as u16).is_err() {
machine.cur_stack().push(Value::Int(0));
return Ok(());
}
machine.net.push(stack);
let idx = machine.net.len();
machine.cur_stack().push(Value::NetRef(idx));
Ok(())
}
@@ -323,44 +336,54 @@ fn netbind(machine: &mut Machine) -> Result<()> {
fn netconnect(machine: &mut Machine) -> Result<()> {
let port: 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,
Err(_) => 0,
};
machine.cur_stack().push(Value::Int(result));
let mut stack = NetStack::new();
if stack.connect(host as u32, port as u16).is_err() {
machine.cur_stack().push(Value::Int(0));
return Ok(());
}
machine.net.push(stack);
let idx = machine.net.len();
machine.cur_stack().push(Value::NetRef(idx));
Ok(())
}
#[cfg(feature = "bonus.network")]
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 idx = match machine.cur_stack().pop()? {
Value::NetRef(x) => x,
_ => 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));
Ok(())
}
#[cfg(feature = "bonus.network")]
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 idx = match machine.cur_stack().pop()? {
Value::NetRef(x) => x,
_ => Err("Invalid netref given to network instruction")?,
};
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")]
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()
let idx = match machine.cur_stack().pop()? {
Value::NetRef(x) => x,
_ => Err("Invalid netref given to network instruction")?,
};
machine.net.get_mut(idx - 1).ok_or("Invalid network connection")?.close()?;
Ok(())
}
#[cfg(feature = "bonus.heap")]

View File

@@ -6,6 +6,8 @@ use heap::Heap;
pub enum Value {
Int(i32),
HeapRef(Heap),
#[cfg(feature = "bonus.network")]
NetRef(usize),
}
impl TryInto<i32> for Value {
@@ -15,6 +17,8 @@ impl TryInto<i32> for Value {
match self {
Value::Int(a) => Ok(a),
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 {
Value::Int(a) => Ok(a),
Value::HeapRef(_) => Err("Cannot use HeapRef as i32"),
#[cfg(feature = "bonus.network")]
Value::NetRef(_) => Err("Cannot use NetRef as i32"),
}
}
}