c_api.rs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. use util::PackedStr;
  2. use wasmgen::module_init::get_module;
  3. pub use wasmgen::module_init::wg_setup;
  4. #[no_mangle]
  5. pub fn wg_get_code_section() -> *mut Vec<u8> { &mut get_module().code_section }
  6. #[no_mangle]
  7. pub fn wg_get_instruction_body() -> *mut Vec<u8> { &mut get_module().instruction_body }
  8. #[no_mangle]
  9. pub fn wg_reset() {
  10. let m = get_module();
  11. m.reset();
  12. }
  13. #[no_mangle]
  14. pub fn wg_finish(no_of_locals_i32: u8) {
  15. let m = get_module();
  16. m.finish(no_of_locals_i32);
  17. }
  18. #[no_mangle]
  19. pub fn wg_get_fn_idx(fn_name_a: u64, fn_name_b: u64, fn_name_c: u64, type_idx: u8) -> u16 {
  20. let fn_name: PackedStr = (fn_name_a, fn_name_b, fn_name_c);
  21. let m = get_module();
  22. m.get_fn_idx(fn_name, type_idx)
  23. }
  24. #[no_mangle]
  25. pub fn wg_get_op_ptr() -> *const u8 {
  26. let m = get_module();
  27. m.get_op_ptr()
  28. }
  29. #[no_mangle]
  30. pub fn wg_get_op_len() -> usize {
  31. let m = get_module();
  32. m.get_op_len()
  33. }
  34. #[no_mangle]
  35. pub fn wg_commit_instruction_body_to_cs() {
  36. let m = get_module();
  37. m.commit_instruction_body_cs();
  38. }
  39. #[cfg(test)]
  40. mod tests {
  41. use std::fs::File;
  42. use std::io::prelude::*;
  43. use util::*;
  44. use wasmgen::c_api::*;
  45. use wasmgen::module_init::*;
  46. use wasmgen::wasm_util::*;
  47. #[test]
  48. fn c_api_test() {
  49. wg_setup();
  50. let m = get_module();
  51. let cs = &mut get_module().code_section;
  52. let instruction_body = &mut get_module().instruction_body;
  53. wg_call_fn(cs, m.get_fn_idx(pack_str("foo"), FN0_TYPE_INDEX));
  54. wg_call_fn(cs, m.get_fn_idx(pack_str("bar"), FN0_TYPE_INDEX));
  55. wg_finish(2);
  56. wg_reset();
  57. wg_push_i32(cs, 2);
  58. wg_call_fn(
  59. instruction_body,
  60. m.get_fn_idx(pack_str("baz"), FN1_RET_TYPE_INDEX),
  61. );
  62. wg_call_fn(
  63. instruction_body,
  64. m.get_fn_idx(pack_str("foo"), FN1_TYPE_INDEX),
  65. );
  66. wg_commit_instruction_body_to_cs();
  67. wg_finish(0);
  68. let op_ptr = wg_get_op_ptr();
  69. let op_len = wg_get_op_len();
  70. dbg_log!("op_ptr: {:?}, op_len: {:?}", op_ptr, op_len);
  71. let mut f =
  72. File::create("build/wg_dummy_output.wasm").expect("creating wg_dummy_output.wasm");
  73. f.write_all(&get_module().output)
  74. .expect("write wg_dummy_output.wasm");
  75. }
  76. }