aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/utils.rs
diff options
context:
space:
mode:
authorHugo Thiessard <hugo.thiessard@opmbx.org>2016-09-22 22:38:20 +0200
committerHugo Thiessard <hugo.thiessard@opmbx.org>2016-09-26 19:20:22 +0200
commit4654dd91a8d95a5b3350cf7b956a591080372cce (patch)
treee0033ed4bc9247af6386244fd21085e3cedb6262 /components/script/dom/bindings/utils.rs
parent89804bb2516dc9a1e718e667b77cee4fe2552101 (diff)
downloadservo-4654dd91a8d95a5b3350cf7b956a591080372cce.tar.gz
servo-4654dd91a8d95a5b3350cf7b956a591080372cce.zip
Issue #13377 Extract panic-catching for JS engine callbacks into a
separate function
Diffstat (limited to 'components/script/dom/bindings/utils.rs')
-rw-r--r--components/script/dom/bindings/utils.rs15
1 files changed, 15 insertions, 0 deletions
diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs
index 32ffe4109ae..4a7d4d698fb 100644
--- a/components/script/dom/bindings/utils.rs
+++ b/components/script/dom/bindings/utils.rs
@@ -32,8 +32,11 @@ use js::jsapi::{JS_StringHasLatin1Chars, MutableHandleValue, ObjectOpResult};
use js::jsval::{JSVal, UndefinedValue};
use js::rust::{GCMethods, ToString};
use libc;
+use script_runtime::store_panic_result;
use std::ffi::CString;
use std::os::raw::c_void;
+use std::panic;
+use std::panic::AssertUnwindSafe;
use std::ptr;
use std::slice;
@@ -513,3 +516,15 @@ unsafe extern "C" fn instance_class_has_proto_at_depth(clasp: *const js::jsapi::
pub const DOM_CALLBACKS: DOMCallbacks = DOMCallbacks {
instanceClassMatchesProto: Some(instance_class_has_proto_at_depth),
};
+
+/// Generic wrapper for JS engine callbacks panic-catching
+pub fn wrap_panic<T: FnMut() -> R, R>(function: T, generic_return_type: R) -> R {
+ let result = panic::catch_unwind(AssertUnwindSafe(function));
+ match result {
+ Ok(result) => result,
+ Err(error) => {
+ store_panic_result(error);
+ generic_return_type
+ }
+ }
+}