From 4ca99758df6ed4f274e882a2f1d76ea06ebfbd34 Mon Sep 17 00:00:00 2001
From: Robert Habermeier <rphmeier@gmail.com>
Date: Thu, 8 Feb 2018 22:36:24 +0100
Subject: [PATCH] fix runtime_test

---
 .../release/polkadot_runtime.compact.wasm     | Bin 77991 -> 77991 bytes
 .../release/polkadot_runtime.wasm             | Bin 78040 -> 78040 bytes
 .../substrate/executor/src/wasm_executor.rs   |  11 +++
 substrate/substrate/executor/wasm/src/lib.rs  |  91 ++++++++----------
 .../release/runtime_test.compact.wasm         | Bin 13991 -> 14152 bytes
 .../release/runtime_test.wasm                 | Bin 14116 -> 14248 bytes
 substrate/substrate/runtime-io/with_std.rs    |  29 +++---
 substrate/substrate/runtime-io/without_std.rs |  89 +++++++++++------
 8 files changed, 124 insertions(+), 96 deletions(-)

diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm
index 4f3bdfc57d502916d6b2c4bf1dfeac3f3fae2273..928c72939d1c2d74c34cb180a24421358565776a 100644
GIT binary patch
delta 555
zcmZ4fkY)KpmJQDs#aWp+cp-p;kBgg^k(ZH!i-VDC@?S>3dS~I(iqz!NlGON;qQt!7
z#N?99{5%F1zO>A|#GK6H)cB;F{N!u~SN<{}HzlzozbHOAzcjCe!Ho+pQq17aomg6u
zkzbTql9^h};K7|zT2dKblwVwuTEyVV$<N5($iU4RVWehgtg0Vs!gYQni|1J;CXRZ>
z&8L{^9T<OX_Hw@ExVd+cff!@h=6yT%vM_y7*<8D~k`>7Pen^9v<BN)bHUqbS&t|38
zbVkOI&0TF%nHU`=D|9BRyihe`n!u{S;mBylw1y2xvzswZ0r7tTB{qNrKB!J!+Ns1e
zM{V-S&J&CwlP7h>fptCLP+$S+`ojsNfx4c6_#j;kTtEg;mq<5A*Jg|EeT<Bbo4@x&
zGBP?%4(wY3*8PD=ff=Ox4Kt7i>iz=agLHoY2>^9V_JeiX_6G=W);zXWY4eGfcf}@O
zd+}-OQpWe1vJw-77#J)W7#J=9X)z$Z0*Kjwn89&^>U13~Mmt8;>F?DUrDR{Ia&sgI
z!z4cdc@99HG+616>Fcx@H8tj_aSIp#1-XENK#GA8EV)6Ao2$4eSwFELQ?IC)!SR6F
b^#59n@>~zpxY<+`@)C1Xw=dLYWMc&Y+P$I{

