Skip to content

Commit ba074d9

Browse files
committed
Reducing and organizing duplicated codes (#243)
1 parent 95258e1 commit ba074d9

File tree

27 files changed

+108
-74
lines changed

27 files changed

+108
-74
lines changed

crates/lune-std-ffi/src/c/c_arr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ impl LuaUserData for CArr {
145145
fields.add_field_function_get("inner", |lua, this: LuaAnyUserData| {
146146
let inner: LuaValue = get_association(lua, CARR_INNER, this)?
147147
// It shouldn't happen.
148-
.ok_or(LuaError::external("inner field not found"))?;
148+
.ok_or_else(|| LuaError::external("inner field not found"))?;
149149
Ok(inner)
150150
});
151151
}

crates/lune-std-ffi/src/c/c_func.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ impl LuaUserData for CFunc {
158158
this.cif.as_raw_ptr(),
159159
ptr::from_ref(&this.arg_info_list),
160160
ptr::from_ref(&this.result_info),
161-
ffi_ref.get_pointer(0),
161+
ffi_ref.get_pointer(),
162162
)
163163
})?;
164164

crates/lune-std-ffi/src/c/c_helper.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ pub mod method_provider {
4848
if !data_handle.check_boundary(offset, this.get_size()) {
4949
return Err(LuaError::external("Out of bounds"));
5050
}
51+
if !data_handle.is_readable() {
52+
return Err(LuaError::external("Unreadable data handle"));
53+
}
5154

5255
unsafe { this.luavalue_from(lua, offset, data_handle) }
5356
},
@@ -65,6 +68,7 @@ pub mod method_provider {
6568
let offset = offset.unwrap_or(0);
6669

6770
let data_handle = &userdata.get_data_handle()?;
71+
// use or functions
6872
if !data_handle.check_boundary(offset, this.get_size()) {
6973
return Err(LuaError::external("Out of bounds"));
7074
}

crates/lune-std-ffi/src/c/c_ptr.rs

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@ use libffi::middle::Type;
44
use mlua::prelude::*;
55

66
use super::{association_names::CPTR_INNER, c_helper, c_type_helper, method_provider};
7-
use crate::ffi::{
8-
ffi_association::{get_association, set_association},
9-
NativeConvert, NativeData, NativeSignedness, NativeSize,
7+
use crate::{
8+
ffi::{
9+
ffi_association::{get_association, set_association},
10+
FfiRef, NativeConvert, NativeData, NativeSignedness, NativeSize,
11+
},
12+
libffi_helper::SIEE_OF_POINTER,
1013
};
1114

12-
pub struct CPtr();
15+
pub struct CPtr {
16+
inner_size: usize,
17+
}
1318

1419
impl NativeSignedness for CPtr {
1520
fn get_signedness(&self) -> bool {
@@ -18,19 +23,36 @@ impl NativeSignedness for CPtr {
1823
}
1924
impl NativeSize for CPtr {
2025
fn get_size(&self) -> usize {
21-
size_of::<*mut ()>()
26+
SIEE_OF_POINTER
2227
}
2328
}
2429
impl NativeConvert for CPtr {
2530
// Convert luavalue into data, then write into ptr
2631
unsafe fn luavalue_into<'lua>(
2732
&self,
2833
_lua: &'lua Lua,
29-
_offset: isize,
30-
_data_handle: &Ref<dyn NativeData>,
31-
_value: LuaValue<'lua>,
34+
offset: isize,
35+
data_handle: &Ref<dyn NativeData>,
36+
value: LuaValue<'lua>,
3237
) -> LuaResult<()> {
33-
Err(LuaError::external("Conversion of pointer is not allowed"))
38+
if let LuaValue::UserData(value_userdata) = value {
39+
if value_userdata.is::<FfiRef>() {
40+
let value_ref = value_userdata.borrow::<FfiRef>()?;
41+
value_ref
42+
.check_boundary(0, self.inner_size)
43+
.then_some(())
44+
.ok_or_else(|| LuaError::external("boundary check failed"))?;
45+
*data_handle
46+
.get_pointer()
47+
.byte_offset(offset)
48+
.cast::<*mut ()>() = value_ref.get_pointer();
49+
Ok(())
50+
} else {
51+
Err(LuaError::external("Ptr:into only allows FfiRef"))
52+
}
53+
} else {
54+
Err(LuaError::external("Conversion of pointer is not allowed"))
55+
}
3456
}
3557

3658
// Read data from ptr, then convert into luavalue
@@ -51,7 +73,9 @@ impl CPtr {
5173
lua: &'lua Lua,
5274
inner: &LuaAnyUserData,
5375
) -> LuaResult<LuaAnyUserData<'lua>> {
54-
let value = lua.create_userdata(Self())?;
76+
let value = lua.create_userdata(Self {
77+
inner_size: c_helper::get_size(inner)?,
78+
})?;
5579

5680
set_association(lua, CPTR_INNER, &value, inner)?;
5781

@@ -83,7 +107,7 @@ impl LuaUserData for CPtr {
83107
fields.add_field_method_get("size", |_, _| Ok(size_of::<usize>()));
84108
fields.add_field_function_get("inner", |lua, this| {
85109
let inner = get_association(lua, CPTR_INNER, this)?
86-
.ok_or(LuaError::external("inner type not found"))?;
110+
.ok_or_else(|| LuaError::external("inner type not found"))?;
87111
Ok(inner)
88112
});
89113
}

crates/lune-std-ffi/src/c/c_struct.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::{cell::Ref, vec::Vec};
33
use libffi::{low, middle::Type, raw};
44
use mlua::prelude::*;
55

6-
use super::{association_names::CSTRUCT_INNER, c_helper, method_provider, CArr, CPtr};
6+
use super::{association_names::CSTRUCT_INNER, c_helper, method_provider};
77
use crate::ffi::{
88
ffi_association::{get_association, set_association},
99
NativeConvert, NativeData, NativeSignedness, NativeSize, FFI_STATUS_NAMES,
@@ -56,7 +56,7 @@ impl CStruct {
5656

5757
// Create new CStruct UserData with LuaTable.
5858
// Lock and hold table for .inner ref
59-
pub fn new_from_table<'lua>(
59+
pub fn from_table<'lua>(
6060
lua: &'lua Lua,
6161
table: LuaTable<'lua>,
6262
) -> LuaResult<LuaAnyUserData<'lua>> {
@@ -74,7 +74,7 @@ impl CStruct {
7474
// <CStruct( u8, i32, size = 8 )>
7575
pub fn stringify(lua: &Lua, userdata: &LuaAnyUserData) -> LuaResult<String> {
7676
if let LuaValue::Table(fields) = get_association(lua, CSTRUCT_INNER, userdata)?
77-
.ok_or(LuaError::external("Field table not found"))?
77+
.ok_or_else(|| LuaError::external("Field table not found"))?
7878
{
7979
let mut result = String::from(" ");
8080
for i in 0..fields.raw_len() {
@@ -97,7 +97,7 @@ impl CStruct {
9797
let offset = self
9898
.inner_offset_list
9999
.get(index)
100-
.ok_or(LuaError::external("Out of index"))?
100+
.ok_or_else(|| LuaError::external("Out of index"))?
101101
.to_owned();
102102
Ok(offset)
103103
}
@@ -185,7 +185,7 @@ impl LuaUserData for CStruct {
185185
// By referencing the table to struct, the types inside do not disappear
186186
methods.add_function("field", |lua, (this, field): (LuaAnyUserData, usize)| {
187187
if let LuaValue::Table(fields) = get_association(lua, CSTRUCT_INNER, this)?
188-
.ok_or(LuaError::external("Field table not found"))?
188+
.ok_or_else(|| LuaError::external("Field table not found"))?
189189
{
190190
let value: LuaValue = fields.raw_get(field + 1)?;
191191
Ok(value)

crates/lune-std-ffi/src/c/c_type.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use libffi::middle::Type;
66
use lune_utils::fmt::{pretty_format_value, ValueFormatConfig};
77
use mlua::prelude::*;
88

9-
use super::{CArr, CPtr};
109
use crate::{
1110
c::method_provider,
1211
ffi::{GetNativeData, NativeConvert, NativeData, NativeSignedness, NativeSize},

crates/lune-std-ffi/src/c/types/f32.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ impl NativeConvert for CType<f32> {
3636
}
3737
};
3838
unsafe {
39-
*(data_handle.get_pointer(offset).cast::<f32>()) = value;
39+
*(data_handle.get_pointer().byte_offset(offset).cast::<f32>()) = value;
4040
}
4141
Ok(())
4242
}
@@ -47,7 +47,9 @@ impl NativeConvert for CType<f32> {
4747
offset: isize,
4848
data_handle: &Ref<dyn NativeData>,
4949
) -> LuaResult<LuaValue<'lua>> {
50-
let value = unsafe { (*data_handle.get_pointer(offset).cast::<f32>()).into_lua(lua)? };
50+
let value = unsafe {
51+
(*data_handle.get_pointer().byte_offset(offset).cast::<f32>()).into_lua(lua)?
52+
};
5153
Ok(value)
5254
}
5355
}

crates/lune-std-ffi/src/c/types/f64.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ impl NativeConvert for CType<f64> {
3636
}
3737
};
3838
unsafe {
39-
*(data_handle.get_pointer(offset).cast::<f64>()) = value;
39+
*(data_handle.get_pointer().byte_offset(offset).cast::<f64>()) = value;
4040
}
4141
Ok(())
4242
}
@@ -47,7 +47,9 @@ impl NativeConvert for CType<f64> {
4747
offset: isize,
4848
data_handle: &Ref<dyn NativeData>,
4949
) -> LuaResult<LuaValue<'lua>> {
50-
let value = unsafe { (*data_handle.get_pointer(offset).cast::<f64>()).into_lua(lua)? };
50+
let value = unsafe {
51+
(*data_handle.get_pointer().byte_offset(offset).cast::<f64>()).into_lua(lua)?
52+
};
5153
Ok(value)
5254
}
5355
}

crates/lune-std-ffi/src/c/types/i128.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ impl NativeConvert for CType<i128> {
3636
}
3737
};
3838
unsafe {
39-
*(data_handle.get_pointer(offset).cast::<i128>()) = value;
39+
*(data_handle.get_pointer().byte_offset(offset).cast::<i128>()) = value;
4040
}
4141
Ok(())
4242
}
@@ -47,7 +47,7 @@ impl NativeConvert for CType<i128> {
4747
offset: isize,
4848
data_handle: &Ref<dyn NativeData>,
4949
) -> LuaResult<LuaValue<'lua>> {
50-
let value = unsafe { (*data_handle.get_pointer(offset).cast::<i128>()).into_lua(lua)? };
50+
let value = unsafe { (*data_handle.get_pointer().byte_offset(offset).cast::<i128>()).into_lua(lua)? };
5151
Ok(value)
5252
}
5353
}

crates/lune-std-ffi/src/c/types/i16.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ impl NativeConvert for CType<i16> {
3636
}
3737
};
3838
unsafe {
39-
*(data_handle.get_pointer(offset).cast::<i16>()) = value;
39+
*(data_handle.get_pointer().byte_offset(offset).cast::<i16>()) = value;
4040
}
4141
Ok(())
4242
}
@@ -47,7 +47,7 @@ impl NativeConvert for CType<i16> {
4747
offset: isize,
4848
data_handle: &Ref<dyn NativeData>,
4949
) -> LuaResult<LuaValue<'lua>> {
50-
let value = unsafe { (*data_handle.get_pointer(offset).cast::<i16>()).into_lua(lua)? };
50+
let value = unsafe { (*data_handle.get_pointer().byte_offset(offset).cast::<i16>()).into_lua(lua)? };
5151
Ok(value)
5252
}
5353
}

0 commit comments

Comments
 (0)