Clippy fixes, additional WASM registration work
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
@@ -1,13 +1,31 @@
|
||||
use crate::dynamic_data::DynamicLibrary;
|
||||
use crate::script_implementations::wasm::export_registry::register;
|
||||
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use wasmer::{Exports, Store};
|
||||
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use crate::static_data::StaticData;
|
||||
|
||||
/// Learned move registration
|
||||
mod learned_move;
|
||||
/// Pokemon registration
|
||||
mod pokemon;
|
||||
/// Turn choice registration
|
||||
mod turn_choice;
|
||||
|
||||
pub(crate) fn register(exports: &mut Exports, store: &Store, env: WebAssemblyEnv) {
|
||||
register! {
|
||||
fn dynamic_library_get_static_data(
|
||||
env: &WebAssemblyEnv,
|
||||
dynamic_lib: ExternRef<DynamicLibrary>,
|
||||
) -> ExternRef<StaticData> {
|
||||
ExternRef::new(env.data().as_ref(), dynamic_lib.value(env).unwrap().static_data())
|
||||
}
|
||||
manual manual_register
|
||||
}
|
||||
|
||||
/// Additional required manual registration
|
||||
fn manual_register(exports: &mut Exports, store: &Store, env: WebAssemblyEnv) {
|
||||
turn_choice::register(exports, store, env.clone());
|
||||
pokemon::register(exports, store, env.clone());
|
||||
learned_move::register(exports, store, env.clone());
|
||||
learned_move::register(exports, store, env);
|
||||
}
|
||||
|
||||
@@ -3,15 +3,17 @@ use std::mem::{align_of, forget};
|
||||
|
||||
use wasmer::{Exports, Store};
|
||||
|
||||
use crate::dynamic_data::DynamicLibrary;
|
||||
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use crate::static_data::{EffectParameter, StaticData};
|
||||
use crate::static_data::EffectParameter;
|
||||
use crate::StringKey;
|
||||
|
||||
/// Dynamic data registration
|
||||
mod dynamic_data;
|
||||
/// Static data registration
|
||||
mod static_data;
|
||||
|
||||
/// Register a single function.
|
||||
#[allow(unused_macros)]
|
||||
macro_rules! register_func {
|
||||
($exports: ident, $store: ident, $func: ident) => {
|
||||
@@ -19,6 +21,7 @@ macro_rules! register_func {
|
||||
};
|
||||
}
|
||||
|
||||
/// Register a single function that requires environment data.
|
||||
macro_rules! register_func_with_env {
|
||||
($exports: ident, $store: ident, $func: ident, $env: expr) => {
|
||||
$exports.insert(
|
||||
@@ -28,11 +31,15 @@ macro_rules! register_func_with_env {
|
||||
};
|
||||
}
|
||||
|
||||
/// Utility macro to register a bunch of WASM functions easily.
|
||||
macro_rules! register {
|
||||
(
|
||||
$(
|
||||
fn $name:ident($($par:ident: $par_type:ty),*$(,)?) $(-> $return:ty)? $block:block
|
||||
)*
|
||||
$(
|
||||
manual $manual_name:ident
|
||||
)?
|
||||
) => {
|
||||
pub(crate) fn register(exports: &mut crate::script_implementations::wasm::export_registry::Exports,
|
||||
store: &crate::script_implementations::wasm::export_registry::Store,
|
||||
@@ -46,7 +53,7 @@ macro_rules! register {
|
||||
) $(-> $return)* $block
|
||||
crate::script_implementations::wasm::export_registry::register_func_with_env!(exports, store, $name, env);
|
||||
)*
|
||||
|
||||
$( $manual_name(exports, store, env) )*
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -54,6 +61,7 @@ macro_rules! register {
|
||||
pub(crate) use register;
|
||||
pub(crate) use register_func_with_env;
|
||||
|
||||
/// Register the functions we expose to WASM.
|
||||
pub(crate) fn register_webassembly_funcs(exports: &mut Exports, store: &Store, env: WebAssemblyEnv) {
|
||||
register_func_with_env!(exports, store, _print, env);
|
||||
register_func_with_env!(exports, store, _error, env);
|
||||
@@ -64,7 +72,6 @@ pub(crate) fn register_webassembly_funcs(exports: &mut Exports, store: &Store, e
|
||||
|
||||
register_func_with_env!(exports, store, string_key_get_hash, env);
|
||||
register_func_with_env!(exports, store, string_key_get_str, env);
|
||||
register_func_with_env!(exports, store, dynamic_library_get_static_data, env);
|
||||
register_func_with_env!(exports, store, effect_parameter_get_type, env);
|
||||
register_func_with_env!(exports, store, effect_parameter_as_bool, env);
|
||||
register_func_with_env!(exports, store, effect_parameter_as_int, env);
|
||||
@@ -72,6 +79,7 @@ pub(crate) fn register_webassembly_funcs(exports: &mut Exports, store: &Store, e
|
||||
register_func_with_env!(exports, store, effect_parameter_as_string, env);
|
||||
}
|
||||
|
||||
/// Logging function for WASM.
|
||||
fn _print(env: &WebAssemblyEnv, p: u32, len: u32) {
|
||||
unsafe {
|
||||
let mem: *mut u8 = env.data().memory().data_ptr().offset(p as isize);
|
||||
@@ -81,6 +89,7 @@ fn _print(env: &WebAssemblyEnv, p: u32, len: u32) {
|
||||
}
|
||||
}
|
||||
|
||||
/// Triggers when WASM panics.
|
||||
#[track_caller]
|
||||
fn _error(env: &WebAssemblyEnv, message: u32, message_len: u32, file: u32, file_len: u32, line: u32, position: u32) {
|
||||
unsafe {
|
||||
@@ -95,14 +104,18 @@ fn _error(env: &WebAssemblyEnv, message: u32, message_len: u32, file: u32, file_
|
||||
}
|
||||
}
|
||||
|
||||
/// Get a single item from an earlier passed VecExternRef
|
||||
fn _vec_extern_ref_get_value(env: &WebAssemblyEnv, reference: u32, index: u32) -> u32 {
|
||||
env.data().get_extern_vec_ref_extern_ref(reference, index)
|
||||
}
|
||||
|
||||
/// Gets the hash value of a StringKey.
|
||||
fn string_key_get_hash(env: &WebAssemblyEnv, string_key: ExternRef<StringKey>) -> u32 {
|
||||
string_key.value(env).unwrap().hash()
|
||||
}
|
||||
|
||||
/// Get a null-terminated C string from a StringKey. Note that this involves a copy into WASM
|
||||
/// memory, so this is relatively heavy.
|
||||
fn string_key_get_str(env: &WebAssemblyEnv, string_key: ExternRef<StringKey>) -> u32 {
|
||||
let string_key = string_key.value(env).unwrap().str();
|
||||
let wasm_string_ptr = env
|
||||
@@ -112,18 +125,12 @@ fn string_key_get_str(env: &WebAssemblyEnv, string_key: ExternRef<StringKey>) ->
|
||||
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);
|
||||
wasm_string.insert(string_key.len(), 0_u8);
|
||||
forget(wasm_string);
|
||||
wasm_string_ptr.1
|
||||
}
|
||||
|
||||
fn dynamic_library_get_static_data(
|
||||
env: &WebAssemblyEnv,
|
||||
dynamic_lib: ExternRef<DynamicLibrary>,
|
||||
) -> ExternRef<StaticData> {
|
||||
ExternRef::new(env.data().as_ref(), dynamic_lib.value(env).unwrap().static_data())
|
||||
}
|
||||
|
||||
/// Gets the type of an EffectParameter
|
||||
fn effect_parameter_get_type(env: &WebAssemblyEnv, parameter: ExternRef<EffectParameter>) -> u8 {
|
||||
let v = parameter.value(env).unwrap();
|
||||
match v {
|
||||
@@ -134,6 +141,7 @@ fn effect_parameter_get_type(env: &WebAssemblyEnv, parameter: ExternRef<EffectPa
|
||||
}
|
||||
}
|
||||
|
||||
/// Gets the inner bool data of an EffectParameter. Panics if it's not a bool.
|
||||
fn effect_parameter_as_bool(env: &WebAssemblyEnv, parameter: ExternRef<EffectParameter>) -> u8 {
|
||||
let v = parameter.value(env).unwrap();
|
||||
match v {
|
||||
@@ -148,6 +156,7 @@ fn effect_parameter_as_bool(env: &WebAssemblyEnv, parameter: ExternRef<EffectPar
|
||||
}
|
||||
}
|
||||
|
||||
/// Gets the inner int data of an EffectParameter. Panics if it's not an int.
|
||||
fn effect_parameter_as_int(env: &WebAssemblyEnv, parameter: ExternRef<EffectParameter>) -> i64 {
|
||||
let v = parameter.value(env).unwrap();
|
||||
match v {
|
||||
@@ -156,6 +165,7 @@ fn effect_parameter_as_int(env: &WebAssemblyEnv, parameter: ExternRef<EffectPara
|
||||
}
|
||||
}
|
||||
|
||||
/// Gets the inner float data of an EffectParameter. Panics if it's not a float.
|
||||
fn effect_parameter_as_float(env: &WebAssemblyEnv, parameter: ExternRef<EffectParameter>) -> f32 {
|
||||
let v = parameter.value(env).unwrap();
|
||||
match v {
|
||||
@@ -164,6 +174,7 @@ fn effect_parameter_as_float(env: &WebAssemblyEnv, parameter: ExternRef<EffectPa
|
||||
}
|
||||
}
|
||||
|
||||
/// Gets the inner string data of an EffectParameter. Panics if it's not a string.
|
||||
fn effect_parameter_as_string(env: &WebAssemblyEnv, parameter: ExternRef<EffectParameter>) -> ExternRef<StringKey> {
|
||||
let v = parameter.value(env).unwrap();
|
||||
match v {
|
||||
|
||||
@@ -1,52 +1,52 @@
|
||||
use wasmer::{Exports, Store};
|
||||
|
||||
use crate::defines::LevelInt;
|
||||
use crate::script_implementations::wasm::export_registry::register_func_with_env;
|
||||
use crate::script_implementations::wasm::export_registry::register;
|
||||
use crate::script_implementations::wasm::extern_ref::ExternRef;
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyEnv;
|
||||
use crate::static_data::{ItemLibrary, LibrarySettings, MoveLibrary, SpeciesLibrary, StaticData, TypeLibrary};
|
||||
|
||||
/// Moves data registration
|
||||
mod moves;
|
||||
/// Species data registration
|
||||
mod species;
|
||||
|
||||
pub(crate) fn register(exports: &mut Exports, store: &Store, env: WebAssemblyEnv) {
|
||||
register_func_with_env!(exports, store, static_data_get_move_library, env);
|
||||
register_func_with_env!(exports, store, static_data_get_species_library, env);
|
||||
register_func_with_env!(exports, store, static_data_get_item_library, env);
|
||||
register_func_with_env!(exports, store, static_data_get_type_library, env);
|
||||
register_func_with_env!(exports, store, static_data_get_library_settings, env);
|
||||
register_func_with_env!(exports, store, library_settings_get_maximum_level, env);
|
||||
register! {
|
||||
fn static_data_get_move_library(env: &WebAssemblyEnv, data_library: ExternRef<StaticData>) -> ExternRef<MoveLibrary> {
|
||||
ExternRef::new(env.data().as_ref(), data_library.value(env).unwrap().moves())
|
||||
}
|
||||
|
||||
fn static_data_get_species_library(
|
||||
env: &WebAssemblyEnv,
|
||||
data_library: ExternRef<StaticData>,
|
||||
) -> ExternRef<SpeciesLibrary> {
|
||||
ExternRef::new(env.data().as_ref(), data_library.value(env).unwrap().species())
|
||||
}
|
||||
|
||||
fn static_data_get_item_library(env: &WebAssemblyEnv, data_library: ExternRef<StaticData>) -> ExternRef<ItemLibrary> {
|
||||
ExternRef::new(env.data().as_ref(), data_library.value(env).unwrap().items())
|
||||
}
|
||||
|
||||
fn static_data_get_type_library(env: &WebAssemblyEnv, data_library: ExternRef<StaticData>) -> ExternRef<TypeLibrary> {
|
||||
ExternRef::new(env.data().as_ref(), data_library.value(env).unwrap().types())
|
||||
}
|
||||
|
||||
fn static_data_get_library_settings(
|
||||
env: &WebAssemblyEnv,
|
||||
data_library: ExternRef<StaticData>,
|
||||
) -> ExternRef<LibrarySettings> {
|
||||
ExternRef::new(env.data().as_ref(), data_library.value(env).unwrap().settings())
|
||||
}
|
||||
|
||||
fn library_settings_get_maximum_level(env: &WebAssemblyEnv, data_library: ExternRef<LibrarySettings>) -> LevelInt {
|
||||
data_library.value(env).unwrap().maximum_level()
|
||||
}
|
||||
|
||||
manual manual_registration
|
||||
}
|
||||
|
||||
/// Additional required manual registration.
|
||||
fn manual_registration(exports: &mut Exports, store: &Store, env: WebAssemblyEnv) {
|
||||
moves::register(exports, store, env.clone());
|
||||
species::register(exports, store, env.clone());
|
||||
}
|
||||
|
||||
fn static_data_get_move_library(env: &WebAssemblyEnv, data_library: ExternRef<StaticData>) -> ExternRef<MoveLibrary> {
|
||||
ExternRef::new(env.data().as_ref(), data_library.value(env).unwrap().moves())
|
||||
}
|
||||
|
||||
fn static_data_get_species_library(
|
||||
env: &WebAssemblyEnv,
|
||||
data_library: ExternRef<StaticData>,
|
||||
) -> ExternRef<SpeciesLibrary> {
|
||||
ExternRef::new(env.data().as_ref(), data_library.value(env).unwrap().species())
|
||||
}
|
||||
|
||||
fn static_data_get_item_library(env: &WebAssemblyEnv, data_library: ExternRef<StaticData>) -> ExternRef<ItemLibrary> {
|
||||
ExternRef::new(env.data().as_ref(), data_library.value(env).unwrap().items())
|
||||
}
|
||||
|
||||
fn static_data_get_type_library(env: &WebAssemblyEnv, data_library: ExternRef<StaticData>) -> ExternRef<TypeLibrary> {
|
||||
ExternRef::new(env.data().as_ref(), data_library.value(env).unwrap().types())
|
||||
}
|
||||
|
||||
fn static_data_get_library_settings(
|
||||
env: &WebAssemblyEnv,
|
||||
data_library: ExternRef<StaticData>,
|
||||
) -> ExternRef<LibrarySettings> {
|
||||
ExternRef::new(env.data().as_ref(), data_library.value(env).unwrap().settings())
|
||||
}
|
||||
|
||||
fn library_settings_get_maximum_level(env: &WebAssemblyEnv, data_library: ExternRef<LibrarySettings>) -> LevelInt {
|
||||
data_library.value(env).unwrap().maximum_level()
|
||||
species::register(exports, store, env);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user