Skip to content

Commit b6ff501

Browse files
committed
Fix numeric types conversion for 32bit lua. Fix #27
1 parent 0e73ae1 commit b6ff501

File tree

4 files changed

+26
-31
lines changed

4 files changed

+26
-31
lines changed

src/conversion.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::lua::Lua;
1212
use crate::string::String;
1313
use crate::table::Table;
1414
use crate::thread::Thread;
15-
use crate::types::{LightUserData, MaybeSend, Number};
15+
use crate::types::{LightUserData, MaybeSend};
1616
use crate::userdata::{AnyUserData, UserData};
1717
use crate::value::{FromLua, Nil, ToLua, Value};
1818

@@ -345,7 +345,13 @@ macro_rules! lua_convert_float {
345345
($x:ty) => {
346346
impl<'lua> ToLua<'lua> for $x {
347347
fn to_lua(self, _: &'lua Lua) -> Result<Value<'lua>> {
348-
Ok(Value::Number(self as Number))
348+
cast(self)
349+
.ok_or_else(|| Error::ToLuaConversionError {
350+
from: stringify!($x),
351+
to: "number",
352+
message: Some("out of range".to_string()),
353+
})
354+
.map(Value::Number)
349355
}
350356
}
351357

src/serde/de.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ impl<'lua, 'de> serde::Deserializer<'de> for Deserializer<'lua> {
2020
match self.0 {
2121
Value::Nil => visitor.visit_unit(),
2222
Value::Boolean(b) => visitor.visit_bool(b),
23-
Value::Integer(i) => visitor.visit_i64(i),
24-
Value::Number(n) => visitor.visit_f64(n),
23+
Value::Integer(i) => visitor.visit_i64(i.into()),
24+
Value::Number(n) => visitor.visit_f64(n.into()),
2525
Value::String(s) => match s.to_str() {
2626
Ok(s) => visitor.visit_str(s),
2727
Err(_) => visitor.visit_bytes(s.as_bytes()),

src/serde/ser.rs

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@ use crate::ffi;
88
use crate::lua::Lua;
99
use crate::string::String;
1010
use crate::table::Table;
11-
use crate::types::{Integer, Number};
11+
use crate::types::Integer;
1212
use crate::util::{assert_stack, protect_lua, StackGuard};
13-
use crate::value::Value;
13+
use crate::value::{ToLua, Value};
1414

1515
/// A struct for serializing Rust values into Lua values.
1616
pub struct Serializer<'lua>(pub &'lua Lua);
1717

18-
macro_rules! lua_serialize_integer {
18+
macro_rules! lua_serialize_number {
1919
($name:ident, $t:ty) => {
2020
#[inline]
2121
fn $name(self, value: $t) -> Result<Value<'lua>> {
22-
Ok(Value::Integer(value as Integer))
22+
value.to_lua(self.0)
2323
}
2424
};
2525
}
@@ -43,28 +43,17 @@ impl<'lua> ser::Serializer for Serializer<'lua> {
4343
Ok(Value::Boolean(value))
4444
}
4545

46-
lua_serialize_integer!(serialize_i8, i8);
47-
lua_serialize_integer!(serialize_u8, u8);
48-
lua_serialize_integer!(serialize_i16, i16);
49-
lua_serialize_integer!(serialize_u16, u16);
50-
lua_serialize_integer!(serialize_i32, i32);
51-
lua_serialize_integer!(serialize_u32, u32);
52-
lua_serialize_integer!(serialize_u64, u64);
46+
lua_serialize_number!(serialize_i8, i8);
47+
lua_serialize_number!(serialize_u8, u8);
48+
lua_serialize_number!(serialize_i16, i16);
49+
lua_serialize_number!(serialize_u16, u16);
50+
lua_serialize_number!(serialize_i32, i32);
51+
lua_serialize_number!(serialize_u32, u32);
52+
lua_serialize_number!(serialize_i64, i64);
53+
lua_serialize_number!(serialize_u64, u64);
5354

54-
#[inline]
55-
fn serialize_i64(self, value: i64) -> Result<Value<'lua>> {
56-
Ok(Value::Integer(value))
57-
}
58-
59-
#[inline]
60-
fn serialize_f32(self, value: f32) -> Result<Value<'lua>> {
61-
Ok(Value::Number(value as Number))
62-
}
63-
64-
#[inline]
65-
fn serialize_f64(self, value: f64) -> Result<Value<'lua>> {
66-
Ok(Value::Number(value))
67-
}
55+
lua_serialize_number!(serialize_f32, f32);
56+
lua_serialize_number!(serialize_f64, f64);
6857

6958
#[inline]
7059
fn serialize_char(self, value: char) -> Result<Value<'lua>> {

src/value.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ impl<'lua> Serialize for Value<'lua> {
125125
match self {
126126
Value::Nil => serializer.serialize_unit(),
127127
Value::Boolean(b) => serializer.serialize_bool(*b),
128-
Value::Integer(i) => serializer.serialize_i64(*i),
129-
Value::Number(n) => serializer.serialize_f64(*n),
128+
Value::Integer(i) => serializer.serialize_i64((*i).into()),
129+
Value::Number(n) => serializer.serialize_f64((*n).into()),
130130
Value::String(s) => s.serialize(serializer),
131131
Value::Table(t) => t.serialize(serializer),
132132
Value::UserData(ud) => ud.serialize(serializer),

0 commit comments

Comments
 (0)