mirror of
https://github.com/servo/servo.git
synced 2025-06-10 01:23:13 +00:00
Auto merge of #13406 - Mylainos:issue-13377, r=jdm
Extract panic-catching for JS engine callbacks into a separate function All of our generated code for script contains inline code like this: ``` let result = panic::catch_unwind(AssertUnwindSafe(|| { ... }; match result { Ok(result) => result, Err(error) => { store_panic_result(error); return false; } } ``` This PR change it to something like this: ``` wrap_panic(|| { ... }, false) ``` --- - [X] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [X] These changes fix #13377 - [ ] There are tests for these changes <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/13406) <!-- Reviewable:end -->
This commit is contained in:
commit
06bb57bdcb
2 changed files with 18 additions and 12 deletions
|
@ -2383,16 +2383,8 @@ class CGAbstractMethod(CGThing):
|
||||||
|
|
||||||
if self.catchPanic:
|
if self.catchPanic:
|
||||||
body = CGWrapper(CGIndenter(body),
|
body = CGWrapper(CGIndenter(body),
|
||||||
pre="let result = panic::catch_unwind(AssertUnwindSafe(|| {\n",
|
pre="return wrap_panic(|| {\n",
|
||||||
post=("""}));
|
post=("""}, %s);""" % ("()" if self.returnType == "void" else "false")))
|
||||||
match result {
|
|
||||||
Ok(result) => result,
|
|
||||||
Err(error) => {
|
|
||||||
store_panic_result(error);
|
|
||||||
return%s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
""" % ("" if self.returnType == "void" else " false")))
|
|
||||||
|
|
||||||
return CGWrapper(CGIndenter(body),
|
return CGWrapper(CGIndenter(body),
|
||||||
pre=self.definition_prologue(),
|
pre=self.definition_prologue(),
|
||||||
|
@ -5566,6 +5558,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
|
||||||
'dom::bindings::utils::resolve_global',
|
'dom::bindings::utils::resolve_global',
|
||||||
'dom::bindings::utils::set_dictionary_property',
|
'dom::bindings::utils::set_dictionary_property',
|
||||||
'dom::bindings::utils::trace_global',
|
'dom::bindings::utils::trace_global',
|
||||||
|
'dom::bindings::utils::wrap_panic',
|
||||||
'dom::bindings::trace::JSTraceable',
|
'dom::bindings::trace::JSTraceable',
|
||||||
'dom::bindings::trace::RootedTraceable',
|
'dom::bindings::trace::RootedTraceable',
|
||||||
'dom::bindings::callback::CallSetup',
|
'dom::bindings::callback::CallSetup',
|
||||||
|
@ -5617,14 +5610,12 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
|
||||||
'libc',
|
'libc',
|
||||||
'util::prefs::PREFS',
|
'util::prefs::PREFS',
|
||||||
'script_runtime::maybe_take_panic_result',
|
'script_runtime::maybe_take_panic_result',
|
||||||
'script_runtime::store_panic_result',
|
|
||||||
'std::borrow::ToOwned',
|
'std::borrow::ToOwned',
|
||||||
'std::cmp',
|
'std::cmp',
|
||||||
'std::mem',
|
'std::mem',
|
||||||
'std::num',
|
'std::num',
|
||||||
'std::os',
|
'std::os',
|
||||||
'std::panic',
|
'std::panic',
|
||||||
'std::panic::AssertUnwindSafe',
|
|
||||||
'std::ptr',
|
'std::ptr',
|
||||||
'std::str',
|
'std::str',
|
||||||
'std::rc',
|
'std::rc',
|
||||||
|
|
|
@ -32,8 +32,11 @@ use js::jsapi::{JS_StringHasLatin1Chars, MutableHandleValue, ObjectOpResult};
|
||||||
use js::jsval::{JSVal, UndefinedValue};
|
use js::jsval::{JSVal, UndefinedValue};
|
||||||
use js::rust::{GCMethods, ToString};
|
use js::rust::{GCMethods, ToString};
|
||||||
use libc;
|
use libc;
|
||||||
|
use script_runtime::store_panic_result;
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
use std::os::raw::c_void;
|
use std::os::raw::c_void;
|
||||||
|
use std::panic;
|
||||||
|
use std::panic::AssertUnwindSafe;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use std::slice;
|
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 {
|
pub const DOM_CALLBACKS: DOMCallbacks = DOMCallbacks {
|
||||||
instanceClassMatchesProto: Some(instance_class_has_proto_at_depth),
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue