mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-11 21:11:07 +00:00
Remove runtime registered extensions after execution (#7236)
* Remove runtime registered extensions after execution This prevents a bug when an extension was registered in native, but the native execution aborted without removing the extension again. Now, when executing the wasm code the extension is still registered and it fails of being registered. So, the wasm execution fails as well. This can happen for example for the `VerificationExt`. * Make it better
This commit is contained in:
@@ -123,14 +123,25 @@ impl Extensions {
|
||||
}
|
||||
|
||||
/// Register the given extension.
|
||||
pub fn register<E: Extension>(&mut self, ext: E) {
|
||||
self.extensions.insert(ext.type_id(), Box::new(ext));
|
||||
pub fn register<E: Extension>(
|
||||
&mut self,
|
||||
ext: E,
|
||||
) {
|
||||
let type_id = ext.type_id();
|
||||
self.extensions.insert(type_id, Box::new(ext));
|
||||
}
|
||||
|
||||
/// Register extension `ext`.
|
||||
pub fn register_with_type_id(&mut self, type_id: TypeId, extension: Box<dyn Extension>) -> Result<(), Error> {
|
||||
/// Register extension `extension` using the given `type_id`.
|
||||
pub fn register_with_type_id(
|
||||
&mut self,
|
||||
type_id: TypeId,
|
||||
extension: Box<dyn Extension>,
|
||||
) -> Result<(), Error> {
|
||||
match self.extensions.entry(type_id) {
|
||||
Entry::Vacant(vacant) => { vacant.insert(extension); Ok(()) },
|
||||
Entry::Vacant(vacant) => {
|
||||
vacant.insert(extension);
|
||||
Ok(())
|
||||
},
|
||||
Entry::Occupied(_) => Err(Error::ExtensionAlreadyRegistered),
|
||||
}
|
||||
}
|
||||
@@ -140,9 +151,16 @@ impl Extensions {
|
||||
self.extensions.get_mut(&ext_type_id).map(DerefMut::deref_mut).map(Extension::as_mut_any)
|
||||
}
|
||||
|
||||
/// Deregister extension of type `E`.
|
||||
pub fn deregister(&mut self, type_id: TypeId) -> Option<Box<dyn Extension>> {
|
||||
self.extensions.remove(&type_id)
|
||||
/// Deregister extension for the given `type_id`.
|
||||
///
|
||||
/// Returns `true` when the extension was registered.
|
||||
pub fn deregister(&mut self, type_id: TypeId) -> bool {
|
||||
self.extensions.remove(&type_id).is_some()
|
||||
}
|
||||
|
||||
/// Returns a mutable iterator over all extensions.
|
||||
pub fn iter_mut<'a>(&'a mut self) -> impl Iterator<Item = (&'a TypeId, &'a mut Box<dyn Extension>)> {
|
||||
self.extensions.iter_mut()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user