From bfde816da068e8afe361cef980dd0f7d4bf4686e Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 19 Apr 2014 23:25:43 +0200 Subject: [PATCH 1/3] Throw a TypeError when too few arguments are passed. --- .../dom/bindings/codegen/CodegenRust.py | 7 +++-- src/components/script/dom/bindings/utils.rs | 28 +++++++++++++++++++ src/support/spidermonkey/rust-mozjs | 2 +- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 0912c6fdf96..5f0a7e01c79 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -145,7 +145,7 @@ class CGMethodCall(CGThing): def __init__(self, argsPre, nativeMethodName, static, descriptor, method): CGThing.__init__(self) - methodName = '"%s.%s"' % (descriptor.interface.identifier.name, method.identifier.name) + methodName = '\\"%s.%s\\"' % (descriptor.interface.identifier.name, method.identifier.name) def requiredArgCount(signature): arguments = signature[1] @@ -176,8 +176,8 @@ class CGMethodCall(CGThing): if requiredArgs > 0: code = ( "if argc < %d {\n" - " return 0; //XXXjdm throw exception\n" - " //return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, %s);\n" + " ThrowTypeError(cx, \"Not enough arguments to %s.\");\n" + " return 0;\n" "}" % (requiredArgs, methodName)) self.cgRoot.prepend( CGWrapper(CGIndenter(CGGeneric(code)), pre="\n", post="\n")) @@ -4329,6 +4329,7 @@ class CGBindingRoot(CGThing): 'dom::bindings::utils::{VoidVal, with_gc_disabled}', 'dom::bindings::utils::{with_gc_enabled}', 'dom::bindings::utils::get_dictionary_property', + 'dom::bindings::utils::ThrowTypeError', 'dom::bindings::trace::JSTraceable', 'dom::bindings::callback::{CallbackContainer,CallbackInterface}', 'dom::bindings::callback::{CallSetup,ExceptionHandling}', diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 61e1e0213d9..994ecb65e5a 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -38,6 +38,7 @@ use js::jsapi::{JSFunctionSpec, JSPropertySpec}; use js::jsapi::{JS_NewGlobalObject, JS_InitStandardClasses}; use js::jsapi::{JSString}; use js::jsapi::{JS_AllowGC, JS_InhibitGC}; +use js::jsapi::{JS_ReportErrorNumber, JSErrorFormatString, struct_JSErrorFormatString, JSEXN_TYPEERR}; use js::jsfriendapi::bindgen::JS_NewObjectWithUniqueType; use js::jsval::JSVal; use js::jsval::{PrivateValue, ObjectValue, NullValue, ObjectOrNullValue}; @@ -368,6 +369,33 @@ fn CreateInterfacePrototypeObject(cx: *JSContext, global: *JSObject, } } +static ErrorFormatStringString: [libc::c_char, ..4] = [ + '{' as libc::c_char, + '0' as libc::c_char, + '}' as libc::c_char, + 0 as libc::c_char, +]; + +static ErrorFormatString: JSErrorFormatString = struct_JSErrorFormatString { + format: &ErrorFormatStringString as *libc::c_char, + argCount: 1, + exnType: JSEXN_TYPEERR as i16, +}; + +extern fn GetErrorMessage(_user_ref: *mut libc::c_void, _locale: *libc::c_char, + aErrorNumber: libc::c_uint) -> *JSErrorFormatString +{ + assert_eq!(aErrorNumber, 0); + &ErrorFormatString as *JSErrorFormatString +} + +pub fn ThrowTypeError(cx: *JSContext, error: &str) { + let error = error.to_c_str(); + error.with_ref(|error| unsafe { + JS_ReportErrorNumber(cx, GetErrorMessage, ptr::null(), 0, error); + }); +} + pub extern fn ThrowingConstructor(_cx: *JSContext, _argc: c_uint, _vp: *mut JSVal) -> JSBool { //XXX should trigger exception here return 0; diff --git a/src/support/spidermonkey/rust-mozjs b/src/support/spidermonkey/rust-mozjs index 46a6ae354fa..92d2979ff96 160000 --- a/src/support/spidermonkey/rust-mozjs +++ b/src/support/spidermonkey/rust-mozjs @@ -1 +1 @@ -Subproject commit 46a6ae354fadc11a228c78b32e4365f6b6d8006d +Subproject commit 92d2979ff9656e6dcc018486bc3a7d1bcc63fd99 From 7ff9fff421f9ccc6cb00e7be6d327b82ef05d754 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 28 Apr 2014 16:50:53 +0200 Subject: [PATCH 2/3] Move ThrowTypeError to error.rs. --- .../dom/bindings/codegen/CodegenRust.py | 2 +- src/components/script/dom/bindings/error.rs | 32 ++++++++++++++++++- src/components/script/dom/bindings/utils.rs | 28 ---------------- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 5f0a7e01c79..8eee27cd063 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -4329,7 +4329,6 @@ class CGBindingRoot(CGThing): 'dom::bindings::utils::{VoidVal, with_gc_disabled}', 'dom::bindings::utils::{with_gc_enabled}', 'dom::bindings::utils::get_dictionary_property', - 'dom::bindings::utils::ThrowTypeError', 'dom::bindings::trace::JSTraceable', 'dom::bindings::callback::{CallbackContainer,CallbackInterface}', 'dom::bindings::callback::{CallSetup,ExceptionHandling}', @@ -4341,6 +4340,7 @@ class CGBindingRoot(CGThing): 'dom::bindings::codegen::UnionTypes::*', 'dom::bindings::error::{FailureUnknown, Fallible, Error, ErrorResult}', 'dom::bindings::error::{throw_method_failed_with_details}', + 'dom::bindings::error::ThrowTypeError', 'script_task::JSPageInfo', 'dom::bindings::proxyhandler', 'dom::bindings::proxyhandler::{_obj_toString, defineProperty}', diff --git a/src/components/script/dom/bindings/error.rs b/src/components/script/dom/bindings/error.rs index aa4c84cd981..fae59d95342 100644 --- a/src/components/script/dom/bindings/error.rs +++ b/src/components/script/dom/bindings/error.rs @@ -4,9 +4,12 @@ use js::jsapi::{JSContext, JSBool}; use js::jsapi::{JS_IsExceptionPending}; - +use js::jsapi::{JS_ReportErrorNumber, JSErrorFormatString, struct_JSErrorFormatString, JSEXN_TYPEERR}; use js::glue::{ReportError}; +use libc; +use std::ptr; + #[deriving(Show)] pub enum Error { IndexSize, @@ -44,3 +47,30 @@ pub fn throw_not_in_union(cx: *JSContext, names: &'static str) -> JSBool { }); return 0; } + +static ErrorFormatStringString: [libc::c_char, ..4] = [ + '{' as libc::c_char, + '0' as libc::c_char, + '}' as libc::c_char, + 0 as libc::c_char, +]; + +static ErrorFormatString: JSErrorFormatString = struct_JSErrorFormatString { + format: &ErrorFormatStringString as *libc::c_char, + argCount: 1, + exnType: JSEXN_TYPEERR as i16, +}; + +extern fn GetErrorMessage(_user_ref: *mut libc::c_void, _locale: *libc::c_char, + aErrorNumber: libc::c_uint) -> *JSErrorFormatString +{ + assert_eq!(aErrorNumber, 0); + &ErrorFormatString as *JSErrorFormatString +} + +pub fn ThrowTypeError(cx: *JSContext, error: &str) { + let error = error.to_c_str(); + error.with_ref(|error| unsafe { + JS_ReportErrorNumber(cx, GetErrorMessage, ptr::null(), 0, error); + }); +} diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 994ecb65e5a..61e1e0213d9 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -38,7 +38,6 @@ use js::jsapi::{JSFunctionSpec, JSPropertySpec}; use js::jsapi::{JS_NewGlobalObject, JS_InitStandardClasses}; use js::jsapi::{JSString}; use js::jsapi::{JS_AllowGC, JS_InhibitGC}; -use js::jsapi::{JS_ReportErrorNumber, JSErrorFormatString, struct_JSErrorFormatString, JSEXN_TYPEERR}; use js::jsfriendapi::bindgen::JS_NewObjectWithUniqueType; use js::jsval::JSVal; use js::jsval::{PrivateValue, ObjectValue, NullValue, ObjectOrNullValue}; @@ -369,33 +368,6 @@ fn CreateInterfacePrototypeObject(cx: *JSContext, global: *JSObject, } } -static ErrorFormatStringString: [libc::c_char, ..4] = [ - '{' as libc::c_char, - '0' as libc::c_char, - '}' as libc::c_char, - 0 as libc::c_char, -]; - -static ErrorFormatString: JSErrorFormatString = struct_JSErrorFormatString { - format: &ErrorFormatStringString as *libc::c_char, - argCount: 1, - exnType: JSEXN_TYPEERR as i16, -}; - -extern fn GetErrorMessage(_user_ref: *mut libc::c_void, _locale: *libc::c_char, - aErrorNumber: libc::c_uint) -> *JSErrorFormatString -{ - assert_eq!(aErrorNumber, 0); - &ErrorFormatString as *JSErrorFormatString -} - -pub fn ThrowTypeError(cx: *JSContext, error: &str) { - let error = error.to_c_str(); - error.with_ref(|error| unsafe { - JS_ReportErrorNumber(cx, GetErrorMessage, ptr::null(), 0, error); - }); -} - pub extern fn ThrowingConstructor(_cx: *JSContext, _argc: c_uint, _vp: *mut JSVal) -> JSBool { //XXX should trigger exception here return 0; From 505e7d472a6607ab7d1e154bf8647c4862e2a208 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 28 Apr 2014 17:18:28 +0200 Subject: [PATCH 3/3] Use more rustic names for ThrowTypeError and infrastructure. --- .../dom/bindings/codegen/CodegenRust.py | 4 ++-- src/components/script/dom/bindings/error.rs | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 8eee27cd063..1efc517b9e0 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -176,7 +176,7 @@ class CGMethodCall(CGThing): if requiredArgs > 0: code = ( "if argc < %d {\n" - " ThrowTypeError(cx, \"Not enough arguments to %s.\");\n" + " throw_type_error(cx, \"Not enough arguments to %s.\");\n" " return 0;\n" "}" % (requiredArgs, methodName)) self.cgRoot.prepend( @@ -4340,7 +4340,7 @@ class CGBindingRoot(CGThing): 'dom::bindings::codegen::UnionTypes::*', 'dom::bindings::error::{FailureUnknown, Fallible, Error, ErrorResult}', 'dom::bindings::error::{throw_method_failed_with_details}', - 'dom::bindings::error::ThrowTypeError', + 'dom::bindings::error::throw_type_error', 'script_task::JSPageInfo', 'dom::bindings::proxyhandler', 'dom::bindings::proxyhandler::{_obj_toString, defineProperty}', diff --git a/src/components/script/dom/bindings/error.rs b/src/components/script/dom/bindings/error.rs index fae59d95342..bbfad388e4f 100644 --- a/src/components/script/dom/bindings/error.rs +++ b/src/components/script/dom/bindings/error.rs @@ -48,29 +48,30 @@ pub fn throw_not_in_union(cx: *JSContext, names: &'static str) -> JSBool { return 0; } -static ErrorFormatStringString: [libc::c_char, ..4] = [ +static ERROR_FORMAT_STRING_STRING: [libc::c_char, ..4] = [ '{' as libc::c_char, '0' as libc::c_char, '}' as libc::c_char, 0 as libc::c_char, ]; -static ErrorFormatString: JSErrorFormatString = struct_JSErrorFormatString { - format: &ErrorFormatStringString as *libc::c_char, +static ERROR_FORMAT_STRING: JSErrorFormatString = struct_JSErrorFormatString { + format: &ERROR_FORMAT_STRING_STRING as *libc::c_char, argCount: 1, exnType: JSEXN_TYPEERR as i16, }; -extern fn GetErrorMessage(_user_ref: *mut libc::c_void, _locale: *libc::c_char, - aErrorNumber: libc::c_uint) -> *JSErrorFormatString +extern fn get_error_message(_user_ref: *mut libc::c_void, + _locale: *libc::c_char, + error_number: libc::c_uint) -> *JSErrorFormatString { - assert_eq!(aErrorNumber, 0); - &ErrorFormatString as *JSErrorFormatString + assert_eq!(error_number, 0); + &ERROR_FORMAT_STRING as *JSErrorFormatString } -pub fn ThrowTypeError(cx: *JSContext, error: &str) { +pub fn throw_type_error(cx: *JSContext, error: &str) { let error = error.to_c_str(); error.with_ref(|error| unsafe { - JS_ReportErrorNumber(cx, GetErrorMessage, ptr::null(), 0, error); + JS_ReportErrorNumber(cx, get_error_message, ptr::null(), 0, error); }); }