use block::Block;
use module::FunctionReturnType;
use module::Module;
pub mod block;
pub mod module;
mod vm;
use wasm_bindgen::prelude::*;
#[cfg(feature = "wee_alloc")]
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
#[derive(Clone, Debug)]
pub enum BINOP {
ADD,
SUBTRACT,
MULTIPLY,
DIVIDE,
REMAINDER,
LESS_THAN,
LARGER_THAN,
LESS_OR_EQ,
LARGER_OR_EQ,
NOT_EQ,
EQ,
AND,
OR,
XOR,
}
#[derive(Clone, Debug)]
pub enum OPTCODE {
LOAD_CONST {
data_type: BUILTIN_TYPES,
data: String,
},
CALL_FUNCTION {
name: String,
},
CALL_PRINT_FUNCTION {
newline: bool,
},
ADD,
SUBTRACT,
MULTIPLY,
DIVIDE,
REMAINDER,
LESS_THAN,
LARGER_THAN,
LESS_OR_EQ,
LARGER_OR_EQ,
NOT_EQ,
EQ,
OR,
AND,
XOR,
JUMP_IF_FALSE {
steps: usize,
},
JUMP {
steps: usize,
},
}
#[derive(Clone, Debug)]
pub enum BUILTIN_TYPES {
MAGIC_INT,
BOOL,
STRING,
}
pub struct CelsiumConfig {
is_wasm: bool,
}
pub struct CelsiumProgram {
modules: Vec<Module>,
config: CelsiumConfig,
}
impl CelsiumProgram {
pub fn new(is_wasm: bool) -> CelsiumProgram {
CelsiumProgram {
modules: vec![],
config: CelsiumConfig { is_wasm: is_wasm },
}
}
pub fn add_module(&mut self, module: &Module) {
self.modules.push(module.clone());
}
pub fn run_program(&self) {
let mut bytecode: Vec<OPTCODE> = vec![];
for module in &self.modules {
bytecode.append(&mut module.main_block.bytecode.clone());
}
vm::run(&bytecode, &self.config);
}
}
#[cfg(test)]
mod tests {
use self::module::{FunctionSignature, FUNC_VISIBILITY};
use super::*;
#[test]
fn it_works() {
let mut celsium = CelsiumProgram::new(false);
let mut main_module = Module::new("main", &mut celsium);
let mut main_block = Block::new();
let mut loop_block = Block::new();
loop_block.load_const(BUILTIN_TYPES::MAGIC_INT, "2");
loop_block.load_const(BUILTIN_TYPES::MAGIC_INT, "2");
loop_block.binop(BINOP::EQ);
loop_block.call_print_function(true);
main_block.define_simple_loop(loop_block, 2);
let mut i = 0;
while i < main_block.bytecode.len() {
println!("{} {:?}", i, main_block.bytecode[i]);
i += 1;
}
main_module.add_main_block(main_block);
celsium.add_module(&main_module);
celsium.run_program();
}
}