2023-10-22 08:08:45 -05:00
|
|
|
use {
|
2023-10-27 20:29:02 -05:00
|
|
|
crate::SharedObject,
|
|
|
|
rhai::{Engine, ImmutableString, Module},
|
2023-10-22 08:08:45 -05: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) {
|
|
|
|
{
|
|
|
|
let object = SharedObject::clone(&object);
|
|
|
|
let hash = module.set_native_fn("label", move || {
|
|
|
|
let mut obj = object.borrow_mut();
|
|
|
|
let symbol = obj.symbol(crate::object::Section::Text);
|
|
|
|
Ok(symbol)
|
|
|
|
});
|
|
|
|
|
|
|
|
module.update_fn_namespace(hash, rhai::FnNamespace::Global);
|
2023-10-22 08:08:45 -05:00
|
|
|
}
|
|
|
|
|
2023-10-27 20:29:02 -05:00
|
|
|
{
|
|
|
|
let object = SharedObject::clone(&object);
|
|
|
|
let hash = module.set_native_fn("label", move |label: ImmutableString| {
|
|
|
|
let mut obj = object.borrow_mut();
|
|
|
|
let symbol = obj.symbol(crate::object::Section::Text);
|
|
|
|
obj.labels.insert(label, symbol.0);
|
|
|
|
|
|
|
|
Ok(symbol)
|
2023-10-22 08:08:45 -05:00
|
|
|
});
|
2023-10-27 20:29:02 -05:00
|
|
|
|
|
|
|
module.update_fn_namespace(hash, rhai::FnNamespace::Global);
|
2023-10-22 08:08:45 -05:00
|
|
|
}
|
|
|
|
|
2023-10-27 20:29:02 -05:00
|
|
|
{
|
|
|
|
let object = SharedObject::clone(&object);
|
|
|
|
let hash = module.set_native_fn("declabel", move || {
|
|
|
|
let mut obj = object.borrow_mut();
|
|
|
|
|
|
|
|
let index = obj.symbols.len();
|
|
|
|
obj.symbols.push(None);
|
|
|
|
|
|
|
|
Ok(UnboundLabel(index))
|
|
|
|
});
|
|
|
|
|
|
|
|
module.update_fn_namespace(hash, rhai::FnNamespace::Global);
|
2023-10-22 08:08:45 -05:00
|
|
|
}
|
|
|
|
|
2023-10-27 20:29:02 -05:00
|
|
|
{
|
|
|
|
let object = SharedObject::clone(&object);
|
|
|
|
let hash = module.set_native_fn("declabel", move |label: ImmutableString| {
|
|
|
|
let mut obj = object.borrow_mut();
|
|
|
|
|
|
|
|
let index = obj.symbols.len();
|
|
|
|
obj.symbols.push(None);
|
|
|
|
obj.labels.insert(label, index);
|
|
|
|
|
|
|
|
Ok(UnboundLabel(index))
|
|
|
|
});
|
|
|
|
|
|
|
|
module.update_fn_namespace(hash, rhai::FnNamespace::Global);
|
2023-10-22 08:08:45 -05:00
|
|
|
}
|
2023-10-27 20:29:02 -05:00
|
|
|
|
|
|
|
{
|
|
|
|
module.set_native_fn("here", move |label: UnboundLabel| {
|
|
|
|
let mut obj = object.borrow_mut();
|
|
|
|
obj.symbols[label.0] = Some(crate::object::SymbolEntry {
|
|
|
|
location: crate::object::Section::Text,
|
|
|
|
offset: obj.sections.text.len(),
|
|
|
|
});
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
engine.register_type_with_name::<UnboundLabel>("UnboundLabel");
|
2023-10-22 08:08:45 -05:00
|
|
|
}
|