mirror of
https://github.com/servo/servo.git
synced 2025-06-24 09:04:33 +01:00
Reimplement conversion to primitive types for correctness in the face of non-primitive arguments.
This commit is contained in:
parent
6bc2c79f92
commit
87715c14e1
1 changed files with 32 additions and 60 deletions
|
@ -2,11 +2,11 @@
|
||||||
* 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, 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::{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;
|
||||||
|
@ -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 {
|
impl JSValConvertible for i64 {
|
||||||
fn to_jsval(&self) -> JSVal {
|
fn to_jsval(&self) -> JSVal {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -21,14 +33,8 @@ impl JSValConvertible for i64 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn from_jsval(_cx: *JSContext, 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(_cx: *JSContext, 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(_cx: *JSContext, 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(_cx: *JSContext, 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(_cx: *JSContext, 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(_cx: *JSContext, 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(_cx: *JSContext, 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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue