Fixes memory issue
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
7682704945
commit
9472c1cec2
|
@ -11,6 +11,7 @@
|
||||||
#![feature(is_some_with)]
|
#![feature(is_some_with)]
|
||||||
#![feature(core_ffi_c)]
|
#![feature(core_ffi_c)]
|
||||||
#![feature(new_uninit)]
|
#![feature(new_uninit)]
|
||||||
|
#![feature(get_mut_unchecked)]
|
||||||
|
|
||||||
//! PkmnLib
|
//! PkmnLib
|
||||||
//! PkmnLib is a full featured implementation of Pokemon. while currently focused on implementing
|
//! PkmnLib is a full featured implementation of Pokemon. while currently focused on implementing
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
use core::ffi::c_char;
|
use core::ffi::c_char;
|
||||||
use std::borrow::Cow;
|
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
use std::mem::{align_of, size_of};
|
use std::mem::align_of;
|
||||||
|
|
||||||
use wasmer::wasmparser::Data;
|
|
||||||
use wasmer::{Exports, Function, Store};
|
use wasmer::{Exports, Function, Store};
|
||||||
|
|
||||||
use crate::dynamic_data::DynamicLibrary;
|
use crate::dynamic_data::DynamicLibrary;
|
||||||
|
@ -82,7 +80,7 @@ fn const_string_get_hash(env: &WebAssemblyEnv, string_key: ExternRef<StringKey>)
|
||||||
|
|
||||||
fn const_string_get_str(env: &WebAssemblyEnv, string_key: ExternRef<StringKey>) -> u32 {
|
fn const_string_get_str(env: &WebAssemblyEnv, string_key: ExternRef<StringKey>) -> u32 {
|
||||||
let string_key = string_key.value(env).str();
|
let string_key = string_key.value(env).str();
|
||||||
let mut s: CString = CString::new(string_key.as_bytes()).unwrap();
|
let s: CString = CString::new(string_key.as_bytes()).unwrap();
|
||||||
let wasm_string_ptr = env
|
let wasm_string_ptr = env
|
||||||
.resolver()
|
.resolver()
|
||||||
.allocate_mem(string_key.len() as u32, align_of::<CString>() as u32);
|
.allocate_mem(string_key.len() as u32, align_of::<CString>() as u32);
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
use std::any::{Any, TypeId};
|
|
||||||
use std::fmt::{Debug, Formatter};
|
use std::fmt::{Debug, Formatter};
|
||||||
use std::pin::Pin;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use hashbrown::{HashMap, HashSet};
|
use hashbrown::{HashMap, HashSet};
|
||||||
|
@ -46,7 +44,7 @@ struct ScriptCapabilitiesKey {
|
||||||
|
|
||||||
impl WebAssemblyScriptResolver {
|
impl WebAssemblyScriptResolver {
|
||||||
/// Instantiates a new WebAssemblyScriptResolver.
|
/// Instantiates a new WebAssemblyScriptResolver.
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Box<WebAssemblyScriptResolver> {
|
||||||
let config = Cranelift::default();
|
let config = Cranelift::default();
|
||||||
let mut features = Features::new();
|
let mut features = Features::new();
|
||||||
features.multi_value = true;
|
features.multi_value = true;
|
||||||
|
@ -54,7 +52,7 @@ impl WebAssemblyScriptResolver {
|
||||||
let universal = Universal::new(config).features(features);
|
let universal = Universal::new(config).features(features);
|
||||||
let engine = universal.engine();
|
let engine = universal.engine();
|
||||||
let store = Store::new(&engine);
|
let store = Store::new(&engine);
|
||||||
Self {
|
let s = Self {
|
||||||
engine,
|
engine,
|
||||||
store,
|
store,
|
||||||
module: Default::default(),
|
module: Default::default(),
|
||||||
|
@ -69,7 +67,8 @@ impl WebAssemblyScriptResolver {
|
||||||
extern_ref_pointers: Default::default(),
|
extern_ref_pointers: Default::default(),
|
||||||
extern_ref_pointers_lookup: Default::default(),
|
extern_ref_pointers_lookup: Default::default(),
|
||||||
extern_ref_type_lookup: Default::default(),
|
extern_ref_type_lookup: Default::default(),
|
||||||
}
|
};
|
||||||
|
Box::new(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Load a compiled WASM module.
|
/// Load a compiled WASM module.
|
||||||
|
@ -146,7 +145,7 @@ impl WebAssemblyScriptResolver {
|
||||||
/// its proper value, validates its type, and returns the value.
|
/// its proper value, validates its type, and returns the value.
|
||||||
pub fn get_extern_ref_value<T: UniqueTypeId<u64>>(&self, index: u32) -> &T {
|
pub fn get_extern_ref_value<T: UniqueTypeId<u64>>(&self, index: u32) -> &T {
|
||||||
let read_guard = self.extern_ref_pointers.read();
|
let read_guard = self.extern_ref_pointers.read();
|
||||||
let ptr = read_guard.get(index as usize).unwrap();
|
let ptr = read_guard.get((index - 1) as usize).unwrap();
|
||||||
let expected_type_id = self.extern_ref_type_lookup.read()[&ptr];
|
let expected_type_id = self.extern_ref_type_lookup.read()[&ptr];
|
||||||
if expected_type_id != T::id().0 {
|
if expected_type_id != T::id().0 {
|
||||||
panic!("Extern ref was accessed with wrong type");
|
panic!("Extern ref was accessed with wrong type");
|
||||||
|
|
|
@ -9,10 +9,10 @@ use project_root::get_project_root;
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
|
||||||
use pkmn_lib::defines::LevelInt;
|
use pkmn_lib::defines::LevelInt;
|
||||||
|
use pkmn_lib::dynamic_data::DynamicLibrary;
|
||||||
use pkmn_lib::dynamic_data::Gen7BattleStatCalculator;
|
use pkmn_lib::dynamic_data::Gen7BattleStatCalculator;
|
||||||
use pkmn_lib::dynamic_data::Gen7DamageLibrary;
|
use pkmn_lib::dynamic_data::Gen7DamageLibrary;
|
||||||
use pkmn_lib::dynamic_data::Gen7MiscLibrary;
|
use pkmn_lib::dynamic_data::Gen7MiscLibrary;
|
||||||
use pkmn_lib::dynamic_data::{DynamicLibrary, EmptyScriptResolver};
|
|
||||||
use pkmn_lib::script_implementations::wasm::script_resolver::WebAssemblyScriptResolver;
|
use pkmn_lib::script_implementations::wasm::script_resolver::WebAssemblyScriptResolver;
|
||||||
use pkmn_lib::static_data::{
|
use pkmn_lib::static_data::{
|
||||||
Ability, AbilityLibrary, BattleItemCategory, DataLibrary, EffectParameter, Form, GrowthRateLibrary, Item,
|
Ability, AbilityLibrary, BattleItemCategory, DataLibrary, EffectParameter, Form, GrowthRateLibrary, Item,
|
||||||
|
@ -34,14 +34,14 @@ pub fn load_library() -> DynamicLibrary {
|
||||||
load_moves(&path, &mut data);
|
load_moves(&path, &mut data);
|
||||||
load_species(&path, &mut data);
|
load_species(&path, &mut data);
|
||||||
let mut resolver = WebAssemblyScriptResolver::new();
|
let mut resolver = WebAssemblyScriptResolver::new();
|
||||||
load_wasm(&path, &mut resolver);
|
load_wasm(&path, resolver.as_mut());
|
||||||
|
|
||||||
let dynamic = DynamicLibrary::new(
|
let dynamic = DynamicLibrary::new(
|
||||||
data,
|
data,
|
||||||
Box::new(Gen7BattleStatCalculator {}),
|
Box::new(Gen7BattleStatCalculator {}),
|
||||||
Box::new(Gen7DamageLibrary::new(false)),
|
Box::new(Gen7DamageLibrary::new(false)),
|
||||||
Box::new(Gen7MiscLibrary::new()),
|
Box::new(Gen7MiscLibrary::new()),
|
||||||
Box::new(resolver),
|
resolver,
|
||||||
);
|
);
|
||||||
dynamic
|
dynamic
|
||||||
}
|
}
|
||||||
|
@ -276,10 +276,10 @@ pub fn load_species(path: &String, library: &mut StaticData) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_wasm(path: &String, library: &mut WebAssemblyScriptResolver) {
|
fn load_wasm(path: &String, library: &mut WebAssemblyScriptResolver) {
|
||||||
let mut file = File::open(path.to_string() + "gen7_scripts_rs.wasm").unwrap();
|
let file = File::open(path.to_string() + "gen7_scripts_rs.wasm").unwrap();
|
||||||
let mut reader = BufReader::new(file);
|
let mut reader = BufReader::new(file);
|
||||||
let mut buffer = Vec::new();
|
let mut buffer = Vec::new();
|
||||||
reader.read_to_end(&mut buffer);
|
reader.read_to_end(&mut buffer).unwrap();
|
||||||
library.load_wasm_from_bytes(&buffer);
|
library.load_wasm_from_bytes(&buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ fn get_library<'a>() -> &'a DynamicLibrary {
|
||||||
#[cfg_attr(miri, ignore)]
|
#[cfg_attr(miri, ignore)]
|
||||||
fn validate_library_load() {
|
fn validate_library_load() {
|
||||||
let start_time = chrono::Utc::now();
|
let start_time = chrono::Utc::now();
|
||||||
let lib = library_loader::load_library();
|
library_loader::load_library();
|
||||||
let end_time = chrono::Utc::now();
|
let end_time = chrono::Utc::now();
|
||||||
println!("Built library in {} ms", (end_time - start_time).num_milliseconds());
|
println!("Built library in {} ms", (end_time - start_time).num_milliseconds());
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,3 +3,8 @@ MoveData = 1
|
||||||
StringKey = 2
|
StringKey = 2
|
||||||
DynamicLibrary = 3
|
DynamicLibrary = 3
|
||||||
StaticData = 4
|
StaticData = 4
|
||||||
|
DynamicLibrary = 0
|
||||||
|
MoveLibrary = 1
|
||||||
|
StaticData = 2
|
||||||
|
MoveData = 3
|
||||||
|
StringKey = 4
|
||||||
|
|
Loading…
Reference in New Issue