ableos/hbasm/src/label.rs

81 lines
2.2 KiB
Rust
Raw Normal View History

use {
2023-10-27 20:29:02 -05:00
crate::SharedObject,
2024-02-14 04:45:58 -06:00
rhai::{Engine, FuncRegistration, ImmutableString, Module},
};
2024-02-03 20:08:20 -06:00
macro_rules! shdm_fns {
(
module: $module:expr;
shared: $shared:expr => $shname:ident;
$(
2024-02-14 04:45:58 -06:00
$vis:ident fn $name:ident($($param_name:ident: $param_ty:ty),*) $(-> $ret:ty)? $blk:block
2024-02-03 20:08:20 -06:00
)*
) => {{
let module = $module;
let shared = $shared;
$({
2024-02-14 04:45:58 -06:00
2024-02-03 20:08:20 -06:00
let $shname = SharedObject::clone(&shared);
2024-02-14 04:45:58 -06:00
FuncRegistration::new(stringify!($name))
.with_namespace(rhai::FnNamespace::Global)
.set_into_module::<_, { ["", $(stringify!($param_name)),*].len() - 1 }, false, _, true, _>(
module,
move |$($param_name: $param_ty),*| $(-> $ret)? {
let mut $shname = $shname.borrow_mut();
$blk
}
);
2024-02-03 20:08:20 -06:00
})*
}};
}
2023-10-27 20:29:02 -05:00
#[derive(Clone, Copy, Debug)]
pub struct UnboundLabel(pub usize);
pub fn setup(engine: &mut Engine, module: &mut Module, object: SharedObject) {
2024-02-03 20:08:20 -06:00
shdm_fns! {
module: module;
shared: object => obj;
global fn label() {
2023-10-27 20:29:02 -05:00
let symbol = obj.symbol(crate::object::Section::Text);
Ok(symbol)
2024-02-03 20:08:20 -06:00
}
2023-10-27 20:29:02 -05:00
2024-02-03 20:08:20 -06:00
global fn label(label: ImmutableString) {
2023-10-27 20:29:02 -05:00
let symbol = obj.symbol(crate::object::Section::Text);
obj.labels.insert(label, symbol.0);
Ok(symbol)
2024-02-03 20:08:20 -06:00
}
2023-10-27 20:29:02 -05:00
2024-02-03 20:08:20 -06:00
global fn declabel() {
2023-10-27 20:29:02 -05:00
let index = obj.symbols.len();
obj.symbols.push(None);
Ok(UnboundLabel(index))
2024-02-03 20:08:20 -06:00
}
2023-10-27 20:29:02 -05:00
2024-02-03 20:08:20 -06:00
global fn declabel(label: ImmutableString) {
2023-10-27 20:29:02 -05:00
let index = obj.symbols.len();
obj.symbols.push(None);
obj.labels.insert(label, index);
Ok(UnboundLabel(index))
2024-02-03 20:08:20 -06:00
}
2023-10-27 20:29:02 -05:00
2024-02-03 20:08:20 -06:00
global fn here(label: UnboundLabel) {
2023-10-27 20:29:02 -05:00
obj.symbols[label.0] = Some(crate::object::SymbolEntry {
location: crate::object::Section::Text,
offset: obj.sections.text.len(),
});
Ok(())
2024-02-03 20:08:20 -06:00
}
2023-10-27 20:29:02 -05:00
}
engine.register_type_with_name::<UnboundLabel>("UnboundLabel");
}