Return rlua::Error on out of range numeric conversions using num_traits::cast

This commit is contained in:
kyren 2018-09-24 22:14:50 -04:00
parent 6a5ec6b387
commit c3d0110722
4 changed files with 22 additions and 3 deletions

View File

@ -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]

View File

@ -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);

View File

@ -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;

View File

@ -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]