forked from MightyPork/crsn
cleanup, auto deref Wd, Wr, RdObj
This commit is contained in:
@@ -17,6 +17,12 @@ impl Rd {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<&Rd> for Rd {
|
||||||
|
fn from(a: &Rd) -> Self {
|
||||||
|
*a
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Display for Rd {
|
impl Display for Rd {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
write!(f, "{}", self.0) // TODO mask, when implemented
|
write!(f, "{}", self.0) // TODO mask, when implemented
|
||||||
@@ -43,6 +49,12 @@ impl RdObj {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<&RdObj> for RdObj {
|
||||||
|
fn from(a: &RdObj) -> Self {
|
||||||
|
*a
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Display for RdObj {
|
impl Display for RdObj {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
write!(f, "@{}", self.0)
|
write!(f, "@{}", self.0)
|
||||||
|
|||||||
@@ -31,6 +31,12 @@ impl Wr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<&Wr> for Wr {
|
||||||
|
fn from(a: &Wr) -> Self {
|
||||||
|
*a
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Display for Wr {
|
impl Display for Wr {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
write!(f, "{}", self.0)
|
write!(f, "{}", self.0)
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ impl OpTrait for BuiltinOp {
|
|||||||
Ok(pos) => {
|
Ok(pos) => {
|
||||||
let mut values = Vec::with_capacity(args.len());
|
let mut values = Vec::with_capacity(args.len());
|
||||||
for arg in args {
|
for arg in args {
|
||||||
values.push(state.read(*arg)?);
|
values.push(state.read(arg)?);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut frame2 = StackFrame::new(pos, &values);
|
let mut frame2 = StackFrame::new(pos, &values);
|
||||||
@@ -87,7 +87,7 @@ impl OpTrait for BuiltinOp {
|
|||||||
Some(previous) => {
|
Some(previous) => {
|
||||||
let mut values = Vec::with_capacity(retvals.len());
|
let mut values = Vec::with_capacity(retvals.len());
|
||||||
for arg in retvals {
|
for arg in retvals {
|
||||||
values.push(state.read(*arg)?);
|
values.push(state.read(arg)?);
|
||||||
}
|
}
|
||||||
state.frame = previous;
|
state.frame = previous;
|
||||||
state.frame.set_retvals(&values);
|
state.frame.set_retvals(&values);
|
||||||
@@ -98,16 +98,16 @@ impl OpTrait for BuiltinOp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
BuiltinOp::Skip(val) => {
|
BuiltinOp::Skip(val) => {
|
||||||
let steps = state.read(*val)?;
|
let steps = state.read(val)?;
|
||||||
res.advance = i64::from_ne_bytes(steps.to_ne_bytes());
|
res.advance = i64::from_ne_bytes(steps.to_ne_bytes());
|
||||||
let pc = state.get_pc();
|
let pc = state.get_pc();
|
||||||
program.validate_jump(pc, Addr((pc.0 as i64 + res.advance) as u64))?;
|
program.validate_jump(pc, Addr((pc.0 as i64 + res.advance) as u64))?;
|
||||||
}
|
}
|
||||||
BuiltinOp::MoveValue { dst, src } => {
|
BuiltinOp::MoveValue { dst, src } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let val = state.read(*src)?;
|
let val = state.read(src)?;
|
||||||
state.update_status(val);
|
state.update_status(val);
|
||||||
state.write(*dst, val)?;
|
state.write(dst, val)?;
|
||||||
}
|
}
|
||||||
BuiltinOp::SwapValues { a, b } => {
|
BuiltinOp::SwapValues { a, b } => {
|
||||||
let aa = state.read(a)?;
|
let aa = state.read(a)?;
|
||||||
@@ -117,14 +117,14 @@ impl OpTrait for BuiltinOp {
|
|||||||
}
|
}
|
||||||
BuiltinOp::StoreFlags { dst } => {
|
BuiltinOp::StoreFlags { dst } => {
|
||||||
let packed = state.frame.status.store();
|
let packed = state.frame.status.store();
|
||||||
state.write(*dst, packed)?;
|
state.write(dst, packed)?;
|
||||||
}
|
}
|
||||||
BuiltinOp::LoadFlags { src } => {
|
BuiltinOp::LoadFlags { src } => {
|
||||||
let x = state.read(*src)?;
|
let x = state.read(src)?;
|
||||||
state.frame.status.load(x);
|
state.frame.status.load(x);
|
||||||
}
|
}
|
||||||
BuiltinOp::Sleep { count: micros, unit_us } => {
|
BuiltinOp::Sleep { count: micros, unit_us } => {
|
||||||
std::thread::sleep(Duration::from_micros(state.read(*micros)? * unit_us.micros()))
|
std::thread::sleep(Duration::from_micros(state.read(micros)? * unit_us.micros()))
|
||||||
}
|
}
|
||||||
BuiltinOp::Delete(obj) => {
|
BuiltinOp::Delete(obj) => {
|
||||||
let x = state.read(Rd::new(RdData::Register(obj.reg())))?;
|
let x = state.read(Rd::new(RdData::Register(obj.reg())))?;
|
||||||
|
|||||||
@@ -88,8 +88,8 @@ impl RunState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Read object handle value
|
/// Read object handle value
|
||||||
pub fn read_obj(&mut self, rdo: RdObj) -> Result<Value, Fault> {
|
pub fn read_obj(&mut self, rdo: impl Into<RdObj>) -> Result<Value, Fault> {
|
||||||
self.read(Rd::new(RdData::Register(rdo.reg())))
|
self.read(Rd::new(RdData::Register(rdo.into().reg())))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Read a `Rd` value
|
/// Read a `Rd` value
|
||||||
|
|||||||
+48
-48
@@ -19,13 +19,13 @@ impl OpTrait for ArithOp {
|
|||||||
match self {
|
match self {
|
||||||
ArithOp::Test { a } => {
|
ArithOp::Test { a } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let res = state.read(*a)?;
|
let res = state.read(a)?;
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
}
|
}
|
||||||
ArithOp::Compare { a, b } => {
|
ArithOp::Compare { a, b } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*b)?;
|
let y = state.read(b)?;
|
||||||
state.set_flag(Cond::Equal, x == y);
|
state.set_flag(Cond::Equal, x == y);
|
||||||
state.set_flag(Cond::Lower, x < y);
|
state.set_flag(Cond::Lower, x < y);
|
||||||
state.set_flag(Cond::Greater, x > y);
|
state.set_flag(Cond::Greater, x > y);
|
||||||
@@ -36,9 +36,9 @@ impl OpTrait for ArithOp {
|
|||||||
}
|
}
|
||||||
ArithOp::RangeTest { val, a, b } => {
|
ArithOp::RangeTest { val, a, b } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let val = state.read(*val)?;
|
let val = state.read(val)?;
|
||||||
let a = state.read(*a)?;
|
let a = state.read(a)?;
|
||||||
let b = state.read(*b)?;
|
let b = state.read(b)?;
|
||||||
state.set_flag(Cond::Equal, val >= a && val <= b);
|
state.set_flag(Cond::Equal, val >= a && val <= b);
|
||||||
state.set_flag(Cond::Lower, val < a);
|
state.set_flag(Cond::Lower, val < a);
|
||||||
state.set_flag(Cond::Greater, val > b);
|
state.set_flag(Cond::Greater, val > b);
|
||||||
@@ -46,8 +46,8 @@ impl OpTrait for ArithOp {
|
|||||||
}
|
}
|
||||||
ArithOp::Add { dst, a, b } => {
|
ArithOp::Add { dst, a, b } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*b)?;
|
let y = state.read(b)?;
|
||||||
let (res, ov) = if let Some(v) = x.checked_add(y) {
|
let (res, ov) = if let Some(v) = x.checked_add(y) {
|
||||||
(v, false)
|
(v, false)
|
||||||
} else {
|
} else {
|
||||||
@@ -55,12 +55,12 @@ impl OpTrait for ArithOp {
|
|||||||
};
|
};
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.set_flag(Cond::Overflow, ov);
|
state.set_flag(Cond::Overflow, ov);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
ArithOp::Sub { dst, a, b } => {
|
ArithOp::Sub { dst, a, b } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*b)?;
|
let y = state.read(b)?;
|
||||||
let (res, ov) = if let Some(v) = x.checked_sub(y) {
|
let (res, ov) = if let Some(v) = x.checked_sub(y) {
|
||||||
(v, false)
|
(v, false)
|
||||||
} else {
|
} else {
|
||||||
@@ -68,12 +68,12 @@ impl OpTrait for ArithOp {
|
|||||||
};
|
};
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.set_flag(Cond::Overflow, ov);
|
state.set_flag(Cond::Overflow, ov);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
ArithOp::Mul { dst, a, b } => {
|
ArithOp::Mul { dst, a, b } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*b)?;
|
let y = state.read(b)?;
|
||||||
let res = if let Some(v) = x.checked_mul(y) {
|
let res = if let Some(v) = x.checked_mul(y) {
|
||||||
v
|
v
|
||||||
} else {
|
} else {
|
||||||
@@ -81,12 +81,12 @@ impl OpTrait for ArithOp {
|
|||||||
x.wrapping_mul(y)
|
x.wrapping_mul(y)
|
||||||
};
|
};
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
ArithOp::Div { dst, rem, a, div } => {
|
ArithOp::Div { dst, rem, a, div } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let d = state.read(*div)?;
|
let d = state.read(div)?;
|
||||||
if d == 0 {
|
if d == 0 {
|
||||||
state.set_flag(Cond::Invalid, true);
|
state.set_flag(Cond::Invalid, true);
|
||||||
} else {
|
} else {
|
||||||
@@ -97,14 +97,14 @@ impl OpTrait for ArithOp {
|
|||||||
};
|
};
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.set_flag(Cond::Overflow, ov);
|
state.set_flag(Cond::Overflow, ov);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
state.write(*rem, remainder)?;
|
state.write(rem, remainder)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ArithOp::Mod { dst, a, div } => {
|
ArithOp::Mod { dst, a, div } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let d = state.read(*div)?;
|
let d = state.read(div)?;
|
||||||
if d == 0 {
|
if d == 0 {
|
||||||
state.set_flag(Cond::Invalid, true);
|
state.set_flag(Cond::Invalid, true);
|
||||||
} else {
|
} else {
|
||||||
@@ -115,90 +115,90 @@ impl OpTrait for ArithOp {
|
|||||||
};
|
};
|
||||||
state.update_status(remainder);
|
state.update_status(remainder);
|
||||||
state.set_flag(Cond::Overflow, ov);
|
state.set_flag(Cond::Overflow, ov);
|
||||||
state.write(*dst, remainder)?;
|
state.write(dst, remainder)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ArithOp::And { dst, a, b } => {
|
ArithOp::And { dst, a, b } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*b)?;
|
let y = state.read(b)?;
|
||||||
let res = x & y;
|
let res = x & y;
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
ArithOp::Or { dst, a, b } => {
|
ArithOp::Or { dst, a, b } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*b)?;
|
let y = state.read(b)?;
|
||||||
let res = x | y;
|
let res = x | y;
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
ArithOp::Xor { dst, a, b } => {
|
ArithOp::Xor { dst, a, b } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*b)?;
|
let y = state.read(b)?;
|
||||||
let res = x ^ y;
|
let res = x ^ y;
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
ArithOp::Cpl { dst, a } => {
|
ArithOp::Cpl { dst, a } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let res = !x;
|
let res = !x;
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
ArithOp::Rol { dst, a, n } => {
|
ArithOp::Rol { dst, a, n } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*n)?;
|
let y = state.read(n)?;
|
||||||
if y > u32::MAX as u64 {
|
if y > u32::MAX as u64 {
|
||||||
state.set_flag(Cond::Invalid, true);
|
state.set_flag(Cond::Invalid, true);
|
||||||
} else {
|
} else {
|
||||||
let res = x.rotate_left(y as u32);
|
let res = x.rotate_left(y as u32);
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ArithOp::Ror { dst, a, n } => {
|
ArithOp::Ror { dst, a, n } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*n)?;
|
let y = state.read(n)?;
|
||||||
if y > u32::MAX as u64 {
|
if y > u32::MAX as u64 {
|
||||||
state.set_flag(Cond::Invalid, true);
|
state.set_flag(Cond::Invalid, true);
|
||||||
} else {
|
} else {
|
||||||
let res = x.rotate_right(y as u32);
|
let res = x.rotate_right(y as u32);
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ArithOp::Lsl { dst, a, n } => {
|
ArithOp::Lsl { dst, a, n } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*n)?;
|
let y = state.read(n)?;
|
||||||
let res = x << y;
|
let res = x << y;
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
ArithOp::Lsr { dst, a, n } => {
|
ArithOp::Lsr { dst, a, n } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*n)?;
|
let y = state.read(n)?;
|
||||||
let res = x >> y;
|
let res = x >> y;
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
ArithOp::Asr { dst, a, n } => {
|
ArithOp::Asr { dst, a, n } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*a)?;
|
let x = state.read(a)?;
|
||||||
let y = state.read(*n)?;
|
let y = state.read(n)?;
|
||||||
if y > u32::MAX as u64 {
|
if y > u32::MAX as u64 {
|
||||||
state.set_flag(Cond::Invalid, true);
|
state.set_flag(Cond::Invalid, true);
|
||||||
} else {
|
} else {
|
||||||
let res = x.signed_shr(y as u32);
|
let res = x.signed_shr(y as u32);
|
||||||
state.update_status(res);
|
state.update_status(res);
|
||||||
state.write(*dst, res)?;
|
state.write(dst, res)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-28
@@ -27,7 +27,7 @@ impl OpTrait for BufOps {
|
|||||||
|
|
||||||
let que = match value {
|
let que = match value {
|
||||||
BufValue::Zeros(len) => {
|
BufValue::Zeros(len) => {
|
||||||
let len = state.read(*len)? as usize;
|
let len = state.read(len)? as usize;
|
||||||
let mut que = VecDeque::with_capacity(len);
|
let mut que = VecDeque::with_capacity(len);
|
||||||
que.resize(len, 0);
|
que.resize(len, 0);
|
||||||
que
|
que
|
||||||
@@ -35,7 +35,7 @@ impl OpTrait for BufOps {
|
|||||||
BufValue::Values(vals) => {
|
BufValue::Values(vals) => {
|
||||||
let mut que = VecDeque::with_capacity(vals.len());
|
let mut que = VecDeque::with_capacity(vals.len());
|
||||||
for val in vals {
|
for val in vals {
|
||||||
que.push_back(state.read(*val)?);
|
que.push_back(state.read(val)?);
|
||||||
}
|
}
|
||||||
que
|
que
|
||||||
}
|
}
|
||||||
@@ -50,13 +50,13 @@ impl OpTrait for BufOps {
|
|||||||
|
|
||||||
let data: &mut ExtData = state.ext_mut();
|
let data: &mut ExtData = state.ext_mut();
|
||||||
data.store.insert(id, que);
|
data.store.insert(id, que);
|
||||||
state.write(*dst, id)?;
|
state.write(dst, id)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
BufOps::Push { obj, src } => {
|
BufOps::Push { obj, src } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let val = state.read(*src)?;
|
let val = state.read(src)?;
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(obj)?;
|
||||||
let stacks: &mut ExtData = state.ext_mut();
|
let stacks: &mut ExtData = state.ext_mut();
|
||||||
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
||||||
stack.push_back(val);
|
stack.push_back(val);
|
||||||
@@ -64,12 +64,12 @@ impl OpTrait for BufOps {
|
|||||||
|
|
||||||
BufOps::Pop { dst, obj } => {
|
BufOps::Pop { dst, obj } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(obj)?;
|
||||||
let stacks: &mut ExtData = state.ext_mut();
|
let stacks: &mut ExtData = state.ext_mut();
|
||||||
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
||||||
if let Some(val) = stack.pop_back() {
|
if let Some(val) = stack.pop_back() {
|
||||||
let empty = stack.is_empty();
|
let empty = stack.is_empty();
|
||||||
state.write(*dst, val)?;
|
state.write(dst, val)?;
|
||||||
state.update_status(val);
|
state.update_status(val);
|
||||||
state.set_flag(Cond::Empty, empty);
|
state.set_flag(Cond::Empty, empty);
|
||||||
} else {
|
} else {
|
||||||
@@ -80,14 +80,14 @@ impl OpTrait for BufOps {
|
|||||||
|
|
||||||
BufOps::Read { dst, obj, idx } => {
|
BufOps::Read { dst, obj, idx } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(obj)?;
|
||||||
let idx = state.read(*idx)?;
|
let idx = state.read(idx)?;
|
||||||
let stacks: &mut ExtData = state.ext_mut();
|
let stacks: &mut ExtData = state.ext_mut();
|
||||||
let stack = stacks.store.get(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
let stack = stacks.store.get(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
||||||
if let Some(val) = stack.get(idx as usize) {
|
if let Some(val) = stack.get(idx as usize) {
|
||||||
let val = *val;
|
let val = *val;
|
||||||
state.update_status(val);
|
state.update_status(val);
|
||||||
state.write(*dst, val)?;
|
state.write(dst, val)?;
|
||||||
} else {
|
} else {
|
||||||
state.set_flag(Cond::Overflow, true);
|
state.set_flag(Cond::Overflow, true);
|
||||||
}
|
}
|
||||||
@@ -95,19 +95,19 @@ impl OpTrait for BufOps {
|
|||||||
|
|
||||||
BufOps::GetLen { dst, obj } => {
|
BufOps::GetLen { dst, obj } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(obj)?;
|
||||||
let stacks: &mut ExtData = state.ext_mut();
|
let stacks: &mut ExtData = state.ext_mut();
|
||||||
let stack = stacks.store.get(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
let stack = stacks.store.get(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
||||||
let val = stack.len() as Value;
|
let val = stack.len() as Value;
|
||||||
state.write(*dst, val)?;
|
state.write(dst, val)?;
|
||||||
state.update_status(val);
|
state.update_status(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
BufOps::Write { obj, idx, value } => {
|
BufOps::Write { obj, idx, value } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(obj)?;
|
||||||
let val = state.read(*value)?;
|
let val = state.read(value)?;
|
||||||
let idx = state.read(*idx)? as usize;
|
let idx = state.read(idx)? as usize;
|
||||||
let stacks: &mut ExtData = state.ext_mut();
|
let stacks: &mut ExtData = state.ext_mut();
|
||||||
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
||||||
if idx < stack.len() {
|
if idx < stack.len() {
|
||||||
@@ -121,9 +121,9 @@ impl OpTrait for BufOps {
|
|||||||
|
|
||||||
BufOps::Insert { obj, idx, value } => {
|
BufOps::Insert { obj, idx, value } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(obj)?;
|
||||||
let val = state.read(*value)?;
|
let val = state.read(value)?;
|
||||||
let idx = state.read(*idx)? as usize;
|
let idx = state.read(idx)? as usize;
|
||||||
let stacks: &mut ExtData = state.ext_mut();
|
let stacks: &mut ExtData = state.ext_mut();
|
||||||
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
||||||
if idx < stack.len() {
|
if idx < stack.len() {
|
||||||
@@ -137,15 +137,15 @@ impl OpTrait for BufOps {
|
|||||||
|
|
||||||
BufOps::Remove { dst, obj, idx } => {
|
BufOps::Remove { dst, obj, idx } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(obj)?;
|
||||||
let idx = state.read(*idx)? as usize;
|
let idx = state.read(idx)? as usize;
|
||||||
let stacks: &mut ExtData = state.ext_mut();
|
let stacks: &mut ExtData = state.ext_mut();
|
||||||
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
||||||
if idx < stack.len() {
|
if idx < stack.len() {
|
||||||
let val = stack.remove(idx).unwrap();
|
let val = stack.remove(idx).unwrap();
|
||||||
let empty = stack.is_empty();
|
let empty = stack.is_empty();
|
||||||
state.update_status(val);
|
state.update_status(val);
|
||||||
state.write(*dst, val)?;
|
state.write(dst, val)?;
|
||||||
state.set_flag(Cond::Empty, empty);
|
state.set_flag(Cond::Empty, empty);
|
||||||
} else {
|
} else {
|
||||||
state.set_flag(Cond::Overflow, true);
|
state.set_flag(Cond::Overflow, true);
|
||||||
@@ -153,15 +153,15 @@ impl OpTrait for BufOps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BufOps::Resize { obj, len } => {
|
BufOps::Resize { obj, len } => {
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(obj)?;
|
||||||
let len = state.read(*len)? as usize;
|
let len = state.read(len)? as usize;
|
||||||
let stacks: &mut ExtData = state.ext_mut();
|
let stacks: &mut ExtData = state.ext_mut();
|
||||||
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
||||||
stack.resize(len, 0);
|
stack.resize(len, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
BufOps::Reverse { obj } => {
|
BufOps::Reverse { obj } => {
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(obj)?;
|
||||||
let stacks: &mut ExtData = state.ext_mut();
|
let stacks: &mut ExtData = state.ext_mut();
|
||||||
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
||||||
let len = stack.len();
|
let len = stack.len();
|
||||||
@@ -177,8 +177,8 @@ impl OpTrait for BufOps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BufOps::AppendBuf { obj, obj2 } => {
|
BufOps::AppendBuf { obj, obj2 } => {
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(obj)?;
|
||||||
let handle2 = state.read_obj(*obj2)?;
|
let handle2 = state.read_obj(obj2)?;
|
||||||
let stacks: &mut ExtData = state.ext_mut();
|
let stacks: &mut ExtData = state.ext_mut();
|
||||||
let stack2 = stacks.store.get(&handle2).ok_or_else(|| Fault::ObjectNotExist(handle))?.clone();
|
let stack2 = stacks.store.get(&handle2).ok_or_else(|| Fault::ObjectNotExist(handle))?.clone();
|
||||||
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
||||||
@@ -186,8 +186,8 @@ impl OpTrait for BufOps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BufOps::PrependBuf { obj, obj2 } => {
|
BufOps::PrependBuf { obj, obj2 } => {
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(obj)?;
|
||||||
let handle2 = state.read_obj(*obj2)?;
|
let handle2 = state.read_obj(obj2)?;
|
||||||
let stacks: &mut ExtData = state.ext_mut();
|
let stacks: &mut ExtData = state.ext_mut();
|
||||||
let stack2 = stacks.store.get(&handle2).ok_or_else(|| Fault::ObjectNotExist(handle))?.clone();
|
let stack2 = stacks.store.get(&handle2).ok_or_else(|| Fault::ObjectNotExist(handle))?.clone();
|
||||||
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
let stack = stacks.store.get_mut(&handle).ok_or_else(|| Fault::ObjectNotExist(handle))?;
|
||||||
|
|||||||
+15
-15
@@ -57,13 +57,13 @@ impl OpTrait for ScreenOp {
|
|||||||
let eres = EvalRes::default();
|
let eres = EvalRes::default();
|
||||||
match self {
|
match self {
|
||||||
ScreenOp::ScreenInit { width, height } => {
|
ScreenOp::ScreenInit { width, height } => {
|
||||||
let w = state.read(*width)?;
|
let w = state.read(width)?;
|
||||||
let h = state.read(*height)?;
|
let h = state.read(height)?;
|
||||||
init(state, w, h)?;
|
init(state, w, h)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScreenOp::Erase { color } => {
|
ScreenOp::Erase { color } => {
|
||||||
let color = (state.read(*color)? & 0xffffff) as u32;
|
let color = (state.read(color)? & 0xffffff) as u32;
|
||||||
let backend: &mut Backend = state.ext_mut();
|
let backend: &mut Backend = state.ext_mut();
|
||||||
for n in 0..(backend.buffer.len()) {
|
for n in 0..(backend.buffer.len()) {
|
||||||
backend.buffer[n] = color;
|
backend.buffer[n] = color;
|
||||||
@@ -72,8 +72,8 @@ impl OpTrait for ScreenOp {
|
|||||||
|
|
||||||
ScreenOp::SetOpt { opt, val } => {
|
ScreenOp::SetOpt { opt, val } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let opt = state.read(*opt)?;
|
let opt = state.read(opt)?;
|
||||||
let val = state.read(*val)?;
|
let val = state.read(val)?;
|
||||||
let backend: &mut Backend = state.ext_mut();
|
let backend: &mut Backend = state.ext_mut();
|
||||||
|
|
||||||
match opt {
|
match opt {
|
||||||
@@ -93,7 +93,7 @@ impl OpTrait for ScreenOp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ScreenOp::Blit { force } => {
|
ScreenOp::Blit { force } => {
|
||||||
let force = state.read(*force)?;
|
let force = state.read(force)?;
|
||||||
let backend: &mut Backend = state.ext_mut();
|
let backend: &mut Backend = state.ext_mut();
|
||||||
|
|
||||||
if force != 0 {
|
if force != 0 {
|
||||||
@@ -122,9 +122,9 @@ impl OpTrait for ScreenOp {
|
|||||||
|
|
||||||
ScreenOp::SetPixel { x, y, color } => {
|
ScreenOp::SetPixel { x, y, color } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let x = state.read(*x)?;
|
let x = state.read(x)?;
|
||||||
let y = state.read(*y)?;
|
let y = state.read(y)?;
|
||||||
let color = state.read(*color)?;
|
let color = state.read(color)?;
|
||||||
|
|
||||||
let backend: &mut Backend = state.ext_mut();
|
let backend: &mut Backend = state.ext_mut();
|
||||||
|
|
||||||
@@ -168,8 +168,8 @@ impl OpTrait for ScreenOp {
|
|||||||
let xval = xf.round() as u64;
|
let xval = xf.round() as u64;
|
||||||
let yval = yf.round() as u64;
|
let yval = yf.round() as u64;
|
||||||
|
|
||||||
state.write(*x, xval)?;
|
state.write(x, xval)?;
|
||||||
state.write(*y, yval)?;
|
state.write(y, yval)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -181,7 +181,7 @@ impl OpTrait for ScreenOp {
|
|||||||
|
|
||||||
ScreenOp::TestKey { pressed, code } => {
|
ScreenOp::TestKey { pressed, code } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let num = num2key(state.read(*code)?);
|
let num = num2key(state.read(code)?);
|
||||||
let backend: &mut Backend = state.ext_mut();
|
let backend: &mut Backend = state.ext_mut();
|
||||||
match &mut backend.window {
|
match &mut backend.window {
|
||||||
Some(w) => {
|
Some(w) => {
|
||||||
@@ -191,7 +191,7 @@ impl OpTrait for ScreenOp {
|
|||||||
}
|
}
|
||||||
Some(kn) => {
|
Some(kn) => {
|
||||||
let down = w.is_key_down(kn) as u64;
|
let down = w.is_key_down(kn) as u64;
|
||||||
state.write(*pressed, down)?;
|
state.write(pressed, down)?;
|
||||||
state.update_status(down);
|
state.update_status(down);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,7 +205,7 @@ impl OpTrait for ScreenOp {
|
|||||||
ScreenOp::TestMouse { pressed, button } => {
|
ScreenOp::TestMouse { pressed, button } => {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
|
|
||||||
let omb = match state.read(*button)? {
|
let omb = match state.read(button)? {
|
||||||
0 => Some(MouseButton::Left),
|
0 => Some(MouseButton::Left),
|
||||||
1 => Some(MouseButton::Right),
|
1 => Some(MouseButton::Right),
|
||||||
2 => Some(MouseButton::Middle),
|
2 => Some(MouseButton::Middle),
|
||||||
@@ -220,7 +220,7 @@ impl OpTrait for ScreenOp {
|
|||||||
Some(w) => {
|
Some(w) => {
|
||||||
if let Some(mb) = omb {
|
if let Some(mb) = omb {
|
||||||
let is_pressed = w.get_mouse_down(mb) as u64;
|
let is_pressed = w.get_mouse_down(mb) as u64;
|
||||||
state.write(*pressed, is_pressed)?;
|
state.write(pressed, is_pressed)?;
|
||||||
state.update_status(is_pressed);
|
state.update_status(is_pressed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user