diff --git a/glue.rs b/glue.rs index aa6709ada..03af98abe 100644 --- a/glue.rs +++ b/glue.rs @@ -105,4 +105,5 @@ pub fn GetProxyHandler(obj: *JSObject) -> *libc::c_void; pub fn InvokeGetOwnPropertyDescriptor(handler: *libc::c_void, cx: *JSContext, proxy: *JSObject, id: jsid, set: JSBool, desc: *mut JSPropertyDescriptor) -> JSBool; pub fn GetGlobalForObjectCrossCompartment(obj: *JSObject) -> *JSObject; pub fn ReportError(cx: *JSContext, error: *c_char); +pub fn ThrowTypeError(cx: *JSContext, error: *c_char); } diff --git a/jsglue.cpp b/jsglue.cpp index 79a8d61e6..ba8d53e56 100644 --- a/jsglue.cpp +++ b/jsglue.cpp @@ -463,4 +463,20 @@ ReportError(JSContext* aCx, const char* aError) JS_ReportError(aCx, aError); } +static JSErrorFormatString ErrorFormatString = { "{0}", 1, JSEXN_TYPEERR }; + +static const JSErrorFormatString* +GetErrorMessage(void* aUserRef, const char* aLocale, + const unsigned aErrorNumber) +{ + assert(aErrorNumber == 0); + return &ErrorFormatString; +} + +void +ThrowTypeError(JSContext* aCx, const char* aError) +{ + JS_ReportErrorNumber(aCx, GetErrorMessage, NULL, 0, aError); +} + } // extern "C" diff --git a/rust.rs b/rust.rs index a54eea3cd..ea18b4360 100644 --- a/rust.rs +++ b/rust.rs @@ -11,6 +11,7 @@ use std::rc; use std::rt::Runtime; use jsapi::*; use jsval::{JSVal, NullValue}; +use glue; use default_stacksize; use default_heapsize; use JSOPTION_VAROBJFIX; @@ -319,6 +320,12 @@ impl to_jsstr for ~str { } } +pub fn ThrowTypeError(cx: *JSContext, error: &str) -> JSBool { + let error = error.to_c_str(); + error.with_ref(|error| unsafe { glue::ThrowTypeError(cx, error) }); + 0 +} + #[cfg(test)] pub mod test { use super::rt;