Major fixes for WebAssembly
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
use core::ffi::c_char;
|
||||
use std::ffi::CString;
|
||||
use std::mem::align_of;
|
||||
use std::mem::{align_of, forget};
|
||||
|
||||
use wasmer::{Exports, Function, Store};
|
||||
|
||||
@@ -10,6 +9,7 @@ use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use crate::static_data::{DataLibrary, MoveData, MoveLibrary, StaticData};
|
||||
use crate::StringKey;
|
||||
|
||||
#[allow(unused_macros)]
|
||||
macro_rules! register_func {
|
||||
($exports: ident, $store: ident, $func: ident) => {
|
||||
$exports.insert(stringify!($func), Function::new_native($store, $func));
|
||||
@@ -39,19 +39,22 @@ pub(crate) fn register_webassembly_funcs(exports: &mut Exports, store: &Store, e
|
||||
|
||||
fn _print(env: &WebAssemblyEnv, p: u32, len: u32) {
|
||||
unsafe {
|
||||
let mem: *mut u8 = env.resolver().memory().data_ptr().offset(p as isize);
|
||||
let mem: *mut u8 = env.data().memory().data_ptr().offset(p as isize);
|
||||
let s = String::from_raw_parts(mem, len as usize, len as usize);
|
||||
println!("{}", s);
|
||||
forget(s);
|
||||
}
|
||||
}
|
||||
|
||||
fn _error(env: &WebAssemblyEnv, message: u32, message_len: u32, file: u32, file_len: u32, line: u32, position: u32) {
|
||||
unsafe {
|
||||
let mem: *mut u8 = env.resolver().memory().data_ptr().offset(message as isize);
|
||||
let mem: *mut u8 = env.data().memory().data_ptr().offset(message as isize);
|
||||
let message = String::from_raw_parts(mem, message_len as usize, message_len as usize);
|
||||
let mem: *mut u8 = env.resolver().memory().data_ptr().offset(file as isize);
|
||||
let mem: *mut u8 = env.data().memory().data_ptr().offset(file as isize);
|
||||
let file = String::from_raw_parts(mem, file_len as usize, file_len as usize);
|
||||
println!("Error: {} in file {}, line: {}:{}", message, file, line, position);
|
||||
forget(message);
|
||||
forget(file);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,7 +62,7 @@ fn move_library_get_move_by_hash(env: &WebAssemblyEnv, lib: ExternRef<MoveLibrar
|
||||
let lib = lib.value(env).unwrap();
|
||||
let m = lib.get_by_hash(hash);
|
||||
if let Some(v) = m {
|
||||
ExternRef::new(env, v)
|
||||
ExternRef::new(env.data().as_ref(), v)
|
||||
} else {
|
||||
ExternRef::null()
|
||||
}
|
||||
@@ -67,7 +70,7 @@ fn move_library_get_move_by_hash(env: &WebAssemblyEnv, lib: ExternRef<MoveLibrar
|
||||
|
||||
fn move_data_get_name(env: &WebAssemblyEnv, move_data: ExternRef<MoveData>) -> ExternRef<StringKey> {
|
||||
let move_data = move_data.value(env).unwrap();
|
||||
ExternRef::new(env, move_data.name())
|
||||
ExternRef::new(env.data().as_ref(), move_data.name())
|
||||
}
|
||||
|
||||
fn move_data_get_base_power(env: &WebAssemblyEnv, move_data: ExternRef<MoveData>) -> u8 {
|
||||
@@ -80,12 +83,15 @@ fn const_string_get_hash(env: &WebAssemblyEnv, string_key: ExternRef<StringKey>)
|
||||
|
||||
fn const_string_get_str(env: &WebAssemblyEnv, string_key: ExternRef<StringKey>) -> u32 {
|
||||
let string_key = string_key.value(env).unwrap().str();
|
||||
let s: CString = CString::new(string_key.as_bytes()).unwrap();
|
||||
let wasm_string_ptr = env
|
||||
.resolver()
|
||||
.allocate_mem(string_key.len() as u32, align_of::<CString>() as u32);
|
||||
let mut wasm_string = unsafe { CString::from_raw(wasm_string_ptr.0 as *mut c_char) };
|
||||
s.clone_into(&mut wasm_string);
|
||||
.data()
|
||||
.allocate_mem((string_key.len() + 1) as u32, align_of::<CString>() as u32);
|
||||
let mut wasm_string: Vec<u8> =
|
||||
unsafe { Vec::from_raw_parts(wasm_string_ptr.0, string_key.len() + 1, string_key.len() + 1) };
|
||||
wasm_string.resize(string_key.len() + 1, 0);
|
||||
string_key.as_bytes().clone_into(&mut wasm_string);
|
||||
wasm_string.insert(string_key.len(), 0 as u8);
|
||||
forget(wasm_string);
|
||||
wasm_string_ptr.1
|
||||
}
|
||||
|
||||
@@ -93,9 +99,9 @@ fn battle_library_get_data_library(
|
||||
env: &WebAssemblyEnv,
|
||||
dynamic_lib: ExternRef<DynamicLibrary>,
|
||||
) -> ExternRef<StaticData> {
|
||||
ExternRef::new(env, dynamic_lib.value(env).unwrap().static_data())
|
||||
ExternRef::new(env.data().as_ref(), dynamic_lib.value(env).unwrap().static_data())
|
||||
}
|
||||
|
||||
fn data_library_get_move_library(env: &WebAssemblyEnv, data_library: ExternRef<StaticData>) -> ExternRef<MoveLibrary> {
|
||||
ExternRef::new(env, data_library.value(env).unwrap().moves())
|
||||
ExternRef::new(env.data().as_ref(), data_library.value(env).unwrap().moves())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user