delta 522
zcmZ4fkY)KpmJQDs#d#rsm5GCckBgg^k(ZH!i;;_C@?S>3dI#auiqz!NlGON;qQt!7
z#N?99{5%FnzO>A|#GK6H)cB;F{N!u~C;l=ZHzlzozbHOAzcjCe!I=v#Qq17Oomg6u
zkzbTql9^h};L4p+T2dKblwVwuTEyVS$<N5($iU4RVWehgtg0Vk!gYQni|1J;CXRZ>
z&8L{^9T;0SdpX~7+<ag~DkEdqX0=sQnHb$C?^%<`^hIT|{91AD7F9E*4QvV=j(=1p
zJFZn?TA?~Qb?phpu*rJs;y`Np)<M)Xa4E2W)NEJ>QnUHWx_yj{9-Aj`h-75+ocwm<
z5|uA1W=tQL6qp?u&6wUW18H_MrY|5q$c7If0if=!o4~qnZVC|ItkP;A#u&OeboO2r
zrXQ-CMHW=D0=a!lHJCwM#baBQCU5@#Y4f!gcg40YWqhxx#PLChfq{(y2!KX$b6f!O
zq`|xvRc;kV5NrBJNk&DD6{_3<2Y`}XKoMae21_{}Q03+-E=tx<EXdR=DrRuJpgO%m
zn^9ipgDN+hib7suZYqQ04^?gn0iYI3psoNQEe51l05QbU32M_fYBAa|s!ji(#VECX
Ju{I+MD**IPo%R3#

diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm
index 735533a89742f7416fa67be5b74b862d3e84dfb7..03a42ab97111f3686ee79b74315049ab71cb17b1 100644
GIT binary patch
delta 555
zcmccdkmbfhmJQDt#aWp+cp-p;kBgg^k(ZH!i-VDC@;}DndKcl;iqz!NlGON;qQt!7
z#N?99{5%F%zO>A|#GK6H)cB;F{N!u~H~umpHzlzozbHOAzcjCe!JP{(Qq17Nomg6u
zkzbTql9^h};K`j*T2dKblwVwuTEyVR$<N5($iU4RX{>H!qGk|g%5`fci`Q8uCXRZ>
z%^#S$92kFWu6DlVxOv|q12M+%&F^>YWnucFvU%O!N>(6O<FE!Z#}^d=9R_Xz-_60T
z>5Pn_n|HTOWny%k9N3wt@<P>&X#%SPha;mI(;7A)&2Gjt1;qaWl-K|g_@FxZTBj1z
z9JR^6I!`c$PCncf2iEm~LxBaP>klW82I_hO;)8TGZ~+-WU9R0AU7Itz_c1a$ZPw_G
zWMp)n+|;)Otos9#0y9YW8)hI4)cpm-2kHI*5&-J<>Idu2>kkm#9Cd81(&nEp?}|-k
zfB9+aHOBXvvJw-77#J)W7#J=9X)z$Z0*Kjwn89&^>hxGGMmt8;=?WT*QnD{pxj7Pq
zVUiz!JO?088m#ok^!r+jni_M|xCIP=f?PmBAjQB4mfWDm%~f2Kte;qrsaI6Y;CMi7
ax`8&MJl6v?ZZ;K#yu{qp?U%F}*;oOPv!e6>

delta 519
zcmccdkmbfhmJQDt#d#rsm5GCckBgg^k(ZH!i;;_C@;}DndPm{Ziqz!NlGON;qQt!7
z#N?99{5%FHzO>A|#GK6H)cB;F{N!u~XZ|uEHzlzozbHOAzcjCe!G#MhQq17Womg6u
zkzbTql9^h};KrR&T2dKblwVwuTEyVa$<N5($iU4RX{>H!qGk|k%5`fci`Q8uCXRZ>
z%^#S$92i?RS3BQw-28DxDkEd~=I~WhnHW7Lzg?5a^hITIz*=$c7F9E*4QvV=j(=1p
z7p+xdTA@05+S(J0;gjRn#evl9Uk6dsz@@+fQuA;fNX=%}_4^nZJvSfO5Xs2sHCb-c
z5|uA1W=tQL6qp?u&6wUW18H_MrY|5q$c7If0if<@o4~rcHU|iA4sA6MV+`BeHhV7%
z(+}0nt_vzzf!zH|HJCx%pkrH=CO`TAX*2uFyJB0fF}~N7<@g}Pz`(`;1VE#>IW7Qs
z(qLYTD!0n?T4_cVEe6LGs@wtxfHGV_8DSu11gkip%FR_=l&qgvkf~Qx%;0!Ib^1ze
zMtPkNs@!ZU3VDgSsSJ)kRJkPtfLbhpIs$;S7?558#1I=Ns7;U6Vzgsao35zMD7F2H
IHX{ow0Ik!WOaK4?

diff --git a/substrate/substrate/executor/src/wasm_executor.rs b/substrate/substrate/executor/src/wasm_executor.rs
index 60f437081a8..85c1e0e61bd 100644
--- a/substrate/substrate/executor/src/wasm_executor.rs
+++ b/substrate/substrate/executor/src/wasm_executor.rs
@@ -423,6 +423,17 @@ mod tests {
 		let mut calldata = vec![];
 		calldata.extend_from_slice(key.public().as_ref());
 		calldata.extend_from_slice(sig.as_ref());
+
+		assert_eq!(
+			WasmExecutor.call(&mut ext, &test_code[..], "test_ed25519_verify", &calldata).unwrap(),
+			vec![1]
+		);
+
+		let other_sig = key.sign(b"all is not ok!");
+		let mut calldata = vec![];
+		calldata.extend_from_slice(key.public().as_ref());
+		calldata.extend_from_slice(other_sig.as_ref());
+
 		assert_eq!(
 			WasmExecutor.call(&mut ext, &test_code[..], "test_ed25519_verify", &calldata).unwrap(),
 			vec![0]
diff --git a/substrate/substrate/executor/wasm/src/lib.rs b/substrate/substrate/executor/wasm/src/lib.rs
index 2002d3cefc9..11401a39d7b 100644
--- a/substrate/substrate/executor/wasm/src/lib.rs
+++ b/substrate/substrate/executor/wasm/src/lib.rs
@@ -13,57 +13,42 @@ use runtime_io::{
 	twox_128, twox_256, ed25519_verify, enumerated_trie_root
 };
 
-fn test_blake2_256(input: &[u8]) -> Vec<u8> {
-	blake2_256(&input).to_vec()
-}
-
-fn test_twox_256(input: &[u8]) -> Vec<u8> {
-	twox_256(&input).to_vec()
-}
-
-fn test_twox_128(input: &[u8]) -> Vec<u8> {
-	twox_128(&input).to_vec()
-}
-
-fn test_ed25519_verify(input: &[u8]) -> Vec<u8> {
-	let sig = &input[0..64];
-	let pubkey = &input[64..96];
-	let msg = b"all ok!";
-	[ed25519_verify(sig, &msg[..], pubkey) as u8].to_vec()
-}
-
-fn test_enumerated_trie_root(_input: &[u8]) -> Vec<u8> {
-	enumerated_trie_root(&[&b"zero"[..], &b"one"[..], &b"two"[..]]).to_vec()
-}
-
-fn test_data_in(input: &[u8]) -> Vec<u8> {
-	print("set_storage");
-	set_storage(b"input", &input);
-
-	print("storage");
-	let foo = storage(b"foo");
-
-	print("set_storage");
-	set_storage(b"baz", &foo);
-
-	print("finished!");
-	b"all ok!".to_vec()
-}
-
-fn test_empty_return(_input: &[u8]) -> Vec<u8> {
-	Vec::new()
-}
-
-fn test_panic(_input: &[u8]) -> Vec<u8> {
-	panic!("test panic");
-}
-
-fn test_conditional_panic(input: &[u8]) -> Vec<u8> {
-	if input.len() > 0 {
-		panic!("test panic");
+impl_stubs!(
+	test_data_in NO_DECODE => |input| {
+		print("set_storage");
+		set_storage(b"input", input);
+
+		print("storage");
+		let foo = storage(b"foo");
+
+		print("set_storage");
+		set_storage(b"baz", &foo);
+
+		print("finished!");
+		b"all ok!".to_vec()
+	},
+	test_empty_return NO_DECODE => |_| Vec::new(),
+	test_panic NO_DECODE => |_| panic!("test panic"),
+	test_conditional_panic NO_DECODE => |input: &[u8]| {
+		if input.len() > 0 {
+			panic!("test panic")
+		}
+		input.to_vec()
+	},
+	test_blake2_256 NO_DECODE => |input| blake2_256(input).to_vec(),
+	test_twox_256 NO_DECODE => |input| twox_256(input).to_vec(),
+	test_twox_128 NO_DECODE => |input| twox_128(input).to_vec(),
+	test_ed25519_verify NO_DECODE => |input: &[u8]| {
+		let mut pubkey = [0; 32];
+		let mut sig = [0; 64];
+
+		pubkey.copy_from_slice(&input[0..32]);
+		sig.copy_from_slice(&input[32..96]);
+
+		let msg = b"all ok!";
+		[ed25519_verify(&sig, &msg[..], &pubkey) as u8].to_vec()
+	},
+	test_enumerated_trie_root NO_DECODE => |_| {
+		enumerated_trie_root(&[&b"zero"[..], &b"one"[..], &b"two"[..]]).to_vec()
 	}
-	input.to_vec()
-}
-
-impl_stubs!(test_data_in, test_empty_return, test_panic, test_conditional_panic,
-	test_blake2_256, test_twox_256, test_twox_128, test_ed25519_verify, test_enumerated_trie_root);
+);
diff --git a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm
index 2b8e909b3e4b2e6608e409e5a5b1cf6d86e1fa33..6296f219c64cbef48b5a3a7428b3847c0eccfa23 100644
GIT binary patch
delta 2749
zcmZ`)eQcXY8Na*twPXA2_7W$y^CnF$9}Q00CTY54Elby4rd35F>$E>MjRC2Xyh-gk
zw&%R1A3}Bhh|q)(N_E}P0Eq~SD6q1Ogpd8fh$z}B6r}tyAt50!QjjVkjWDXIh!62Q
zJ8mNwPVRp9Jonu1dG5LA?)}c(o!rtBjjU9nSI^d!sy|v{udv9q=fBBA?j>(x&Yhcg
zy=#9vCuMu6_Ol7``zQ_Afq;(%IK|J$^cCuq!k#<tO-!e})I>T*BJ~x~ohx{kCyK6j
zp_n6kLKR&hl}k^Ny|IcgmCsG5y>vd8%1%@##NNupWHxo)9hw*#9wGISipIN`zf_SM
zcFBi_j*@5;^9|mFJ3TZ!eE8VJ=iFj?<}zv2pI|M=n(B)e5Z9zTo6b#K$X!h5rb)~{
zm&#`IQ>59RDY`Ckf)Pp-;dKW-*4mS7*&n(--u?^y-S*aT(E)u2<w__nf~r;dB#~5v
z)S#*pL1`&6!iYMmENKb5gGejMV7_BL3U$?bov5G)>X_{EZxF2P(~rwh*z*_kRe8WC
z6oKju*<)0%>fg$JROoA+Kh)prSf+jYsm>m{OH0H0`yJod(f?la?p9d$c8^i6v)wO1
z|4#S*(oYz(OYEvb_(^7~1$w^IH^OXoQql-fwQWhC3TIRz)5*rjql{EVk?FK{iGfU~
zy(1b3!)PD_-gP1p4m)Z7BvtL>5h9r+AnPUM(Gtk8c_k_m1RFx2CLoE%2wYVCfs99J
zg%cJsV`$?JWRs_=+Qca6lOHE}MTM`EJQ-n_pd-waAR1u>NPtU#ZIVI%7m^u;X`l2B
zvr8R*1BH${Wwy6KGsuFhlm0RJg~h#GNt|Xo;i_y73Ijs;AN5!FKi2R%93*8}tpEps
zYgBLTe}l&L^`0RbUwyad3Pq~NlHH$Pr=k}O?@?sctjE6tHdKP?Y?KMRB?8hyhp7;e
z&`T!#4~KQ!53TT3!Qz36jcDaJ^pDxNv&b?7lsra=45-g%WKeC9oT8puWO|?VECak`
zoigy2^#MxZmc5Ani0{i(tlswZG6?V2y|ns|y~mkv(^6$iA8+_q<9%y{9hE__C6SWT
zKukOxJ!)^+qDy}<`eOY(+w4530FMB!`}Bv=e*1=Bbgd>EH)#EazdDb)GV}NR+868R
zHv^&z*;w<74n5j>D&9Q8gk*}1;Ix?pNJwR_Uu*5Nw>ez>U!%LBiqZWLjPA5NO&4{%
zwVQV7mz^h^3aeFR#obdj_8@_4Vf`oPAdDJXenexd&+hvyZMzdU2P4BWBqT5-ZFA7I
z9P8P@YbTZ>s#k4C)CyC}LcPO8cZ7v)u09|gzOaw8lPJ`Mg}@oqI91yXsza?u)vHvM
z8`WJHubv1#&*(n=6@Gy3TfNPPZQ7<EkNrSwA<j?Aka`bzT5UD!f5!e!9sOba82Z7)
zm(c$#Q5`qwaI=JbsQLE(jRaB^6rCoI2@|}!k-$;0il#QyP0op^Gr|(6CW^ad%9W}W
zN6$KKmV=!AvhC|A*HrsZDej=sms=`jy4bQ)rWT5k-)ucYl+EpOL=fCo&hg?;%zOD_
zYStyHmHX1U!Ud10L0<Pjdz4!<`8-jh+?q^XF%JO`&ZKkc`E%|xp34oqqj+6q{yc;-
z3f|NIP7ajX2_bE0L|vymaTbFRT44t}fi@aZuTyScaf{$zq1?*n5XKq?c>Ljs^7^S%
zAvKluF3UWg`I&6~BEik$iFK^4N83h=qWy{y5(E;pO?fn%ZknvT_yfh%MSLHo`it|#
z+@Ejv{`%0S#eFaK_xFDW;aUg{ao`S<XMBXjfa{QHh3US<v-+<GvtvYU*<75&L<1&n
z;aXQ+-LturShfe+L7>^uNg#5&i{`qIFX`=r*Jg;i;eSZ;CTL)bh}Zl)v5B<@j0Bb0
z*BOM+WMsAB=gC@(1z7b!xeUZ|vI6u2*MZfTaVy_H_*UX(;Gv_pA2?bM=${{oMau!s
zCog-h#JADCB$2X!zI&*zYdOdRGHGV!p<D@af3M8X$g?<zAg6%Mp#DwY!1zLl*Jsm{
zQ~9DhkS~~zc_qEeA-<>b*_ETmrJI|UNsxrNZA4InxagG^&$&4{pG{AtbF+qcGo;__
zclz&Qas@j#`QHRafJEJgb_r4=ggD9<Lui+{ZW~OLRydCtqS`Lzy;RYgmnjdvHaU;T
z$qSx|Vn<cxT$oguYzcIx0I_jsYaZ$!cvuK?e=RjjVcse8ph6;wsobn9XYxhtK!0jb
zB-X-QJOeTbt^&|h2fT;%%s{uZ9p(*{AiQ(67}F-NOA-C<;B#y{vf6%ln6hQD`rOb{
zlx;WYZyh<s)}#8*N500&jjJy|GDqc|I8T&Oou)KI_`ge|95?4NwUqeC^SF`V;w;vf
zs7|0jOj)7W5<Ia0tzlgGAI6PcYmQ(|va+U}&~Nv}*g~^$cWkBkBi(H_bJpLF+u6*;
zVC4XDmT-WJ3AbC#{50;;=|<Fq!vi$~qJHY|ZcKE?i29wwMFA^Kps(zlh8`Pn{{zwR
BN*e$G

delta 2649
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
V20wZ*%fN>RvzF4GR(~Iv{2!QdG`9c%

diff --git a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm
index b3e3b8389158fdd46669b05e916da8b65b536052..0f00a9675481128e88540e2386816fa406722f2b 100644
GIT binary patch
delta 2709
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
KDTe-N%=sVa5>SQ!

delta 2589
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

diff --git a/substrate/substrate/runtime-io/with_std.rs b/substrate/substrate/runtime-io/with_std.rs
index bcedb481162..cb01133a6c1 100644
--- a/substrate/substrate/runtime-io/with_std.rs
+++ b/substrate/substrate/runtime-io/with_std.rs
@@ -126,25 +126,30 @@ pub fn print<T: Printable + Sized>(value: T) {
 
 #[macro_export]
 macro_rules! impl_stubs {
-	( $( $name:ident => $invoke:expr ),* ) => {
+	( $( $new_name:ident $($nodecode:ident)* => $invoke: expr ),*) => {
 		/// Dispatch logic for the native runtime.
-		pub fn dispatch(method: &str, mut data: &[u8]) -> Option<Vec<u8>> {
+		pub fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
 			match method {
 				$(
-					stringify!($name) => {
-						let input = match $crate::codec::Slicable::decode(&mut data) {
-							Some(input) => input,
-							None => panic!("Bad input data provided to {}", stringify!($name)),
-						};
-
-						let output = $invoke(input);
-						Some($crate::codec::Slicable::to_vec(&output))
-					}
+					stringify!($new_name) => { impl_stubs!(@METHOD data $new_name $($nodecode)* => $invoke) }
 				)*
 				_ => None,
 			}
 		}
-	}
+	};
+	(@METHOD $data: ident $new_name: ident NO_DECODE => $invoke:expr) => {
+		Some($invoke($data))
+	};
+	(@METHOD $data: ident $new_name: ident => $invoke:expr) => {{
+		let mut data = $data;
+		let input = match $crate::codec::Slicable::decode(&mut data) {
+			Some(input) => input,
+			None => panic!("Bad input data provided to {}", stringify!($new_name)),
+		};
+
+		let output = $invoke(input);
+		Some($crate::codec::Slicable::to_vec(&output))
+	}}
 }
 
 #[cfg(test)]
diff --git a/substrate/substrate/runtime-io/without_std.rs b/substrate/substrate/runtime-io/without_std.rs
index a4d8e4076d5..ecadddeeabd 100644
--- a/substrate/substrate/runtime-io/without_std.rs
+++ b/substrate/substrate/runtime-io/without_std.rs
@@ -14,9 +14,12 @@
 // You should have received a copy of the GNU General Public License
 // along with Substrate.  If not, see <http://www.gnu.org/licenses/>.
 
-extern crate substrate_runtime_std as rstd;
+
 extern crate substrate_primitives as primitives;
 
+#[doc(hidden)]
+pub extern crate substrate_runtime_std as rstd;
+
 #[doc(hidden)]
 pub extern crate substrate_codec as codec;
 
@@ -141,10 +144,10 @@ pub fn twox_128(data: &[u8]) -> [u8; 16] {
 }
 
 /// Verify a ed25519 signature.
-pub fn ed25519_verify(sig: &[u8], msg: &[u8], pubkey: &[u8]) -> bool {
-	sig.len() == 64 && pubkey.len() == 32 && unsafe {
-		ext_ed25519_verify(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ptr())
-	} == 0
+pub fn ed25519_verify(sig: &[u8; 64], msg: &[u8], pubkey: &[u8; 32]) -> bool {
+	unsafe {
+		ext_ed25519_verify(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ptr()) == 0
+	}
 }
 
 /// Trait for things which can be printed.
@@ -181,33 +184,57 @@ pub fn print<T: Printable + Sized>(value: T) {
 
 #[macro_export]
 macro_rules! impl_stubs {
-	( $( $new_name:ident => $invoke:expr ),* ) => {
+	( $( $new_name:ident $($nodecode:ident)* => $invoke:expr ),* ) => {
 		$(
-			#[no_mangle]
-			pub fn $new_name(input_data: *mut u8, input_len: usize) -> u64 {
-				let mut input = if input_len == 0 {
-					&[0u8; 0]
-				} else {
-					unsafe {
-						$crate::slice::from_raw_parts(input_data, input_len)
-					}
-				};
-
-				let input = match $crate::codec::Slicable::decode(&mut input) {
-					Some(input) => input,
-					None => panic!("Bad input data provided to {}", stringify!($name)),
-				};
-
-				let output = ($invoke)(input);
-				let output = $crate::codec::Slicable::to_vec(&output);
-				let res = output.as_ptr() as u64 + ((output.len() as u64) << 32);
-
-				// Leak the output vector to avoid it being freed.
-				// This is fine in a WASM context since the heap
-				// will be discarded after the call.
-				::core::mem::forget(output);
-				res
-			}
+			impl_stubs!(@METHOD $new_name $($nodecode)* => $invoke);
 		)*
+	};
+	( @METHOD $new_name:ident NO_DECODE => $invoke:expr ) => {
+		#[no_mangle]
+		pub fn $new_name(input_data: *mut u8, input_len: usize) -> u64 {
+			let input: &[u8] = if input_len == 0 {
+				&[0u8; 0]
+			} else {
+				unsafe {
+					$crate::slice::from_raw_parts(input_data, input_len)
+				}
+			};
+
+			let output: $crate::rstd::vec::Vec<u8> = $invoke(input);
+			let res = output.as_ptr() as u64 + ((output.len() as u64) << 32);
+
+			// Leak the output vector to avoid it being freed.
+			// This is fine in a WASM context since the heap
+			// will be discarded after the call.
+			::core::mem::forget(output);
+			res
+		}
+	};
+	( @METHOD $new_name:ident => $invoke:expr ) => {
+		#[no_mangle]
+		pub fn $new_name(input_data: *mut u8, input_len: usize) -> u64 {
+			let mut input = if input_len == 0 {
+				&[0u8; 0]
+			} else {
+				unsafe {
+					$crate::slice::from_raw_parts(input_data, input_len)
+				}
+			};
+
+			let input = match $crate::codec::Slicable::decode(&mut input) {
+				Some(input) => input,
+				None => panic!("Bad input data provided to {}", stringify!($name)),
+			};
+
+			let output = ($invoke)(input);
+			let output = $crate::codec::Slicable::to_vec(&output);
+			let res = output.as_ptr() as u64 + ((output.len() as u64) << 32);
+
+			// Leak the output vector to avoid it being freed.
+			// This is fine in a WASM context since the heap
+			// will be discarded after the call.
+			::core::mem::forget(output);
+			res
+		}
 	}
 }
-- 
GitLab