mrubyedge-cli 1.1.12

mruby/edge cli endpoint - run, compile to wasm, etc.
Documentation
#![allow(unused_variables)]
#![allow(non_snake_case)]
#![allow(unused_imports)]
extern crate mrubyedge;

use core::mem::MaybeUninit;
use std::rc::Rc;
use std::cell::RefCell;
use std::any::Any;

use mrubyedge::yamrb::value::*;

const DATA: &'static [u8] = include_bytes!("./{{ file_basename }}.mrb");
const MEMORY_INDEX: u32 = 0;
const PAGE_SIZE: usize = 65536; // 64KB

#[cfg(target_arch = "wasm32")]
#[no_mangle]
pub unsafe fn __mrbe_grow(num_pages: usize) -> *const u8 {
    use core::arch::wasm32;
    let num_pages = wasm32::memory_grow(MEMORY_INDEX, num_pages);
    if num_pages == usize::max_value() {
        return usize::max_value() as *const u8;
    }
    let ptr = (num_pages * PAGE_SIZE) as *const u8;
    ptr
}

extern "C" {
{% for fn in ftypes_imports %}
    fn {{ fn.func_name }}({{ fn.args_decl }}) {{ fn.rettype_decl }};
{% endfor %}
}

{% for fn in ftypes_imports %}
{{ fn.import_helper_var }}
fn __imported_c_{{ fn.func_name }}(_vm: &mut mrubyedge::yamrb::vm::VM, args: &[Rc<RObject>]) -> Result<Rc<RObject>, mrubyedge::Error> {
{{ fn.imported_body }}
}
{% endfor %}

static mut MRUBY_VM: MaybeUninit<mrubyedge::yamrb::vm::VM> = MaybeUninit::uninit();
static mut MRUBY_VM_LOADED: bool = false;

#[allow(static_mut_refs)]
unsafe fn assume_initialized_VM() -> &'static mut mrubyedge::yamrb::vm::VM {
    if !MRUBY_VM_LOADED {
        initVM();
        MRUBY_VM_LOADED = true;
    }
    MRUBY_VM.assume_init_mut()
}

fn initVM() {
    let mut rite = mrubyedge::rite::load(DATA).unwrap();
    let mut vm = mrubyedge::yamrb::vm::VM::open(&mut rite);

{% for ifn in ftypes_imports %}
    let klass = vm.object_class.clone();
    let method = Box::new(__imported_c_{{ ifn.func_name }});
    mrubyedge::yamrb::helpers::mrb_define_cmethod(&mut vm, klass, "{{ ifn.func_name }}", method);
{% endfor %}

    vm.run().unwrap();

    unsafe {
        MRUBY_VM = core::mem::MaybeUninit::new(vm);
    }
}

{% for fn in ftypes %}

{{ fn.exported_helper_var }}
#[no_mangle]
pub fn {{ fn.func_name }}({{ fn.args_decl }}) {{ fn.rettype_decl }} {
    let mut vm = unsafe { assume_initialized_VM() };

    {{ fn.str_args_converter }}

    vm.run().unwrap();

    let args = {{ fn.args_let_vec }};
    let retval: Result<Rc<RObject>, mrubyedge::Error> = 
        mrubyedge::yamrb::helpers::mrb_funcall(
            &mut vm,
            None,
            "{{ fn.func_name }}",
            &args);

    match &retval {
        Ok(retval) => {
	    {{ fn.handle_retval }}
        }
        Err(ex) => {
            dbg!(ex);
            panic!("mruby error");
        }
    }
}
{% endfor %}