From 62a3ffb2bf4652d459971de75de333de0d9d50b4 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Tue, 3 Jan 2023 13:56:20 +0100 Subject: [PATCH] Various fixes for FFI --- src/ffi/dynamic_data/models/pokemon.rs | 2 +- src/ffi/mod.rs | 27 ++++++++++++++++++++------ src/ffi/static_data/form.rs | 16 +++++++-------- src/ffi/static_data/item.rs | 8 ++++---- src/ffi/static_data/move_data.rs | 16 +++++++-------- src/ffi/static_data/species.rs | 14 +++++++------ tests/common/library_loader.rs | 2 +- 7 files changed, 51 insertions(+), 34 deletions(-) diff --git a/src/ffi/dynamic_data/models/pokemon.rs b/src/ffi/dynamic_data/models/pokemon.rs index 1fca4cf..6d9ad2b 100644 --- a/src/ffi/dynamic_data/models/pokemon.rs +++ b/src/ffi/dynamic_data/models/pokemon.rs @@ -156,7 +156,7 @@ extern "C" fn pokemon_real_ability_index(ptr: ExternPointer>) -> u8 ptr.as_ref().real_ability().index } -ffi_vec_value_getters!(Pokemon, types, TypeIdentifier); +ffi_vec_value_getters!(Pokemon, Pokemon, types, TypeIdentifier); /// Gets a learned move of the Pokemon. Index should generally be below [`MAX_MOVES`], you will get /// a null pointer otherwise. diff --git a/src/ffi/mod.rs b/src/ffi/mod.rs index ded4755..2668c6d 100644 --- a/src/ffi/mod.rs +++ b/src/ffi/mod.rs @@ -22,6 +22,20 @@ macro_rules! ffi_arc_getter { }; } +/// Generates a basic getter foreign function interface. +macro_rules! ffi_arc_dyn_getter { + ( + $type:ty, $func:ident, $returns: ty + ) => { + paste::paste! { + #[no_mangle] + extern "C" fn [< $type:snake _ $func >](ptr: ExternPointer>) -> $returns { + ptr.as_ref().$func() + } + } + }; +} + /// Generates a basic getter foreign function interface where the return type is a [`crate::StringKey`]. macro_rules! ffi_arc_stringkey_getter { ( @@ -29,7 +43,7 @@ macro_rules! ffi_arc_stringkey_getter { ) => { paste::paste! { #[no_mangle] - extern "C" fn [< $type:lower _ $func >](ptr: ExternPointer>) -> OwnedPtr { + extern "C" fn [< $type:lower _ $func >](ptr: ExternPointer>) -> OwnedPtr { std::ffi::CString::new(ptr.as_ref().$func().str()).unwrap().into_raw() } } @@ -39,15 +53,15 @@ macro_rules! ffi_arc_stringkey_getter { /// Generates a foreign function interface for a vec. This generates a length function, and a getter. macro_rules! ffi_vec_value_getters { ( - $type:ty, $func:ident, $returns: ty + $name:ident, $type:ty, $func:ident, $returns: ty ) => { paste::paste! { #[no_mangle] - extern "C" fn [< $type:lower _ $func _length>](ptr: ExternPointer>) -> usize { + extern "C" fn [< $name:lower _ $func _length>](ptr: ExternPointer>) -> usize { ptr.as_ref().$func().len() } #[no_mangle] - extern "C" fn [< $type:lower _ $func _get>](ptr: ExternPointer>, index: usize) -> $returns { + extern "C" fn [< $name:lower _ $func _get>](ptr: ExternPointer>, index: usize) -> $returns { *ptr.as_ref().$func().get(index).unwrap() } } @@ -62,11 +76,11 @@ macro_rules! ffi_vec_stringkey_getters { ) => { paste::paste! { #[no_mangle] - extern "C" fn [< $type:lower _ $func _length>](ptr: ExternPointer>) -> usize { + extern "C" fn [< $type:lower _ $func _length>](ptr: ExternPointer>) -> usize { ptr.as_ref().$func().len() } #[no_mangle] - extern "C" fn [< $type:lower _ $func _get>](ptr: ExternPointer>, index: usize) -> OwnedPtr { + extern "C" fn [< $type:lower _ $func _get>](ptr: ExternPointer>, index: usize) -> OwnedPtr { CString::new(ptr.as_ref().$func().get(index).unwrap().str()).unwrap().into_raw() } } @@ -74,6 +88,7 @@ macro_rules! ffi_vec_stringkey_getters { } use crate::{ValueIdentifiable, ValueIdentifier}; +pub(self) use ffi_arc_dyn_getter; pub(self) use ffi_arc_getter; pub(self) use ffi_arc_stringkey_getter; pub(self) use ffi_vec_stringkey_getters; diff --git a/src/ffi/static_data/form.rs b/src/ffi/static_data/form.rs index 925e55d..9f380b5 100644 --- a/src/ffi/static_data/form.rs +++ b/src/ffi/static_data/form.rs @@ -1,6 +1,6 @@ use crate::ffi::{ - ffi_arc_getter, ffi_vec_stringkey_getters, ffi_vec_value_getters, BorrowedPtr, ExternPointer, IdentifiablePointer, - OwnedPtr, + ffi_arc_dyn_getter, ffi_vec_stringkey_getters, ffi_vec_value_getters, BorrowedPtr, ExternPointer, + IdentifiablePointer, OwnedPtr, }; use crate::static_data::{Form, FormImpl, LearnableMoves, StaticStatisticSet, TypeIdentifier}; use crate::StringKey; @@ -74,11 +74,11 @@ unsafe extern "C" fn form_name(ptr: ExternPointer>) -> OwnedPtr).into() } -ffi_vec_stringkey_getters!(dyn Form, abilities); -ffi_vec_stringkey_getters!(dyn Form, hidden_abilities); +ffi_vec_stringkey_getters!(Form, abilities); +ffi_vec_stringkey_getters!(Form, hidden_abilities); /// The moves a Pokemon with this form can learn. #[no_mangle] diff --git a/src/ffi/static_data/item.rs b/src/ffi/static_data/item.rs index 282a290..cfc6292 100644 --- a/src/ffi/static_data/item.rs +++ b/src/ffi/static_data/item.rs @@ -1,4 +1,4 @@ -use crate::ffi::{ffi_arc_getter, ExternPointer, IdentifiablePointer, OwnedPtr}; +use crate::ffi::{ffi_arc_dyn_getter, ExternPointer, IdentifiablePointer, OwnedPtr}; use crate::static_data::{BattleItemCategory, Item, ItemCategory, ItemImpl}; use crate::StringKey; use hashbrown::HashSet; @@ -40,9 +40,9 @@ unsafe extern "C" fn item_name(ptr: ExternPointer>) -> OwnedPtr>) -> Ow CString::new(name.str()).unwrap().into_raw() } -ffi_arc_getter!(dyn MoveData, move_type, TypeIdentifier); -ffi_arc_getter!(dyn MoveData, category, MoveCategory); -ffi_arc_getter!(dyn MoveData, base_power, u8); -ffi_arc_getter!(dyn MoveData, accuracy, u8); -ffi_arc_getter!(dyn MoveData, base_usages, u8); -ffi_arc_getter!(dyn MoveData, target, MoveTarget); -ffi_arc_getter!(dyn MoveData, priority, i8); +ffi_arc_dyn_getter!(MoveData, move_type, TypeIdentifier); +ffi_arc_dyn_getter!(MoveData, category, MoveCategory); +ffi_arc_dyn_getter!(MoveData, base_power, u8); +ffi_arc_dyn_getter!(MoveData, accuracy, u8); +ffi_arc_dyn_getter!(MoveData, base_usages, u8); +ffi_arc_dyn_getter!(MoveData, target, MoveTarget); +ffi_arc_dyn_getter!(MoveData, priority, i8); /// The optional secondary effect the move has. #[no_mangle] diff --git a/src/ffi/static_data/species.rs b/src/ffi/static_data/species.rs index 358e74b..c3339b7 100644 --- a/src/ffi/static_data/species.rs +++ b/src/ffi/static_data/species.rs @@ -1,4 +1,6 @@ -use crate::ffi::{ffi_arc_getter, ffi_arc_stringkey_getter, BorrowedPtr, ExternPointer, IdentifiablePointer, OwnedPtr}; +use crate::ffi::{ + ffi_arc_dyn_getter, ffi_arc_stringkey_getter, BorrowedPtr, ExternPointer, IdentifiablePointer, OwnedPtr, +}; use crate::static_data::{Form, Species, SpeciesImpl}; use crate::StringKey; use hashbrown::HashSet; @@ -44,11 +46,11 @@ unsafe extern "C" fn species_drop(ptr: OwnedPtr>) { drop_in_place(ptr); } -ffi_arc_getter!(dyn Species, id, u16); -ffi_arc_stringkey_getter!(dyn Species, name); -ffi_arc_getter!(dyn Species, gender_rate, f32); -ffi_arc_stringkey_getter!(dyn Species, growth_rate); -ffi_arc_getter!(dyn Species, capture_rate, u8); +ffi_arc_dyn_getter!(Species, id, u16); +ffi_arc_stringkey_getter!(Species, name); +ffi_arc_dyn_getter!(Species, gender_rate, f32); +ffi_arc_stringkey_getter!(Species, growth_rate); +ffi_arc_dyn_getter!(Species, capture_rate, u8); /// Adds a new form to the species. #[no_mangle] diff --git a/tests/common/library_loader.rs b/tests/common/library_loader.rs index 88424f9..d6c3b3d 100755 --- a/tests/common/library_loader.rs +++ b/tests/common/library_loader.rs @@ -14,7 +14,7 @@ use pkmn_lib::defines::LevelInt; use pkmn_lib::dynamic_data::Gen7DamageLibrary; use pkmn_lib::dynamic_data::Gen7MiscLibrary; use pkmn_lib::dynamic_data::{DynamicLibrary, DynamicLibraryImpl}; -use pkmn_lib::dynamic_data::{EmptyScriptResolver, Gen7BattleStatCalculator, ScriptResolver}; +use pkmn_lib::dynamic_data::{Gen7BattleStatCalculator, ScriptResolver}; use pkmn_lib::static_data::{ AbilityImpl, AbilityLibrary, AbilityLibraryImpl, BattleItemCategory, DataLibrary, EffectParameter, Form, FormImpl, GrowthRateLibrary, GrowthRateLibraryImpl, ItemImpl, ItemLibrary, ItemLibraryImpl, LearnableMoves,