auto merge of #1791 : Ms2ger/servo/conversions, r=jdm

This commit is contained in:
bors-servo 2014-03-03 13:13:35 -05:00
commit b8de1b3ca7
3 changed files with 36 additions and 64 deletions

View file

@ -1246,7 +1246,7 @@ for (uint32_t i = 0; i < length; ++i) {
"if (%s) {\n" "if (%s) {\n"
" ${declName} = None;\n" " ${declName} = None;\n"
"} else {\n" "} else {\n"
" match JSValConvertible::from_jsval(${val}) {\n" " match JSValConvertible::from_jsval(cx, ${val}) {\n"
" Some(val_) => ${declName} = Some(%s),\n" " Some(val_) => ${declName} = Some(%s),\n"
" None => %s\n" " None => %s\n"
" }\n" " }\n"
@ -1261,7 +1261,7 @@ for (uint32_t i = 0; i < length; ++i) {
if preSuccess or postSuccess: if preSuccess or postSuccess:
successVal = preSuccess + successVal + postSuccess successVal = preSuccess + successVal + postSuccess
template = ( template = (
"match JSValConvertible::from_jsval(${val}) {\n" "match JSValConvertible::from_jsval(cx, ${val}) {\n"
" None => %s,\n" " None => %s,\n"
" Some(v) => %s = %s\n" " Some(v) => %s = %s\n"
"}" % (failureCode, dataLoc, successVal)) "}" % (failureCode, dataLoc, successVal))

View file

@ -2,15 +2,27 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use js::jsapi::JSVal; 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::{JSVAL_FALSE, JSVAL_TRUE};
use js::glue::{RUST_UINT_TO_JSVAL, RUST_JSVAL_TO_INT, RUST_DOUBLE_TO_JSVAL}; use js::glue::{RUST_UINT_TO_JSVAL, 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};
pub trait JSValConvertible { pub trait JSValConvertible {
fn to_jsval(&self) -> JSVal; fn to_jsval(&self) -> JSVal;
fn from_jsval(val: JSVal) -> Option<Self>; fn from_jsval(cx: *JSContext, val: JSVal) -> Option<Self>;
}
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)
}
} }
@ -21,14 +33,8 @@ impl JSValConvertible for i64 {
} }
} }
fn from_jsval(val: JSVal) -> Option<i64> { fn from_jsval(cx: *JSContext, val: JSVal) -> Option<i64> {
unsafe { unsafe { convert_from_jsval(cx, val, JS_ValueToInt64) }
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_DOUBLE(val) as i64)
} else {
None
}
}
} }
} }
@ -39,14 +45,8 @@ impl JSValConvertible for u32 {
} }
} }
fn from_jsval(val: JSVal) -> Option<u32> { fn from_jsval(cx: *JSContext, val: JSVal) -> Option<u32> {
unsafe { unsafe { convert_from_jsval(cx, val, JS_ValueToECMAUint32) }
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_INT(val) as u32)
} else {
None
}
}
} }
} }
@ -57,14 +57,8 @@ impl JSValConvertible for i32 {
} }
} }
fn from_jsval(val: JSVal) -> Option<i32> { fn from_jsval(cx: *JSContext, val: JSVal) -> Option<i32> {
unsafe { unsafe { convert_from_jsval(cx, val, JS_ValueToECMAInt32) }
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_INT(val) as i32)
} else {
None
}
}
} }
} }
@ -75,14 +69,8 @@ impl JSValConvertible for u16 {
} }
} }
fn from_jsval(val: JSVal) -> Option<u16> { fn from_jsval(cx: *JSContext, val: JSVal) -> Option<u16> {
unsafe { unsafe { convert_from_jsval(cx, val, JS_ValueToUint16) }
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_INT(val) as u16)
} else {
None
}
}
} }
} }
@ -95,14 +83,9 @@ impl JSValConvertible for bool {
} }
} }
fn from_jsval(val: JSVal) -> Option<bool> { fn from_jsval(cx: *JSContext, val: JSVal) -> Option<bool> {
unsafe { let result = unsafe { convert_from_jsval(cx, val, JS_ValueToBoolean) };
if RUST_JSVAL_IS_BOOLEAN(val) != 0 { result.map(|b| b != 0)
Some(RUST_JSVAL_TO_BOOLEAN(val) != 0)
} else {
None
}
}
} }
} }
@ -113,14 +96,9 @@ impl JSValConvertible for f32 {
} }
} }
fn from_jsval(val: JSVal) -> Option<f32> { fn from_jsval(cx: *JSContext, val: JSVal) -> Option<f32> {
unsafe { let result = unsafe { convert_from_jsval(cx, val, JS_ValueToNumber) };
if RUST_JSVAL_IS_DOUBLE(val) != 0 { result.map(|f| f as f32)
Some(RUST_JSVAL_TO_DOUBLE(val) as f32)
} else {
None
}
}
} }
} }
@ -131,13 +109,7 @@ impl JSValConvertible for f64 {
} }
} }
fn from_jsval(val: JSVal) -> Option<f64> { fn from_jsval(cx: *JSContext, val: JSVal) -> Option<f64> {
unsafe { unsafe { convert_from_jsval(cx, val, JS_ValueToNumber) }
if RUST_JSVAL_IS_DOUBLE(val) != 0 {
Some(RUST_JSVAL_TO_DOUBLE(val) as f64)
} else {
None
}
}
} }
} }

View file

@ -18,7 +18,7 @@
}); });
should_throw(function() { sel.add(div) }); should_throw(function() { sel.add(div) });
should_throw(function() { sel.add(optgroup, function() {}) }); should_not_throw(function() { sel.add(optgroup, function() {}) });
finish(); finish();
</script> </script>