Skip to content

Commit b31f814

Browse files
committed
Move c ABI related object and functions into ffi.c (#243)
1 parent a67661a commit b31f814

File tree

37 files changed

+345
-232
lines changed

37 files changed

+345
-232
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,9 @@ impl FfiConvert for CArrInfo {
140140
dst: &Ref<dyn FfiData>,
141141
src: &Ref<dyn FfiData>,
142142
) -> LuaResult<()> {
143-
dst.get_pointer()
143+
dst.get_inner_pointer()
144144
.byte_offset(dst_offset)
145-
.copy_from(src.get_pointer().byte_offset(src_offset), self.get_size());
145+
.copy_from(src.get_inner_pointer().byte_offset(src_offset), self.get_size());
146146
Ok(())
147147
}
148148
}
@@ -161,7 +161,7 @@ impl LuaUserData for CArrInfo {
161161

162162
fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) {
163163
// Subtype
164-
method_provider::provide_ptr_info(methods);
164+
method_provider::provide_ptr(methods);
165165

166166
// ToString
167167
method_provider::provide_to_string(methods);

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ use super::{
1212
};
1313
use crate::{
1414
data::{CallableData, ClosureData, RefData, RefFlag},
15-
ffi::{association, bit_mask::*, FfiArg, FfiData, FfiResult, FfiSignedness, FfiSize},
15+
ffi::{
16+
association, bit_mask::*, libffi_helper::SIZE_OF_POINTER, FfiArg, FfiData, FfiResult,
17+
FfiSignedness, FfiSize,
18+
},
1619
};
1720

1821
// cfn is a type declaration for a function.
@@ -42,9 +45,10 @@ impl FfiSignedness for CFnInfo {
4245
false
4346
}
4447
}
48+
4549
impl FfiSize for CFnInfo {
4650
fn get_size(&self) -> usize {
47-
size_of::<*mut ()>()
51+
SIZE_OF_POINTER
4852
}
4953
}
5054

@@ -186,7 +190,7 @@ impl CFnInfo {
186190
self.cif.as_raw_ptr(),
187191
self.arg_info_list.clone(),
188192
self.result_info.clone(),
189-
ffi_ref.get_pointer(),
193+
ffi_ref.get_inner_pointer(),
190194
)
191195
})?;
192196

@@ -195,13 +199,17 @@ impl CFnInfo {
195199

196200
Ok(callable)
197201
}
202+
203+
pub fn get_middle_type() -> Type {
204+
Type::void()
205+
}
198206
}
199207

