ACTUALLY correctly limit numeric conversions

Don't mistakenly do rust-side conversions from integer <-> number
This commit is contained in:
kyren 2017-06-23 00:51:16 -04:00
parent 918edad1b2
commit 3ab3970c01
2 changed files with 16 additions and 10 deletions

View File

@ -1238,7 +1238,6 @@ impl Lua {
pub fn coerce_integer(&self, v: LuaValue) -> LuaResult<LuaInteger> { pub fn coerce_integer(&self, v: LuaValue) -> LuaResult<LuaInteger> {
match v { match v {
LuaValue::Integer(i) => Ok(i), LuaValue::Integer(i) => Ok(i),
LuaValue::Number(n) => Ok(n as LuaInteger),
v => unsafe { v => unsafe {
stack_guard(self.state, 0, || { stack_guard(self.state, 0, || {
check_stack(self.state, 1)?; check_stack(self.state, 1)?;
@ -1262,7 +1261,6 @@ impl Lua {
/// manual for details. /// manual for details.
pub fn coerce_number(&self, v: LuaValue) -> LuaResult<LuaNumber> { pub fn coerce_number(&self, v: LuaValue) -> LuaResult<LuaNumber> {
match v { match v {
LuaValue::Integer(i) => Ok(i as LuaNumber),
LuaValue::Number(n) => Ok(n), LuaValue::Number(n) => Ok(n),
v => unsafe { v => unsafe {
stack_guard(self.state, 0, || { stack_guard(self.state, 0, || {

View File

@ -730,13 +730,21 @@ fn test_num_conversion() {
let lua = Lua::new(); let lua = Lua::new();
let globals = lua.globals().unwrap(); let globals = lua.globals().unwrap();
globals.set("a", "1.0").unwrap(); globals.set("n", "1.0").unwrap();
assert_eq!(globals.get::<_, i64>("a").unwrap(), 1); assert_eq!(globals.get::<_, i64>("n").unwrap(), 1);
assert_eq!(globals.get::<_, f64>("a").unwrap(), 1.0); assert_eq!(globals.get::<_, f64>("n").unwrap(), 1.0);
assert_eq!(globals.get::<_, String>("a").unwrap(), "1.0"); assert_eq!(globals.get::<_, String>("n").unwrap(), "1.0");
globals.set("a", "1.5").unwrap(); globals.set("n", "1.5").unwrap();
assert!(globals.get::<_, i64>("a").is_err()); assert!(globals.get::<_, i64>("n").is_err());
assert_eq!(globals.get::<_, f64>("a").unwrap(), 1.5); assert_eq!(globals.get::<_, f64>("n").unwrap(), 1.5);
assert_eq!(globals.get::<_, String>("a").unwrap(), "1.5"); assert_eq!(globals.get::<_, String>("n").unwrap(), "1.5");
globals.set("n", 1.5).unwrap();
assert!(globals.get::<_, i64>("n").is_err());
assert_eq!(globals.get::<_, f64>("n").unwrap(), 1.5);
assert_eq!(globals.get::<_, String>("n").unwrap(), "1.5");
lua.exec::<()>("a = math.huge", None).unwrap();
assert!(globals.get::<_, i64>("n").is_err());
} }