Skip to main content

vihaco_cpu/execute/values/
logic.rs

1// SPDX-FileCopyrightText: 2026 The vihaco Authors
2// SPDX-License-Identifier: MIT
3
4use 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}