v86/src/rust/wasmgen/c_api.rs

93 lines
2.2 KiB
Rust
Raw Normal View History

2018-06-29 20:46:21 +02:00
use util::PackedStr;
2018-06-29 20:46:21 +02:00
pub use wasmgen::module_init::wg_setup;
use wasmgen::module_init::get_module;
#[no_mangle]
2018-06-25 22:45:44 +02:00
pub fn wg_get_code_section() -> *mut Vec<u8> {
2018-06-30 03:39:28 +02:00
&mut get_module().code_section
2018-06-22 18:24:28 +02:00
}
#[no_mangle]
2018-06-25 20:58:24 +02:00
pub fn wg_get_instruction_body() -> *mut Vec<u8> {
2018-06-22 18:24:28 +02:00
&mut get_module().instruction_body
}
#[no_mangle]
2018-06-25 20:58:24 +02:00
pub fn wg_reset() {
let m = get_module();
m.reset();
}
#[no_mangle]
2018-06-25 20:58:24 +02:00
pub fn wg_finish(no_of_locals_i32: u8) {
let m = get_module();
m.finish(no_of_locals_i32);
}
#[no_mangle]
2018-06-25 20:58:24 +02:00
pub fn wg_get_fn_idx(fn_name_a: u64, fn_name_b: u64, fn_name_c: u64, type_idx: u8) -> u16 {
2018-06-22 19:00:49 +02:00
let fn_name: PackedStr = (fn_name_a, fn_name_b, fn_name_c);
let m = get_module();
m.get_fn_idx(fn_name, type_idx)
}
#[no_mangle]
2018-06-25 20:58:24 +02:00
pub fn wg_get_op_ptr() -> *const u8 {
let m = get_module();
m.get_op_ptr()
}
#[no_mangle]
2018-06-25 20:58:24 +02:00
pub fn wg_get_op_len() -> usize {
let m = get_module();
m.get_op_len()
}
2018-06-22 18:24:28 +02:00
#[no_mangle]
2018-06-25 20:58:24 +02:00
pub fn wg_commit_instruction_body_to_cs() {
2018-06-22 18:24:28 +02:00
let m = get_module();
m.commit_instruction_body_cs();
}
#[cfg(test)]
mod tests {
use std::io::prelude::*;
use std::fs::File;
2018-06-29 20:46:21 +02:00
use util::*;
use wasmgen::c_api::*;
use wasmgen::wasm_util::*;
use wasmgen::module_init::*;
#[test]
fn c_api_test() {
2018-06-29 20:46:21 +02:00
wg_setup();
let m = get_module();
2018-06-30 03:39:28 +02:00
let cs = &mut get_module().code_section;
2018-06-22 18:24:28 +02:00
let instruction_body = &mut get_module().instruction_body;
wg_call_fn(cs, m.get_fn_idx(pack_str("foo"), FN0_TYPE_INDEX));
wg_call_fn(cs, m.get_fn_idx(pack_str("bar"), FN0_TYPE_INDEX));
2018-06-25 20:58:24 +02:00
wg_finish(2);
wg_reset();
2018-06-22 18:24:28 +02:00
wg_push_i32(cs, 2);
wg_call_fn(instruction_body, m.get_fn_idx(pack_str("baz"), FN1_RET_TYPE_INDEX));
2018-06-29 20:46:21 +02:00
wg_call_fn(instruction_body, m.get_fn_idx(pack_str("foo"), FN1_TYPE_INDEX));
2018-06-25 20:58:24 +02:00
wg_commit_instruction_body_to_cs();
2018-06-29 20:46:21 +02:00
wg_finish(0);
2018-06-25 20:58:24 +02:00
let op_ptr = wg_get_op_ptr();
let op_len = wg_get_op_len();
dbg_log!("op_ptr: {:?}, op_len: {:?}", op_ptr, op_len);
2018-06-29 20:46:21 +02:00
let mut f = File::create("build/wg_dummy_output.wasm").expect("creating wg_dummy_output.wasm");
2018-06-30 03:39:28 +02:00
f.write_all(&get_module().output).expect("write wg_dummy_output.wasm");
}
}
2018-06-29 20:46:21 +02:00