mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Use safe JSContext as first argument for throw_dom_exception
This commit is contained in:
parent
6c26518f61
commit
0703a1ad6d
6 changed files with 29 additions and 25 deletions
|
@ -15,6 +15,7 @@ use crate::dom::bindings::conversions::{
|
|||
use crate::dom::bindings::str::USVString;
|
||||
use crate::dom::domexception::{DOMErrorName, DOMException};
|
||||
use crate::dom::globalscope::GlobalScope;
|
||||
use crate::script_runtime::JSContext as SafeJSContext;
|
||||
#[cfg(feature = "js_backtrace")]
|
||||
use backtrace::Backtrace;
|
||||
use js::error::{throw_range_error, throw_type_error};
|
||||
|
@ -104,10 +105,10 @@ pub type Fallible<T> = Result<T, Error>;
|
|||
pub type ErrorResult = Fallible<()>;
|
||||
|
||||
/// Set a pending exception for the given `result` on `cx`.
|
||||
pub unsafe fn throw_dom_exception(cx: *mut JSContext, global: &GlobalScope, result: Error) {
|
||||
pub fn throw_dom_exception(cx: SafeJSContext, global: &GlobalScope, result: Error) {
|
||||
#[cfg(feature = "js_backtrace")]
|
||||
{
|
||||
capture_stack!(in(cx) let stack);
|
||||
capture_stack!(in(*cx) let stack);
|
||||
let js_stack = stack.and_then(|s| s.as_string(None));
|
||||
let rust_stack = Backtrace::new();
|
||||
LAST_EXCEPTION_BACKTRACE.with(|backtrace| {
|
||||
|
@ -139,27 +140,29 @@ pub unsafe fn throw_dom_exception(cx: *mut JSContext, global: &GlobalScope, resu
|
|||
Error::InvalidModification => DOMErrorName::InvalidModificationError,
|
||||
Error::NotReadable => DOMErrorName::NotReadableError,
|
||||
Error::Operation => DOMErrorName::OperationError,
|
||||
Error::Type(message) => {
|
||||
assert!(!JS_IsExceptionPending(cx));
|
||||
throw_type_error(cx, &message);
|
||||
Error::Type(message) => unsafe {
|
||||
assert!(!JS_IsExceptionPending(*cx));
|
||||
throw_type_error(*cx, &message);
|
||||
return;
|
||||
},
|
||||
Error::Range(message) => {
|
||||
assert!(!JS_IsExceptionPending(cx));
|
||||
throw_range_error(cx, &message);
|
||||
Error::Range(message) => unsafe {
|
||||
assert!(!JS_IsExceptionPending(*cx));
|
||||
throw_range_error(*cx, &message);
|
||||
return;
|
||||
},
|
||||
Error::JSFailed => {
|
||||
assert!(JS_IsExceptionPending(cx));
|
||||
Error::JSFailed => unsafe {
|
||||
assert!(JS_IsExceptionPending(*cx));
|
||||
return;
|
||||
},
|
||||
};
|
||||
|
||||
assert!(!JS_IsExceptionPending(cx));
|
||||
let exception = DOMException::new(global, code);
|
||||
rooted!(in(cx) let mut thrown = UndefinedValue());
|
||||
exception.to_jsval(cx, thrown.handle_mut());
|
||||
JS_SetPendingException(cx, thrown.handle());
|
||||
unsafe {
|
||||
assert!(!JS_IsExceptionPending(*cx));
|
||||
let exception = DOMException::new(global, code);
|
||||
rooted!(in(*cx) let mut thrown = UndefinedValue());
|
||||
exception.to_jsval(*cx, thrown.handle_mut());
|
||||
JS_SetPendingException(*cx, thrown.handle());
|
||||
}
|
||||
}
|
||||
|
||||
/// A struct encapsulating information about a runtime script error.
|
||||
|
@ -310,7 +313,7 @@ impl Error {
|
|||
Error::JSFailed => (),
|
||||
_ => assert!(!JS_IsExceptionPending(cx)),
|
||||
}
|
||||
throw_dom_exception(cx, global, self);
|
||||
throw_dom_exception(SafeJSContext::from_ptr(cx), global, self);
|
||||
assert!(JS_IsExceptionPending(cx));
|
||||
assert!(JS_GetPendingException(cx, rval));
|
||||
JS_ClearPendingException(cx);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue