From 6bc2c79f926ce32e5a23300a0ad27086bcef00ce Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sun, 2 Mar 2014 22:30:54 +0100 Subject: [PATCH 1/3] Pass a JSContext to JSValConvertible::from_jsval. --- .../script/dom/bindings/codegen/CodegenRust.py | 4 ++-- .../script/dom/bindings/conversions.rs | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 6000e2abcba..f1d5a4d73ff 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -1246,7 +1246,7 @@ for (uint32_t i = 0; i < length; ++i) { "if (%s) {\n" " ${declName} = None;\n" "} else {\n" - " match JSValConvertible::from_jsval(${val}) {\n" + " match JSValConvertible::from_jsval(cx, ${val}) {\n" " Some(val_) => ${declName} = Some(%s),\n" " None => %s\n" " }\n" @@ -1261,7 +1261,7 @@ for (uint32_t i = 0; i < length; ++i) { if preSuccess or postSuccess: successVal = preSuccess + successVal + postSuccess template = ( - "match JSValConvertible::from_jsval(${val}) {\n" + "match JSValConvertible::from_jsval(cx, ${val}) {\n" " None => %s,\n" " Some(v) => %s = %s\n" "}" % (failureCode, dataLoc, successVal)) diff --git a/src/components/script/dom/bindings/conversions.rs b/src/components/script/dom/bindings/conversions.rs index decb047ab9f..3951e456897 100644 --- a/src/components/script/dom/bindings/conversions.rs +++ b/src/components/script/dom/bindings/conversions.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use js::jsapi::JSVal; +use js::jsapi::{JSVal, JSContext}; use js::{JSVAL_FALSE, JSVAL_TRUE}; use js::glue::{RUST_UINT_TO_JSVAL, RUST_JSVAL_TO_INT, RUST_DOUBLE_TO_JSVAL}; use js::glue::{RUST_JSVAL_TO_DOUBLE, RUST_JSVAL_IS_INT, RUST_JSVAL_IS_DOUBLE}; @@ -10,7 +10,7 @@ use js::glue::{RUST_JSVAL_IS_BOOLEAN, RUST_JSVAL_TO_BOOLEAN}; pub trait JSValConvertible { fn to_jsval(&self) -> JSVal; - fn from_jsval(val: JSVal) -> Option; + fn from_jsval(cx: *JSContext, val: JSVal) -> Option; } @@ -21,7 +21,7 @@ impl JSValConvertible for i64 { } } - fn from_jsval(val: JSVal) -> Option { + fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { unsafe { if RUST_JSVAL_IS_INT(val) != 0 { Some(RUST_JSVAL_TO_DOUBLE(val) as i64) @@ -39,7 +39,7 @@ impl JSValConvertible for u32 { } } - fn from_jsval(val: JSVal) -> Option { + fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { unsafe { if RUST_JSVAL_IS_INT(val) != 0 { Some(RUST_JSVAL_TO_INT(val) as u32) @@ -57,7 +57,7 @@ impl JSValConvertible for i32 { } } - fn from_jsval(val: JSVal) -> Option { + fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { unsafe { if RUST_JSVAL_IS_INT(val) != 0 { Some(RUST_JSVAL_TO_INT(val) as i32) @@ -75,7 +75,7 @@ impl JSValConvertible for u16 { } } - fn from_jsval(val: JSVal) -> Option { + fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { unsafe { if RUST_JSVAL_IS_INT(val) != 0 { Some(RUST_JSVAL_TO_INT(val) as u16) @@ -95,7 +95,7 @@ impl JSValConvertible for bool { } } - fn from_jsval(val: JSVal) -> Option { + fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { unsafe { if RUST_JSVAL_IS_BOOLEAN(val) != 0 { Some(RUST_JSVAL_TO_BOOLEAN(val) != 0) @@ -113,7 +113,7 @@ impl JSValConvertible for f32 { } } - fn from_jsval(val: JSVal) -> Option { + fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { unsafe { if RUST_JSVAL_IS_DOUBLE(val) != 0 { Some(RUST_JSVAL_TO_DOUBLE(val) as f32) @@ -131,7 +131,7 @@ impl JSValConvertible for f64 { } } - fn from_jsval(val: JSVal) -> Option { + fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { unsafe { if RUST_JSVAL_IS_DOUBLE(val) != 0 { Some(RUST_JSVAL_TO_DOUBLE(val) as f64) From 87715c14e19702ea644ca8a3dea4f70666d2b242 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sun, 2 Mar 2014 22:56:07 +0100 Subject: [PATCH 2/3] Reimplement conversion to primitive types for correctness in the face of non-primitive arguments. --- .../script/dom/bindings/conversions.rs | 92 +++++++------------ 1 file changed, 32 insertions(+), 60 deletions(-) diff --git a/src/components/script/dom/bindings/conversions.rs b/src/components/script/dom/bindings/conversions.rs index 3951e456897..116b74e8efa 100644 --- a/src/components/script/dom/bindings/conversions.rs +++ b/src/components/script/dom/bindings/conversions.rs @@ -2,11 +2,11 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use js::jsapi::{JSVal, JSContext}; +use js::jsapi::{JSVal, JSBool, JSContext}; +use js::jsapi::{JS_ValueToInt64, JS_ValueToECMAInt32, JS_ValueToECMAUint32}; +use js::jsapi::{JS_ValueToUint16, JS_ValueToNumber, JS_ValueToBoolean}; use js::{JSVAL_FALSE, JSVAL_TRUE}; -use js::glue::{RUST_UINT_TO_JSVAL, RUST_JSVAL_TO_INT, RUST_DOUBLE_TO_JSVAL}; -use js::glue::{RUST_JSVAL_TO_DOUBLE, RUST_JSVAL_IS_INT, RUST_JSVAL_IS_DOUBLE}; -use js::glue::{RUST_JSVAL_IS_BOOLEAN, RUST_JSVAL_TO_BOOLEAN}; +use js::glue::{RUST_UINT_TO_JSVAL, RUST_DOUBLE_TO_JSVAL}; pub trait JSValConvertible { fn to_jsval(&self) -> JSVal; @@ -14,6 +14,18 @@ pub trait JSValConvertible { } +unsafe fn convert_from_jsval( + cx: *JSContext, value: JSVal, + convert_fn: extern "C" unsafe fn(*JSContext, JSVal, *T) -> JSBool) -> Option { + let mut ret = Default::default(); + if convert_fn(cx, value, &mut ret as *mut T as *T) == 0 { + None + } else { + Some(ret) + } +} + + impl JSValConvertible for i64 { fn to_jsval(&self) -> JSVal { unsafe { @@ -21,14 +33,8 @@ impl JSValConvertible for i64 { } } - fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { - unsafe { - if RUST_JSVAL_IS_INT(val) != 0 { - Some(RUST_JSVAL_TO_DOUBLE(val) as i64) - } else { - None - } - } + fn from_jsval(cx: *JSContext, val: JSVal) -> Option { + unsafe { convert_from_jsval(cx, val, JS_ValueToInt64) } } } @@ -39,14 +45,8 @@ impl JSValConvertible for u32 { } } - fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { - unsafe { - if RUST_JSVAL_IS_INT(val) != 0 { - Some(RUST_JSVAL_TO_INT(val) as u32) - } else { - None - } - } + fn from_jsval(cx: *JSContext, val: JSVal) -> Option { + unsafe { convert_from_jsval(cx, val, JS_ValueToECMAUint32) } } } @@ -57,14 +57,8 @@ impl JSValConvertible for i32 { } } - fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { - unsafe { - if RUST_JSVAL_IS_INT(val) != 0 { - Some(RUST_JSVAL_TO_INT(val) as i32) - } else { - None - } - } + fn from_jsval(cx: *JSContext, val: JSVal) -> Option { + unsafe { convert_from_jsval(cx, val, JS_ValueToECMAInt32) } } } @@ -75,14 +69,8 @@ impl JSValConvertible for u16 { } } - fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { - unsafe { - if RUST_JSVAL_IS_INT(val) != 0 { - Some(RUST_JSVAL_TO_INT(val) as u16) - } else { - None - } - } + fn from_jsval(cx: *JSContext, val: JSVal) -> Option { + unsafe { convert_from_jsval(cx, val, JS_ValueToUint16) } } } @@ -95,14 +83,9 @@ impl JSValConvertible for bool { } } - fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { - unsafe { - if RUST_JSVAL_IS_BOOLEAN(val) != 0 { - Some(RUST_JSVAL_TO_BOOLEAN(val) != 0) - } else { - None - } - } + fn from_jsval(cx: *JSContext, val: JSVal) -> Option { + let result = unsafe { convert_from_jsval(cx, val, JS_ValueToBoolean) }; + result.map(|b| b != 0) } } @@ -113,14 +96,9 @@ impl JSValConvertible for f32 { } } - fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { - unsafe { - if RUST_JSVAL_IS_DOUBLE(val) != 0 { - Some(RUST_JSVAL_TO_DOUBLE(val) as f32) - } else { - None - } - } + fn from_jsval(cx: *JSContext, val: JSVal) -> Option { + let result = unsafe { convert_from_jsval(cx, val, JS_ValueToNumber) }; + result.map(|f| f as f32) } } @@ -131,13 +109,7 @@ impl JSValConvertible for f64 { } } - fn from_jsval(_cx: *JSContext, val: JSVal) -> Option { - unsafe { - if RUST_JSVAL_IS_DOUBLE(val) != 0 { - Some(RUST_JSVAL_TO_DOUBLE(val) as f64) - } else { - None - } - } + fn from_jsval(cx: *JSContext, val: JSVal) -> Option { + unsafe { convert_from_jsval(cx, val, JS_ValueToNumber) } } } From bb7db4c948e4bf89999201f2f364f7f3c650ae2d Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 3 Mar 2014 19:04:18 +0100 Subject: [PATCH 3/3] Fix test. --- src/test/html/content/test_union.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/html/content/test_union.html b/src/test/html/content/test_union.html index d5483ad8a3a..fd2bf84f96b 100644 --- a/src/test/html/content/test_union.html +++ b/src/test/html/content/test_union.html @@ -18,7 +18,7 @@ }); should_throw(function() { sel.add(div) }); - should_throw(function() { sel.add(optgroup, function() {}) }); + should_not_throw(function() { sel.add(optgroup, function() {}) }); finish();