aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/error.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/bindings/error.rs')
-rw-r--r--components/script/dom/bindings/error.rs47
1 files changed, 25 insertions, 22 deletions
diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs
index 7d1e7ecbdd6..d228679631a 100644
--- a/components/script/dom/bindings/error.rs
+++ b/components/script/dom/bindings/error.rs
@@ -6,20 +6,22 @@
use dom::bindings::conversions::ToJSValConvertible;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::Rootable;
use dom::domexception::{DOMException, DOMErrorName};
use util::str::DOMString;
-use js::jsapi::{JSContext, JSObject};
+use js::jsapi::{JSContext, JSObject, RootedValue};
use js::jsapi::{JS_IsExceptionPending, JS_SetPendingException, JS_ReportPendingException};
-use js::jsapi::{JS_ReportErrorNumber, JSErrorFormatString, JSEXN_TYPEERR, JSEXN_RANGEERR};
+use js::jsapi::{JS_ReportErrorNumber1, JSErrorFormatString, JSExnType};
use js::jsapi::{JS_SaveFrameChain, JS_RestoreFrameChain};
-use js::rust::with_compartment;
+use js::jsapi::JSAutoCompartment;
+use js::jsval::UndefinedValue;
+use js::JSFalse;
use libc;
use std::ffi::CString;
use std::ptr;
+use std::mem;
/// DOM exceptions that can be thrown by a native DOM method.
#[derive(Debug, Clone)]
@@ -116,10 +118,11 @@ pub fn throw_dom_exception(cx: *mut JSContext, global: GlobalRef,
};
assert!(unsafe { JS_IsExceptionPending(cx) } == 0);
- let exception = DOMException::new(global, code).root();
- let thrown = exception.to_jsval(cx);
+ let exception = DOMException::new(global, code);
+ let mut thrown = RootedValue::new(cx, UndefinedValue());
+ exception.to_jsval(cx, thrown.handle_mut());
unsafe {
- JS_SetPendingException(cx, thrown);
+ JS_SetPendingException(cx, thrown.handle());
}
}
@@ -128,9 +131,10 @@ pub fn report_pending_exception(cx: *mut JSContext, obj: *mut JSObject) {
unsafe {
if JS_IsExceptionPending(cx) != 0 {
let saved = JS_SaveFrameChain(cx);
- with_compartment(cx, obj, || {
+ {
+ let _ac = JSAutoCompartment::new(cx, obj);
JS_ReportPendingException(cx);
- });
+ }
if saved != 0 {
JS_RestoreFrameChain(cx);
}
@@ -158,25 +162,26 @@ static ERROR_FORMAT_STRING_STRING: [libc::c_char; 4] = [
static mut TYPE_ERROR_FORMAT_STRING: JSErrorFormatString = JSErrorFormatString {
format: &ERROR_FORMAT_STRING_STRING as *const libc::c_char,
argCount: 1,
- exnType: JSEXN_TYPEERR as i16,
+ exnType: JSExnType::JSEXN_TYPEERR as i16,
};
/// Format string struct used to throw `RangeError`s.
static mut RANGE_ERROR_FORMAT_STRING: JSErrorFormatString = JSErrorFormatString {
format: &ERROR_FORMAT_STRING_STRING as *const libc::c_char,
argCount: 1,
- exnType: JSEXN_RANGEERR as i16,
+ exnType: JSExnType::JSEXN_RANGEERR as i16,
};
/// Callback used to throw javascript errors.
/// See throw_js_error for info about error_number.
unsafe extern fn get_error_message(_user_ref: *mut libc::c_void,
- _locale: *const libc::c_char,
- error_number: libc::c_uint) -> *const JSErrorFormatString
+ error_number: libc::c_uint)
+ -> *const JSErrorFormatString
{
- match error_number as i32 {
- JSEXN_TYPEERR => &TYPE_ERROR_FORMAT_STRING as *const JSErrorFormatString,
- JSEXN_RANGEERR => &RANGE_ERROR_FORMAT_STRING as *const JSErrorFormatString,
+ let num: JSExnType = mem::transmute(error_number);
+ match num {
+ JSExnType::JSEXN_TYPEERR => &TYPE_ERROR_FORMAT_STRING as *const JSErrorFormatString,
+ JSExnType::JSEXN_RANGEERR => &RANGE_ERROR_FORMAT_STRING as *const JSErrorFormatString,
_ => panic!("Bad js error number given to get_error_message: {}", error_number)
}
}
@@ -188,20 +193,18 @@ unsafe extern fn get_error_message(_user_ref: *mut libc::c_void,
fn throw_js_error(cx: *mut JSContext, error: &str, error_number: u32) {
let error = CString::new(error).unwrap();
unsafe {
- JS_ReportErrorNumber(cx,
- Some(get_error_message as
- unsafe extern "C" fn(*mut libc::c_void, *const libc::c_char,
- libc::c_uint) -> *const JSErrorFormatString),
+ JS_ReportErrorNumber1(cx,
+ Some(get_error_message),
ptr::null_mut(), error_number, error.as_ptr());
}
}
/// Throw a `TypeError` with the given message.
pub fn throw_type_error(cx: *mut JSContext, error: &str) {
- throw_js_error(cx, error, JSEXN_TYPEERR as u32);
+ throw_js_error(cx, error, JSExnType::JSEXN_TYPEERR as u32);
}
/// Throw a `RangeError` with the given message.
pub fn throw_range_error(cx: *mut JSContext, error: &str) {
- throw_js_error(cx, error, JSEXN_RANGEERR as u32);
+ throw_js_error(cx, error, JSExnType::JSEXN_RANGEERR as u32);
}