Skip to main content

tycho_vm/instr/
mod.rs

1use std::sync::OnceLock;
2
3use anyhow::Result;
4
5use self::arithops::ArithOps;
6use self::cellops::CellOps;
7use self::cmpops::CmpOps;
8use self::configops::ConfigOps;
9use self::contops::ContOps;
10use self::cryptops::CryptOps;
11use self::currencyops::CurrencyOps;
12use self::debugops::DebugOps;
13use self::dictops::DictOps;
14use self::gasops::GasOps;
15use self::logicops::LogicOps;
16use self::messageops::MessageOps;
17use self::randops::RandOps;
18use self::sizeops::SizeOps;
19use self::stackops::StackOps;
20use self::tupleops::TupleOps;
21use crate::dispatch::{DispatchTable, Opcodes};
22
23mod arithops;
24mod cellops;
25mod cmpops;
26mod configops;
27mod contops;
28mod cryptops;
29mod currencyops;
30mod debugops;
31mod dictops;
32mod gasops;
33mod logicops;
34mod messageops;
35mod randops;
36mod sizeops;
37mod stackops;
38mod tupleops;
39
40/// Codepage resolver.
41pub fn codepage(n: u16) -> Option<&'static DispatchTable> {
42    match n {
43        0 => Some(codepage0()),
44        _ => None,
45    }
46}
47
48/// Default codepage.
49pub fn codepage0() -> &'static DispatchTable {
50    fn build() -> Result<DispatchTable> {
51        let mut cp = DispatchTable::builder(0);
52        ArithOps.init(&mut cp)?;
53        CmpOps.init(&mut cp)?;
54        LogicOps.init(&mut cp)?;
55        CellOps.init(&mut cp)?;
56        ContOps.init(&mut cp)?;
57        StackOps.init(&mut cp)?;
58        TupleOps.init(&mut cp)?;
59        DebugOps.init(&mut cp)?;
60        DictOps.init(&mut cp)?;
61        GasOps.init(&mut cp)?;
62        RandOps.init(&mut cp)?;
63        ConfigOps.init(&mut cp)?;
64        MessageOps.init(&mut cp)?;
65        CryptOps.init(&mut cp)?;
66        CurrencyOps.init(&mut cp)?;
67        SizeOps.init(&mut cp)?;
68        Ok(cp.build())
69    }
70
71    static CP0: OnceLock<DispatchTable> = OnceLock::new();
72    CP0.get_or_init(|| build().unwrap())
73}
74
75trait Module {
76    fn init(&self, opcodes: &mut Opcodes) -> Result<()>;
77}