aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-03-02 22:56:07 +0100
committerMs2ger <ms2ger@gmail.com>2014-03-02 22:56:07 +0100
commit87715c14e19702ea644ca8a3dea4f70666d2b242 (patch)
tree4094badae605f97e456651a9dc49dcd3dbca4729 /src
parent6bc2c79f926ce32e5a23300a0ad27086bcef00ce (diff)
downloadservo-87715c14e19702ea644ca8a3dea4f70666d2b242.tar.gz
servo-87715c14e19702ea644ca8a3dea4f70666d2b242.zip
Reimplement conversion to primitive types for correctness in the face of non-primitive arguments.
Diffstat (limited to 'src')
-rw-r--r--src/components/script/dom/bindings/conversions.rs92
1 files 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<T: Default>(
+ cx: *JSContext, value: JSVal,
+ convert_fn: extern "C" unsafe fn(*JSContext, JSVal, *T) -> JSBool) -> Option<T> {
+ 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<i64> {
- 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<i64> {
+ unsafe { convert_from_jsval(cx, val, JS_ValueToInt64) }
}
}
@@ -39,14 +45,8 @@ impl JSValConvertible for u32 {
}
}
- fn from_jsval(_cx: *JSContext, val: JSVal) -> Option<u32> {
- 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<u32> {
+ unsafe { convert_from_jsval(cx, val, JS_ValueToECMAUint32) }
}
}
@@ -57,14 +57,8 @@ impl JSValConvertible for i32 {
}
}
- fn from_jsval(_cx: *JSContext, val: JSVal) -> Option<i32> {
- 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<i32> {
+ unsafe { convert_from_jsval(cx, val, JS_ValueToECMAInt32) }
}
}
@@ -75,14 +69,8 @@ impl JSValConvertible for u16 {
}
}
- fn from_jsval(_cx: *JSContext, val: JSVal) -> Option<u16> {
- 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<u16> {
+ unsafe { convert_from_jsval(cx, val, JS_ValueToUint16) }
}
}
@@ -95,14 +83,9 @@ impl JSValConvertible for bool {
}
}
- fn from_jsval(_cx: *JSContext, val: JSVal) -> Option<bool> {
- 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<bool> {
+ 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<f32> {
- 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<f32> {
+ 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<f64> {
- 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<f64> {
+ unsafe { convert_from_jsval(cx, val, JS_ValueToNumber) }
}
}