alduin 0.0.1

WIP: A toy compiler backend
Documentation
use alduin::compiler::compiled_code::Symbol;
use alduin::compiler::graph::{BaseGraphBuilder, Graph, Signature, Type};
use alduin::rt::vm::VirtualMachine;
use alduin::rt::Value;

#[test]
fn simple_func_call() {
    let vm = VirtualMachine::new();
    vm.add(Symbol::named("add_one"), {
        let graph = Graph::new(Signature(vec![Type::I32], Type::I32));
        let mut builder = BaseGraphBuilder::new(graph);
        let start = builder.new_start();
        builder.bind(start);

        let param = builder.new_param::<i32>(0);
        let one = builder.new_constant::<i32>(1);
        let ret = builder.new_add(param, one);
        builder.new_return(Some(ret));

        builder.finalize()
    });

    let code = vm.resolve(&Symbol::named("add_one"));

    assert_eq!(code.invoke(&[Value::I32(233)]), Some(Value::I32(234)));
}

#[test]
fn chained_func_call_with_lazy_compilation() {
    let vm = VirtualMachine::new();
    vm.add(Symbol::named("add_one"), {
        let graph = Graph::new(Signature(vec![Type::I32], Type::I32));
        let mut builder = BaseGraphBuilder::new(graph);
        let start = builder.new_start();
        builder.bind(start);

        let param = builder.new_param::<i32>(0);
        let one = builder.new_constant::<i32>(1);
        let ret = builder.new_add(param, one);
        builder.new_return(Some(ret));

        builder.finalize()
    });

    vm.add(Symbol::named("add_two"), {
        let graph = Graph::new(Signature(vec![Type::I32], Type::I32));
        let mut builder = BaseGraphBuilder::new(graph);
        let start = builder.new_start();
        builder.bind(start);

        let param = builder.new_param::<i32>(0);
        let x = builder.new_call::<i32>(Symbol::named("add_one"), &[param.cast()]);
        let one = builder.new_constant::<i32>(1);
        let ret = builder.new_add(one, x);
        builder.new_return(Some(ret));

        builder.finalize()
    });

    vm.add(Symbol::named("add_three"), {
        let graph = Graph::new(Signature(vec![Type::I32], Type::I32));
        let mut builder = BaseGraphBuilder::new(graph);
        let start = builder.new_start();
        builder.bind(start);

        let param = builder.new_param::<i32>(0);
        let x = builder.new_call::<i32>(Symbol::named("add_two"), &[param.cast()]);
        let one = builder.new_constant::<i32>(1);
        let ret = builder.new_add(one, x);
        builder.new_return(Some(ret));

        builder.finalize()
    });

    let code = vm.resolve(&Symbol::named("add_three"));

    assert_eq!(code.invoke(&[Value::I32(233)]), Some(Value::I32(236)));
}