@@ -2,7 +2,7 @@ use libffi::middle::Type;
2
2
use lune_utils:: fmt:: { pretty_format_value, ValueFormatConfig } ;
3
3
use mlua:: prelude:: * ;
4
4
5
- use super :: { ctype_helper, CArrInfo , CFnInfo , CPtrInfo , CStructInfo } ;
5
+ use super :: { ctype_helper, void_info :: CVoidInfo , CArrInfo , CFnInfo , CPtrInfo , CStructInfo } ;
6
6
use crate :: {
7
7
data:: { BoxData , GetFfiData } ,
8
8
ffi:: { FfiConvert , FfiSize } ,
@@ -84,17 +84,104 @@ pub mod method_provider {
84
84
) ;
85
85
}
86
86
87
+ pub fn provide_copy_data < ' lua , Target , M > ( methods : & mut M )
88
+ where
89
+ Target : FfiSize + FfiConvert ,
90
+ M : LuaUserDataMethods < ' lua , Target > ,
91
+ {
92
+ methods. add_method (
93
+ "copyData" ,
94
+ |lua,
95
+ this,
96
+ ( dst, src, dst_offset, src_offset) : (
97
+ LuaAnyUserData ,
98
+ LuaAnyUserData ,
99
+ Option < isize > ,
100
+ Option < isize > ,
101
+ ) | {
102
+ let dst_offset = dst_offset. unwrap_or ( 0 ) ;
103
+ let src_offset = src_offset. unwrap_or ( 0 ) ;
104
+
105
+ let dst = & dst. get_ffi_data ( ) ?;
106
+ // use or functions
107
+ if !dst. check_boundary ( dst_offset, this. get_size ( ) ) {
108
+ return Err ( LuaError :: external ( "Out of bounds" ) ) ;
109
+ }
110
+ if !dst. is_writable ( ) {
111
+ return Err ( LuaError :: external ( "Unwritable data handle" ) ) ;
112
+ }
113
+
114
+ let src = & src. get_ffi_data ( ) ?;
115
+ if !src. check_boundary ( dst_offset, this. get_size ( ) ) {
116
+ return Err ( LuaError :: external ( "Out of bounds" ) ) ;
117
+ }
118
+ if !src. is_readable ( ) {
119
+ return Err ( LuaError :: external ( "Unreadable value data handle" ) ) ;
120
+ }
121
+
122
+ unsafe { this. copy_data ( lua, dst_offset, src_offset, dst, src) }
123
+ } ,
124
+ ) ;
125
+ }
126
+
127
+ pub fn provide_stringify_data < ' lua , Target , M > ( methods : & mut M )
128
+ where
129
+ Target : FfiSize + FfiConvert ,
130
+ M : LuaUserDataMethods < ' lua , Target > ,
131
+ {
132
+ methods. add_method (
133
+ "stringifyData" ,
134
+ |lua, this, ( target, offset) : ( LuaAnyUserData , Option < isize > ) | unsafe {
135
+ this. stringify_data ( lua, offset. unwrap_or ( 0 ) , & target. get_ffi_data ( ) ?)
136
+ } ,
137
+ ) ;
138
+ }
139
+
87
140
pub fn provide_box < ' lua , Target , M > ( methods : & mut M )
88
141
where
89
142
Target : FfiSize + FfiConvert ,
90
143
M : LuaUserDataMethods < ' lua , Target > ,
91
144
{
92
- methods. add_method ( "box" , |lua, this, table : LuaValue | {
145
+ methods. add_method ( "box" , |lua, this, value : LuaValue | {
93
146
let result = lua. create_userdata ( BoxData :: new ( this. get_size ( ) ) ) ?;
94
- unsafe { this. value_into_data ( lua, 0 , & result. get_ffi_data ( ) ?, table ) ? } ;
147
+ unsafe { this. value_into_data ( lua, 0 , & result. get_ffi_data ( ) ?, value ) ? } ;
95
148
Ok ( result)
96
149
} ) ;
97
150
}
151
+
152
+ // FIXME: Buffer support should be part of another PR
153
+ // pub fn provide_write_buffer<'lua, Target, M>(methods: &mut M)
154
+ // where
155
+ // Target: FfiSize + FfiConvert,
156
+ // M: LuaUserDataMethods<'lua, Target>,
157
+ // {
158
+ // methods.add_method(
159
+ // "writeBuffer",
160
+ // |lua, this, (target, value, offset): (LuaValue, LuaValue, Option<isize>)| {
161
+ // if !target.is_buffer() {
162
+ // return Err(LuaError::external(format!(
163
+ // "Argument target must be a buffer, got {}",
164
+ // target.type_name()
165
+ // )));
166
+ // }
167
+
168
+ // target.to_pointer()
169
+ // target.as_userdata().unwrap().to_pointer()
170
+ // let offset = offset.unwrap_or(0);
171
+
172
+ // let data_handle = &target.get_ffi_data()?;
173
+ // // use or functions
174
+ // if !data_handle.check_boundary(offset, this.get_size()) {
175
+ // return Err(LuaError::external("Out of bounds"));
176
+ // }
177
+ // if !data_handle.is_writable() {
178
+ // return Err(LuaError::external("Unwritable data handle"));
179
+ // }
180
+
181
+ // unsafe { this.value_into_data(lua, offset, data_handle, value) }
182
+ // },
183
+ // );
184
+ // }
98
185
}
99
186
100
187
pub fn get_userdata ( value : LuaValue ) -> LuaResult < LuaAnyUserData > {
@@ -143,28 +230,32 @@ pub unsafe fn get_conv_list(table: &LuaTable) -> LuaResult<Vec<*const dyn FfiCon
143
230
create_list ( table, |userdata| get_conv ( userdata) )
144
231
}
145
232
146
- pub fn get_size ( this : & LuaAnyUserData ) -> LuaResult < usize > {
147
- if this. is :: < CStructInfo > ( ) {
148
- Ok ( this. borrow :: < CStructInfo > ( ) ?. get_size ( ) )
149
- } else if this. is :: < CArrInfo > ( ) {
150
- Ok ( this. borrow :: < CArrInfo > ( ) ?. get_size ( ) )
151
- } else if this. is :: < CPtrInfo > ( ) {
152
- Ok ( this. borrow :: < CPtrInfo > ( ) ?. get_size ( ) )
233
+ pub fn get_size ( userdata : & LuaAnyUserData ) -> LuaResult < usize > {
234
+ if userdata. is :: < CStructInfo > ( ) {
235
+ Ok ( userdata. borrow :: < CStructInfo > ( ) ?. get_size ( ) )
236
+ } else if userdata. is :: < CArrInfo > ( ) {
237
+ Ok ( userdata. borrow :: < CArrInfo > ( ) ?. get_size ( ) )
238
+ } else if userdata. is :: < CPtrInfo > ( ) {
239
+ Ok ( userdata. borrow :: < CPtrInfo > ( ) ?. get_size ( ) )
240
+ } else if userdata. is :: < CVoidInfo > ( ) {
241
+ Ok ( userdata. borrow :: < CVoidInfo > ( ) ?. get_size ( ) )
153
242
} else {
154
- ctype_helper:: get_size ( this )
243
+ ctype_helper:: get_size ( userdata )
155
244
}
156
245
}
157
246
158
247
// get libffi_type from any c-type userdata
159
248
pub fn get_middle_type ( userdata : & LuaAnyUserData ) -> LuaResult < Type > {
160
249
if userdata. is :: < CStructInfo > ( ) {
161
- Ok ( userdata. borrow :: < CStructInfo > ( ) ?. get_type ( ) )
250
+ Ok ( userdata. borrow :: < CStructInfo > ( ) ?. get_middle_type ( ) )
162
251
} else if let Some ( middle_type) = ctype_helper:: get_middle_type ( userdata) ? {
163
252
Ok ( middle_type)
164
253
} else if userdata. is :: < CArrInfo > ( ) {
165
- Ok ( userdata. borrow :: < CArrInfo > ( ) ?. get_type ( ) )
254
+ Ok ( userdata. borrow :: < CArrInfo > ( ) ?. get_middle_type ( ) )
166
255
} else if userdata. is :: < CPtrInfo > ( ) {
167
- Ok ( CPtrInfo :: get_type ( ) )
256
+ Ok ( CPtrInfo :: get_middle_type ( ) )
257
+ } else if userdata. is :: < CVoidInfo > ( ) {
258
+ Ok ( CVoidInfo :: get_middle_type ( ) )
168
259
} else {
169
260
Err ( LuaError :: external ( format ! (
170
261
"Unexpected field. CStruct, CType, CString or CArr is required for element but got {}" ,
@@ -210,6 +301,8 @@ pub fn get_tag_name(userdata: &LuaAnyUserData) -> LuaResult<String> {
210
301
String :: from ( "CPtr" )
211
302
} else if userdata. is :: < CFnInfo > ( ) {
212
303
String :: from ( "CFn" )
304
+ } else if userdata. is :: < CVoidInfo > ( ) {
305
+ String :: from ( "CVoid" )
213
306
} else if ctype_helper:: is_ctype ( userdata) {
214
307
String :: from ( "CType" )
215
308
} else {
0 commit comments