tin-lang 0.2.2

tin: a statically structurally typed embeddable programming language
Documentation
use std::alloc;
use std::num;

use codegen::abi_type;
use codegen::abi_type::AbiType::*;

#[derive(Debug)]
pub struct Builtin {
    pub symbol: &'static str,
    pub ptr: *const u8,
    pub signature: abi_type::AbiSignature<'static>,
}

macro_rules! builtins {
    ($(($name:ident, $builtin:ident, $params:expr, $returns:expr),)*) => {
        $(
            pub const $name: Builtin = builtin!($builtin, $params, $returns);
        )*

        pub const BUILTINS: &[Builtin] = {
            &[
                $($name),*
            ]
        };
    }
}

macro_rules! builtin {
    ($builtin:ident, $params:expr, $returns:expr) => {
        Builtin {
            symbol: concat!("@builtin:", stringify!($builtin)),
            ptr: $builtin as *const u8,
            signature: abi_type::AbiSignature {
                params: $params,
                returns: $returns,
            },
        }
    };
}

builtins! {
    (ALLOC, alloc, &[Ptr, Ptr], &[Ptr]),
    (DEALLOC, dealloc, &[Ptr, Ptr, Ptr], &[]),
}

unsafe extern "C" fn alloc(size: usize, align: num::NonZeroUsize) -> *mut u8 {
    let layout = alloc::Layout::from_size_align_unchecked(size, align.get());
    let ptr = alloc::alloc(layout);
    debug!("alloc size={:?} align={:?} ptr={:?}", size, align, ptr);
    ptr
}

unsafe extern "C" fn dealloc(ptr: *mut u8, size: usize, align: num::NonZeroUsize) {
    let layout = alloc::Layout::from_size_align_unchecked(size, align.get());
    debug!("dealloc ptr={:?} size={:?} align={:?}", ptr, size, align);
    alloc::dealloc(ptr, layout);
}