Added emscripten jmp instructions

This commit is contained in:
Syrus 2018-12-18 17:21:12 -08:00
parent 903e3223dd
commit 87c3c037e4
2 changed files with 38 additions and 0 deletions

View File

@ -0,0 +1,34 @@
use libc::{c_void, c_int};
use crate::webassembly::Instance;
/// setjmp
pub extern "C" fn __setjmp(
env_addr: u32,
instance: &mut Instance,
) -> c_int {
debug!("emscripten::__setjmp (setjmp)");
unsafe {
let env = instance.memory_offset_addr(0, env_addr as usize) as *mut c_void;
setjmp(env)
}
}
/// longjmp
pub extern "C" fn __longjmp(
env_addr: u32,
val: c_int,
instance: &mut Instance,
) -> ! {
debug!("emscripten::__longjmp (longjmp) {}", val);
unsafe {
let env = instance.memory_offset_addr(0, env_addr as usize) as *mut c_void;
longjmp(env, val)
};
}
extern "C" {
fn setjmp(env: *mut c_void) -> c_int;
fn longjmp(env: *mut c_void, val: c_int) -> !;
}

View File

@ -8,6 +8,7 @@ mod env;
mod errno;
mod exception;
mod io;
mod jmp;
mod lock;
mod math;
mod memory;
@ -479,6 +480,9 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> {
);
import_object.set("asm2wasm", "f64-rem", ImportValue::Func(math::f64_rem as _));
import_object.set("env", "__setjmp", ImportValue::Func(jmp::__setjmp as _));
import_object.set("env", "__longjmp", ImportValue::Func(jmp::__longjmp as _));
mock_external!(import_object, _waitpid);
mock_external!(import_object, _utimes);
mock_external!(import_object, _usleep);