Return rlua::Error on out of range numeric conversions using num_traits::cast
This commit is contained in:
parent
6a5ec6b387
commit
c3d0110722
|
@ -34,6 +34,7 @@ system-lua = ["pkg-config"]
|
||||||
[dependencies]
|
[dependencies]
|
||||||
libc = { version = "0.2" }
|
libc = { version = "0.2" }
|
||||||
failure = { version = "0.1.2" }
|
failure = { version = "0.1.2" }
|
||||||
|
num-traits = { version = "0.2" }
|
||||||
compiletest_rs = { version = "0.3", optional = true }
|
compiletest_rs = { version = "0.3", optional = true }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
|
|
|
@ -2,13 +2,15 @@ use std::collections::{BTreeMap, HashMap};
|
||||||
use std::hash::{BuildHasher, Hash};
|
use std::hash::{BuildHasher, Hash};
|
||||||
use std::string::String as StdString;
|
use std::string::String as StdString;
|
||||||
|
|
||||||
|
use num_traits::cast;
|
||||||
|
|
||||||
use error::{Error, Result};
|
use error::{Error, Result};
|
||||||
use function::Function;
|
use function::Function;
|
||||||
use lua::Lua;
|
use lua::Lua;
|
||||||
use string::String;
|
use string::String;
|
||||||
use table::Table;
|
use table::Table;
|
||||||
use thread::Thread;
|
use thread::Thread;
|
||||||
use types::{Integer, LightUserData, Number};
|
use types::{LightUserData, Number};
|
||||||
use userdata::{AnyUserData, UserData};
|
use userdata::{AnyUserData, UserData};
|
||||||
use value::{FromLua, Nil, ToLua, Value};
|
use value::{FromLua, Nil, ToLua, Value};
|
||||||
|
|
||||||
|
@ -207,13 +209,22 @@ macro_rules! lua_convert_int {
|
||||||
($x:ty) => {
|
($x:ty) => {
|
||||||
impl<'lua> ToLua<'lua> for $x {
|
impl<'lua> ToLua<'lua> for $x {
|
||||||
fn to_lua(self, _: &'lua Lua) -> Result<Value<'lua>> {
|
fn to_lua(self, _: &'lua Lua) -> Result<Value<'lua>> {
|
||||||
Ok(Value::Integer(self as Integer))
|
cast(self)
|
||||||
|
.ok_or_else(|| Error::ToLuaConversionError {
|
||||||
|
from: stringify!($x),
|
||||||
|
to: "integer",
|
||||||
|
message: Some("integer out of range".to_owned()),
|
||||||
|
}).map(Value::Integer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'lua> FromLua<'lua> for $x {
|
impl<'lua> FromLua<'lua> for $x {
|
||||||
fn from_lua(value: Value<'lua>, lua: &'lua Lua) -> Result<Self> {
|
fn from_lua(value: Value<'lua>, lua: &'lua Lua) -> Result<Self> {
|
||||||
Ok(lua.coerce_integer(value)? as $x)
|
cast(lua.coerce_integer(value)?).ok_or_else(|| Error::FromLuaConversionError {
|
||||||
|
from: "integer",
|
||||||
|
to: stringify!($x),
|
||||||
|
message: Some("integer out of range".to_owned()),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -227,6 +238,8 @@ lua_convert_int!(i32);
|
||||||
lua_convert_int!(u32);
|
lua_convert_int!(u32);
|
||||||
lua_convert_int!(i64);
|
lua_convert_int!(i64);
|
||||||
lua_convert_int!(u64);
|
lua_convert_int!(u64);
|
||||||
|
lua_convert_int!(i128);
|
||||||
|
lua_convert_int!(u128);
|
||||||
lua_convert_int!(isize);
|
lua_convert_int!(isize);
|
||||||
lua_convert_int!(usize);
|
lua_convert_int!(usize);
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
|
|
||||||
extern crate failure;
|
extern crate failure;
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
|
extern crate num_traits;
|
||||||
|
|
||||||
mod error;
|
mod error;
|
||||||
mod ffi;
|
mod ffi;
|
||||||
|
|
|
@ -373,6 +373,10 @@ fn test_num_conversion() {
|
||||||
|
|
||||||
lua.exec::<()>("a = math.huge", None).unwrap();
|
lua.exec::<()>("a = math.huge", None).unwrap();
|
||||||
assert!(globals.get::<_, i64>("n").is_err());
|
assert!(globals.get::<_, i64>("n").is_err());
|
||||||
|
|
||||||
|
assert!(lua.eval::<u64>("-1", None).is_err());
|
||||||
|
assert!(lua.eval::<i64>("-1", None).is_ok());
|
||||||
|
assert!(lua.pack(1u128 << 64).is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Reference in New Issue