wasmer/src/apis/emscripten/process.rs

51 lines
1.2 KiB
Rust
Raw Normal View History

use libc::{abort, c_char, pid_t, c_int, fork, exit};
2018-11-20 19:11:58 +00:00
2018-11-22 04:59:23 +00:00
use crate::webassembly::Instance;
2018-11-20 19:11:58 +00:00
use std::ffi::CStr;
2018-11-24 14:55:21 +00:00
pub extern "C" fn abort_with_message(message: &str) {
2018-11-21 03:24:23 +00:00
debug!("emscripten::abort_with_message");
2018-11-20 19:11:58 +00:00
println!("{}", message);
_abort();
}
pub extern "C" fn _abort() {
2018-11-21 03:24:23 +00:00
debug!("emscripten::_abort");
2018-11-22 04:59:23 +00:00
unsafe {
abort();
}
2018-11-20 19:11:58 +00:00
}
pub extern "C" fn _fork(_instance: &mut Instance) -> pid_t {
debug!("emscripten::_fork");
// unsafe {
// fork()
// }
-1
}
pub extern "C" fn _exit(status: c_int, _instance: &mut Instance) -> ! {
debug!("emscripten::_exit");
unsafe {
exit(status)
}
}
2018-11-20 19:11:58 +00:00
pub extern "C" fn em_abort(message: u32, instance: &mut Instance) {
2018-11-21 03:24:23 +00:00
debug!("emscripten::em_abort");
2018-11-20 19:11:58 +00:00
let message_addr = instance.memory_offset_addr(0, message as usize) as *mut c_char;
unsafe {
let message = CStr::from_ptr(message_addr)
.to_str()
.unwrap_or("Unexpected abort");
abort_with_message(message);
}
}
2018-11-24 14:55:21 +00:00
pub extern "C" fn abort_stack_overflow() {
debug!("emscripten::abort_stack_overflow");
// TODO: Message incomplete. Need to finish em runtime data first
abort_with_message("Stack overflow! Attempted to allocate some bytes on the stack");
2018-11-20 19:11:58 +00:00
}