200208
impl LuaUserData for CFnInfo {
201209
fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) {
202210
// Subtype
203-
method_provider::provide_ptr_info(methods);
204-
method_provider::provide_arr_info(methods);
211+
method_provider::provide_ptr(methods);
212+
method_provider::provide_arr(methods);
205213

206214
// ToString
207215
method_provider::provide_to_string(methods);

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::{
1010

1111
pub mod method_provider {
1212
use super::*;
13+
1314
pub fn provide_to_string<'lua, Target, M>(methods: &mut M)
1415
where
1516
M: LuaUserDataMethods<'lua, Target>,
@@ -19,20 +20,20 @@ pub mod method_provider {
1920
});
2021
}
2122

22-
pub fn provide_ptr_info<'lua, Target, M>(methods: &mut M)
23+
pub fn provide_ptr<'lua, Target, M>(methods: &mut M)
2324
where
2425
M: LuaUserDataMethods<'lua, Target>,
2526
{
26-
methods.add_function("ptrInfo", |lua, this: LuaAnyUserData| {
27+
methods.add_function("ptr", |lua, this: LuaAnyUserData| {
2728
CPtrInfo::from_userdata(lua, &this)
2829
});
2930
}
3031

31-
pub fn provide_arr_info<'lua, Target, M>(methods: &mut M)
32+
pub fn provide_arr<'lua, Target, M>(methods: &mut M)
3233
where
3334
M: LuaUserDataMethods<'lua, Target>,
3435
{
35-
methods.add_function("ArrInfo", |lua, (this, length): (LuaAnyUserData, usize)| {
36+
methods.add_function("arr", |lua, (this, length): (LuaAnyUserData, usize)| {
3637
CArrInfo::from_userdata(lua, &this, length)
3738
});
3839
}
@@ -48,7 +49,7 @@ pub mod method_provider {
4849
let offset = offset.unwrap_or(0);
4950

5051
let data_handle = &target.get_ffi_data()?;
51-
if !data_handle.check_boundary(offset, this.get_size()) {
52+
if !data_handle.check_inner_boundary(offset, this.get_size()) {
5253
return Err(LuaError::external("Out of bounds"));
5354
}
5455
if !data_handle.is_readable() {
@@ -72,7 +73,7 @@ pub mod method_provider {
7273

7374
let data_handle = &target.get_ffi_data()?;
7475
// use or functions
75-
if !data_handle.check_boundary(offset, this.get_size()) {
76+
if !data_handle.check_inner_boundary(offset, this.get_size()) {
7677
return Err(LuaError::external("Out of bounds"));
7778
}
7879
if !data_handle.is_writable() {
@@ -104,15 +105,15 @@ pub mod method_provider {
104105

105106
let dst = &dst.get_ffi_data()?;
106107
// use or functions
107-
if !dst.check_boundary(dst_offset, this.get_size()) {
108+
if !dst.check_inner_boundary(dst_offset, this.get_size()) {
108109
return Err(LuaError::external("Out of bounds"));
109110
}
110111
if !dst.is_writable() {
111112
return Err(LuaError::external("Unwritable data handle"));
112113
}
113114

114115
let src = &src.get_ffi_data()?;
115-
if !src.check_boundary(dst_offset, this.get_size()) {
116+
if !src.check_inner_boundary(dst_offset, this.get_size()) {
116117
return Err(LuaError::external("Out of bounds"));
117118
}
118119
if !src.is_readable() {
@@ -189,7 +190,7 @@ pub fn get_userdata(value: LuaValue) -> LuaResult<LuaAnyUserData> {
189190
Ok(field_type)
190191
} else {
191192
Err(LuaError::external(format!(
192-
"Unexpected field. CStruct, CType or CArr is required for element but got {}",
193+
"CStruct, CType, CFn, CVoid or CArr is required but got {}",
193194
pretty_format_value(&value, &ValueFormatConfig::new())
194195
)))
195196
}
@@ -242,6 +243,8 @@ pub fn get_size(userdata: &LuaAnyUserData) -> LuaResult<usize> {
242243
Ok(userdata.borrow::<CPtrInfo>()?.get_size())
243244
} else if userdata.is::<CVoidInfo>() {
244245
Ok(userdata.borrow::<CVoidInfo>()?.get_size())
246+
} else if userdata.is::<CFnInfo>() {
247+
Ok(userdata.borrow::<CFnInfo>()?.get_size())
245248
} else {
246249
ctype_helper::get_size(userdata)
247250
}
@@ -259,9 +262,11 @@ pub fn get_middle_type(userdata: &LuaAnyUserData) -> LuaResult<Type> {
259262
Ok(CPtrInfo::get_middle_type())
260263
} else if userdata.is::<CVoidInfo>() {
261264
Ok(CVoidInfo::get_middle_type())
265+
} else if userdata.is::<CFnInfo>() {
266+
Ok(CFnInfo::get_middle_type())
262267
} else {
263268
Err(LuaError::external(format!(
264-
"Unexpected field. CStruct, CType, CString or CArr is required for element but got {}",
269+
"CStruct, CType, CFn, CVoid or CArr is required but got {}",
265270
pretty_format_value(
266271
// Since the data is in the Lua location,
267272
// there is no problem with the clone.

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
use lune_utils::TableBuilder;
2+
use mlua::prelude::*;
3+
14
mod arr_info;
25
mod fn_info;
36
pub mod helper;
@@ -30,3 +33,16 @@ mod association_names {
3033
pub const CLOSURE_FUNC: &str = "__closure_func";
3134
pub const CLOSURE_CFN: &str = "__closure_cfn";
3235
}
36+
37+
pub fn export(lua: &Lua) -> LuaResult<LuaTable> {
38+
TableBuilder::new(lua)?
39+
.with_value("void", CVoidInfo::new())?
40+
.with_values(export_ctypes(lua)?)?
41+
.with_function("struct", |lua, types: LuaTable| {
42+
CStructInfo::from_table(lua, types)
43+
})?
44+
.with_function("fn", |lua, (args, ret): (LuaTable, LuaAnyUserData)| {
45+
CFnInfo::from_table(lua, args, ret)
46+
})?
47+
.build_readonly()
48+
}

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ impl FfiConvert for CPtrInfo {
4646
.as_userdata()
4747
.ok_or_else(|| LuaError::external("CPtrInfo:writeRef only allows data"))?;
4848
*data_handle
49-
.get_pointer()
49+
.get_inner_pointer()
5050
.byte_offset(offset)
51-
.cast::<*mut ()>() = value_userdata.get_ffi_data()?.get_pointer();
51+
.cast::<*mut ()>() = value_userdata.get_ffi_data()?.get_inner_pointer();
5252
Ok(())
5353
}
5454

@@ -60,7 +60,7 @@ impl FfiConvert for CPtrInfo {
6060
data_handle: &Ref<dyn FfiData>,
6161
) -> LuaResult<LuaValue<'lua>> {
6262
Ok(LuaValue::UserData(lua.create_userdata(RefData::new(
63-
unsafe { data_handle.get_pointer().byte_offset(offset) },
63+
unsafe { data_handle.get_inner_pointer().byte_offset(offset) },
6464
if self.inner_is_cptr {
6565
READ_CPTR_REF_FLAGS
6666
} else {
@@ -78,8 +78,9 @@ impl FfiConvert for CPtrInfo {
7878
dst: &Ref<dyn FfiData>,
7979
src: &Ref<dyn FfiData>,
8080
) -> LuaResult<()> {
81-
*dst.get_pointer().byte_offset(dst_offset).cast::<*mut ()>() =
82-
src.get_pointer().byte_offset(src_offset);
81+
*dst.get_inner_pointer()
82+
.byte_offset(dst_offset)
83+
.cast::<*mut ()>() = src.get_inner_pointer().byte_offset(src_offset);
8384
Ok(())
8485
}
8586
}
@@ -133,8 +134,8 @@ impl LuaUserData for CPtrInfo {
133134

134135
fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) {
135136
// Subtype
136-
method_provider::provide_ptr_info(methods);
137-
method_provider::provide_arr_info(methods);
137+
method_provider::provide_ptr(methods);
138+
method_provider::provide_arr(methods);
138139

139140
// ToString
140141
method_provider::provide_to_string(methods);

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

Whitespace-only changes.

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,10 @@ impl FfiConvert for CStructInfo {
172172
dst: &Ref<dyn FfiData>,
173173
src: &Ref<dyn FfiData>,
174174
) -> LuaResult<()> {
175-
dst.get_pointer()
176-
.byte_offset(dst_offset)
177-
.copy_from(src.get_pointer().byte_offset(src_offset), self.get_size());
175+
dst.get_inner_pointer().byte_offset(dst_offset).copy_from(
176+
src.get_inner_pointer().byte_offset(src_offset),
177+
self.get_size(),
178+
);
178179
Ok(())
179180
}
180181
}
@@ -185,8 +186,8 @@ impl LuaUserData for CStructInfo {
185186
}
186187
fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) {
187188
// Subtype
188-
method_provider::provide_ptr_info(methods);
189-
method_provider::provide_arr_info(methods);
189+
method_provider::provide_ptr(methods);
190+
method_provider::provide_arr(methods);
190191

191192
// ToString
192193
method_provider::provide_to_string(methods);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ where
9898

9999
fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) {
100100
// Subtype
101-
method_provider::provide_ptr_info(methods);
102-
method_provider::provide_arr_info(methods);
101+
method_provider::provide_ptr(methods);
102+
method_provider::provide_arr(methods);
103103

104104
// ToString
105105
method_provider::provide_to_string(methods);

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ impl FfiConvert for CTypeInfo<f32> {
3737
}
3838
};
3939
unsafe {
40-
*(data_handle.get_pointer().byte_offset(offset).cast::<f32>()) = value;
40+
*(data_handle.get_inner_pointer().byte_offset(offset).cast::<f32>()) = value;
4141
}
4242
Ok(())
4343
}
@@ -49,7 +49,7 @@ impl FfiConvert for CTypeInfo<f32> {
4949
data_handle: &Ref<dyn FfiData>,
5050
) -> LuaResult<LuaValue<'lua>> {
5151
let value = unsafe {
52-
(*data_handle.get_pointer().byte_offset(offset).cast::<f32>()).into_lua(lua)?
52+
(*data_handle.get_inner_pointer().byte_offset(offset).cast::<f32>()).into_lua(lua)?
5353
};
5454
Ok(value)
5555
}
@@ -61,8 +61,8 @@ impl FfiConvert for CTypeInfo<f32> {
6161
dst: &Ref<dyn FfiData>,
6262
src: &Ref<dyn FfiData>,
6363
) -> LuaResult<()> {
64-
*dst.get_pointer().byte_offset(dst_offset).cast::<f32>() =
65-
*src.get_pointer().byte_offset(src_offset).cast::<f32>();
64+
*dst.get_inner_pointer().byte_offset(dst_offset).cast::<f32>() =
65+
*src.get_inner_pointer().byte_offset(src_offset).cast::<f32>();
6666
Ok(())
6767
}
6868
unsafe fn stringify_data(
@@ -71,6 +71,6 @@ impl FfiConvert for CTypeInfo<f32> {
7171
offset: isize,
7272
data_handle: &Ref<dyn FfiData>,
7373
) -> LuaResult<String> {
74-
Ok((*data_handle.get_pointer().byte_offset(offset).cast::<f32>()).to_string())
74+
Ok((*data_handle.get_inner_pointer().byte_offset(offset).cast::<f32>()).to_string())
7575
}
7676
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ impl FfiConvert for CTypeInfo<f64> {
3737
}
3838
};
3939
unsafe {
40-
*(data_handle.get_pointer().byte_offset(offset).cast::<f64>()) = value;
40+
*(data_handle.get_inner_pointer().byte_offset(offset).cast::<f64>()) = value;
4141
}
4242
Ok(())
4343
}
@@ -49,7 +49,7 @@ impl FfiConvert for CTypeInfo<f64> {
4949
data_handle: &Ref<dyn FfiData>,
5050
) -> LuaResult<LuaValue<'lua>> {
5151
let value = unsafe {
52-
(*data_handle.get_pointer().byte_offset(offset).cast::<f64>()).into_lua(lua)?
52+
(*data_handle.get_inner_pointer().byte_offset(offset).cast::<f64>()).into_lua(lua)?
5353
};
5454
Ok(value)
5555
}
@@ -61,8 +61,8 @@ impl FfiConvert for CTypeInfo<f64> {
6161
dst: &Ref<dyn FfiData>,
6262
src: &Ref<dyn FfiData>,
6363
) -> LuaResult<()> {
64-
*dst.get_pointer().byte_offset(dst_offset).cast::<f64>() =
65-
*src.get_pointer().byte_offset(src_offset).cast::<f64>();
64+
*dst.get_inner_pointer().byte_offset(dst_offset).cast::<f64>() =
65+
*src.get_inner_pointer().byte_offset(src_offset).cast::<f64>();
6666
Ok(())
6767
}
6868
unsafe fn stringify_data(
@@ -71,6 +71,6 @@ impl FfiConvert for CTypeInfo<f64> {
7171
offset: isize,
7272
data_handle: &Ref<dyn FfiData>,
7373
) -> LuaResult<String> {
74-
Ok((*data_handle.get_pointer().byte_offset(offset).cast::<f64>()).to_string())
74+
Ok((*data_handle.get_inner_pointer().byte_offset(offset).cast::<f64>()).to_string())
7575
}
7676
}

0 commit comments

Comments
 (0)