diff --git a/substrate/core/client/src/runtime_api/macros.rs b/substrate/core/client/src/runtime_api/macros.rs index b58f2143c8..1721fbd416 100644 --- a/substrate/core/client/src/runtime_api/macros.rs +++ b/substrate/core/client/src/runtime_api/macros.rs @@ -465,14 +465,20 @@ macro_rules! impl_runtime_apis { )* } impl_runtime_apis! { + @EXTEND_FUNCTIONS $runtime; - $( $fn_name ( $( $arg_name: $arg_ty ),* ); )*; + ; + $trait_name; + $( $( $generic ),* )*; + { $( $fn_name ( $( $arg_name: $arg_ty ),* ); )* } $( $rest )* } }; ( $runtime:ident; - $( $fn_name_parsed:ident ( $( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* ); )*; + $( $trait_name_parsed:ident $( < $( $parsed_generic:ident ),* > )*::$fn_name_parsed:ident ( + $( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* ); + )*; impl $trait_name:ident $( < $( $generic:ident ),* > )* for $runtime_ignore:ident { $( fn $fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* ) $( -> $return_ty:ty )* { @@ -490,15 +496,73 @@ macro_rules! impl_runtime_apis { )* } impl_runtime_apis! { + @EXTEND_FUNCTIONS $runtime; - $( $fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* ); )* - $( $fn_name ( $( $arg_name: $arg_ty ),* ); )*; + $( + $trait_name_parsed $( < $( $parsed_generic ),* > )* + ::$fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* ); + )*; + $trait_name; + $( $( $generic ),* )*; + { $( $fn_name ( $( $arg_name: $arg_ty ),* ); )* } + $( $rest )* + } + }; + (@EXTEND_FUNCTIONS + $runtime:ident; + $( $trait_name_parsed:ident $( < $( $parsed_generic:ident ),* > )*::$fn_name_parsed:ident ( + $( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* ); + )*; + $trait_name:ident; + $( $generic:ident ),*; + { + $fn_name_extend:ident ( $( $arg_name_extend:ident : $arg_ty_extend:ty ),* ); + $( $extend_rest:tt )* + } + $( $rest:tt )* + ) => { + impl_runtime_apis! { + @EXTEND_FUNCTIONS + $runtime; + $( + $trait_name_parsed $( < $( $parsed_generic ),* > )* + ::$fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* ); + )* + $trait_name < $( $generic ),* > + ::$fn_name_extend ( $( $arg_name_extend: $arg_ty_extend ),* );; + $trait_name; + $( $generic ),*; + { + $( $extend_rest )* + } + $( $rest )* + } + }; + (@EXTEND_FUNCTIONS + $runtime:ident; + $( $trait_name_parsed:ident $( < $( $parsed_generic:ident ),* > )*::$fn_name_parsed:ident ( + $( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* ); + )*; + $trait_name:ident; + $( $generic:ident ),*; + {} + $( $rest:tt )* + ) => { + impl_runtime_apis! { + $runtime; + $( + $trait_name_parsed $( < $( $parsed_generic ),* > )* + ::$fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* ); + )*; $( $rest )* } }; ( $runtime:ident; - $( $fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* ); )*; + $( + $trait_name:ident $( < $( $generic:ident ),* > )* + ::$fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* ); + )*; ) => { pub mod api { use super::*; @@ -511,6 +575,7 @@ macro_rules! impl_runtime_apis { Some({impl_runtime_apis! { @GENERATE_IMPL_CALL $runtime; + $trait_name $( < $( $generic ),* > )*; $fn_name; $( $arg_name : $arg_ty ),*; data; @@ -536,6 +601,7 @@ macro_rules! impl_runtime_apis { let output = { impl_runtime_apis! { @GENERATE_IMPL_CALL $runtime; + $trait_name $( < $( $generic ),* > )*; $fn_name; $( $arg_name : $arg_ty ),*; input; @@ -553,6 +619,7 @@ macro_rules! impl_runtime_apis { }; (@GENERATE_IMPL_CALL $runtime:ident; + $trait_name:ident $( < $( $generic:ident ),* > )*; $fn_name:ident; $arg_name:ident : $arg_ty:ty; $input:ident; @@ -562,11 +629,12 @@ macro_rules! impl_runtime_apis { None => panic!("Bad input data provided to {}", stringify!($fn_name)), }; - let output = $runtime::$fn_name($arg_name); + let output = <$runtime as $trait_name $( < $( $generic ),* > )*>::$fn_name($arg_name); $crate::runtime_api::Encode::encode(&output) }; (@GENERATE_IMPL_CALL $runtime:ident; + $trait_name:ident $( < $( $generic:ident ),* > )*; $fn_name:ident; $( $arg_name:ident : $arg_ty:ty ),*; $input:ident; @@ -576,7 +644,7 @@ macro_rules! impl_runtime_apis { None => panic!("Bad input data provided to {}", stringify!($fn_name)), }; - let output = $runtime::$fn_name($( $arg_name ),*); + let output = <$runtime as $trait_name $( < $( $generic ),* > )*>::$fn_name($( $arg_name ),*); $crate::runtime_api::Encode::encode(&output) }; } diff --git a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index d7e8471570..6f1c85ae97 100644 Binary files a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm and b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm differ diff --git a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 9789295b32..ef9eb5aba3 100644 Binary files a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm and b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm differ