vihaco_cpu/execute/values/
logic.rs1use crate::{CPU, cpu};
5use vihaco_runtime::{Execute, PopFromStack, PushToStack};
6
7impl Execute<cpu::Not> for CPU {
8 type Message = PopFromStack<(bool,)>;
9 type Effect = PushToStack<(bool,)>;
10 type Error = eyre::Report;
11
12 fn execute(
13 &mut self,
14 _: &cpu::Not,
15 PopFromStack((operand,)): Self::Message,
16 ) -> eyre::Result<Self::Effect> {
17 let value = !operand;
18 Ok(PushToStack((value,)))
19 }
20}
21
22impl Execute<cpu::And> for CPU {
23 type Message = PopFromStack<(bool, bool)>;
24 type Effect = PushToStack<(bool,)>;
25 type Error = eyre::Report;
26
27 fn execute(
28 &mut self,
29 _: &cpu::And,
30 PopFromStack((lhs, rhs)): Self::Message,
31 ) -> eyre::Result<Self::Effect> {
32 Ok(PushToStack((lhs && rhs,)))
33 }
34}
35
36impl Execute<cpu::Or> for CPU {
37 type Message = PopFromStack<(bool, bool)>;
38 type Effect = PushToStack<(bool,)>;
39 type Error = eyre::Report;
40
41 fn execute(
42 &mut self,
43 _: &cpu::Or,
44 PopFromStack((lhs, rhs)): Self::Message,
45 ) -> eyre::Result<Self::Effect> {
46 Ok(PushToStack((lhs || rhs,)))
47 }
48}
49
50impl Execute<cpu::Xor> for CPU {
51 type Message = PopFromStack<(bool, bool)>;
52 type Effect = PushToStack<(bool,)>;
53 type Error = eyre::Report;
54
55 fn execute(
56 &mut self,
57 _: &cpu::Xor,
58 PopFromStack((lhs, rhs)): Self::Message,
59 ) -> eyre::Result<Self::Effect> {
60 Ok(PushToStack((lhs ^ rhs,)))
61 }
62}