neige_lua/vm/
arith.rs

1use neige_infra::{LuaArith, LuaCompare};
2
3use crate::{
4    api::{ArithApi, CompareApi, LuaVm, StackApi},
5    state::LuaState,
6};
7
8use super::utils::{u16_isize, u8_isize};
9
10impl LuaState {
11    pub(super) fn inline_compare(&mut self, op: LuaCompare, a: &u8, b: &u16, c: &u16) {
12        let a = u8_isize(a);
13        let b = u16_isize(b);
14        let c = u16_isize(c);
15        self.get_rk(b);
16        self.get_rk(c);
17        if self.compare(-2, -1, op) != (a != 0) {
18            self.add_pc(1)
19        }
20        self.pop(2)
21    }
22
23    pub(super) fn binary_arith(&mut self, op: LuaArith, a: &u8, b: &u16, c: &u16) {
24        let a = u8_isize(a) + 1;
25        let b = u16_isize(b);
26        let c = u16_isize(c);
27        self.get_rk(b);
28        self.get_rk(c);
29        self.arith(op);
30        self.replace(a);
31    }
32
33    pub(super) fn unary_arith(&mut self, op: LuaArith, a: &u8, b: &u16) {
34        let a = u8_isize(a) + 1;
35        let b = u16_isize(b) + 1;
36        self.push_value(b);
37        self.arith(op);
38        self.replace(a);
39    }
40}