Make JSVal conversions actually fallible.

This commit is contained in:
Josh Matthews 2014-02-24 17:18:47 -05:00
parent 4cdb4df70c
commit 02d2ec5ccd

View file

@ -4,7 +4,9 @@
use js::jsapi::JSVal;
use js::{JSVAL_FALSE, JSVAL_TRUE};
use js::glue::{RUST_UINT_TO_JSVAL, RUST_JSVAL_TO_INT, RUST_DOUBLE_TO_JSVAL, RUST_JSVAL_TO_DOUBLE};
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};
pub trait JSValConvertible {
fn to_jsval(&self) -> JSVal;
@ -21,7 +23,11 @@ impl JSValConvertible for i64 {
fn from_jsval(val: JSVal) -> Option<i64> {
unsafe {
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_DOUBLE(val) as i64)
} else {
None
}
}
}
}
@ -35,7 +41,11 @@ impl JSValConvertible for u32 {
fn from_jsval(val: JSVal) -> Option<u32> {
unsafe {
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_INT(val) as u32)
} else {
None
}
}
}
}
@ -49,7 +59,11 @@ impl JSValConvertible for i32 {
fn from_jsval(val: JSVal) -> Option<i32> {
unsafe {
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_INT(val) as i32)
} else {
None
}
}
}
}
@ -63,7 +77,11 @@ impl JSValConvertible for u16 {
fn from_jsval(val: JSVal) -> Option<u16> {
unsafe {
if RUST_JSVAL_IS_INT(val) != 0 {
Some(RUST_JSVAL_TO_INT(val) as u16)
} else {
None
}
}
}
}
@ -78,14 +96,14 @@ impl JSValConvertible for bool {
}
fn from_jsval(val: JSVal) -> Option<bool> {
if val == JSVAL_TRUE {
Some(true)
} else if val == JSVAL_FALSE {
Some(false)
unsafe {
if RUST_JSVAL_IS_BOOLEAN(val) != 0 {
Some(RUST_JSVAL_TO_BOOLEAN(val) != 0)
} else {
None
}
}
}
}
impl JSValConvertible for f32 {
@ -97,7 +115,11 @@ impl JSValConvertible for f32 {
fn from_jsval(val: JSVal) -> Option<f32> {
unsafe {
if RUST_JSVAL_IS_DOUBLE(val) != 0 {
Some(RUST_JSVAL_TO_DOUBLE(val) as f32)
} else {
None
}
}
}
}
@ -111,7 +133,11 @@ impl JSValConvertible for f64 {
fn from_jsval(val: JSVal) -> Option<f64> {
unsafe {
if RUST_JSVAL_IS_DOUBLE(val) != 0 {
Some(RUST_JSVAL_TO_DOUBLE(val) as f64)
} else {
None
}
}
}
}