From bbac6f8da1f2cdc80243a5b84773cecf57b97992 Mon Sep 17 00:00:00 2001
From: Gav <gavin@parity.io>
Date: Fri, 26 Jan 2018 15:24:12 +0100
Subject: [PATCH] Handle panics in native execution.

---
 substrate/executor/src/native_executor.rs | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/substrate/executor/src/native_executor.rs b/substrate/executor/src/native_executor.rs
index e195e8f8d77..14e08f8e80c 100644
--- a/substrate/executor/src/native_executor.rs
+++ b/substrate/executor/src/native_executor.rs
@@ -1,3 +1,4 @@
+use std::panic::catch_unwind;
 use primitives::contract::CallData;
 use state_machine::{Externalities, CodeExecutor};
 use error::{Error, ErrorKind, Result};
@@ -22,9 +23,8 @@ impl CodeExecutor for NativeExecutor {
 		let native_equivalent = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm");
 		if code == &native_equivalent[..] {
 			runtime_support::with_externalities(ext, || match method {
-				// TODO: Panic handler that comes back with error.
-				"execute_block" => Ok(runtime::execute_block(&data.0)),
-				"execute_transaction" => Ok(runtime::execute_transaction(&data.0)),
+				"execute_block" => catch_unwind(|| runtime::execute_block(&data.0)).map_err(|_| ErrorKind::Runtime.into()),
+				"execute_transaction" => catch_unwind(|| runtime::execute_transaction(&data.0)).map_err(|_| ErrorKind::Runtime.into()),
 				_ => Err(ErrorKind::MethodNotFound(method.to_owned()).into()),
 			})
 		} else {
-- 
GitLab