1
1
#[ cfg( feature = "serde" ) ]
2
2
use serde:: ser:: { Serialize , Serializer } ;
3
3
4
+ use crate :: state:: RawLua ;
4
5
use crate :: types:: ValueRef ;
5
6
6
7
/// A Luau buffer type.
@@ -16,12 +17,14 @@ pub struct Buffer(pub(crate) ValueRef);
16
17
impl Buffer {
17
18
/// Copies the buffer data into a new `Vec<u8>`.
18
19
pub fn to_vec ( & self ) -> Vec < u8 > {
19
- unsafe { self . as_slice ( ) . to_vec ( ) }
20
+ let lua = self . 0 . lua . lock ( ) ;
21
+ self . as_slice ( & lua) . to_vec ( )
20
22
}
21
23
22
24
/// Returns the length of the buffer.
23
25
pub fn len ( & self ) -> usize {
24
- unsafe { self . as_slice ( ) . len ( ) }
26
+ let lua = self . 0 . lua . lock ( ) ;
27
+ self . as_slice ( & lua) . len ( )
25
28
}
26
29
27
30
/// Returns `true` if the buffer is empty.
@@ -34,7 +37,8 @@ impl Buffer {
34
37
/// Offset is 0-based.
35
38
#[ track_caller]
36
39
pub fn read_bytes < const N : usize > ( & self , offset : usize ) -> [ u8 ; N ] {
37
- let data = unsafe { self . as_slice ( ) } ;
40
+ let lua = self . 0 . lua . lock ( ) ;
41
+ let data = self . as_slice ( & lua) ;
38
42
let mut bytes = [ 0u8 ; N ] ;
39
43
bytes. copy_from_slice ( & data[ offset..offset + N ] ) ;
40
44
bytes
@@ -45,37 +49,40 @@ impl Buffer {
45
49
/// Offset is 0-based.
46
50
#[ track_caller]
47
51
pub fn write_bytes ( & self , offset : usize , bytes : & [ u8 ] ) {
52
+ let lua = self . 0 . lua . lock ( ) ;
48
53
let data = unsafe {
49
- let ( buf, size) = self . as_raw_parts ( ) ;
54
+ let ( buf, size) = self . as_raw_parts ( & lua ) ;
50
55
std:: slice:: from_raw_parts_mut ( buf, size)
51
56
} ;
52
57
data[ offset..offset + bytes. len ( ) ] . copy_from_slice ( bytes) ;
53
58
}
54
59
55
- pub ( crate ) unsafe fn as_slice ( & self ) -> & [ u8 ] {
56
- let ( buf, size) = self . as_raw_parts ( ) ;
57
- std:: slice:: from_raw_parts ( buf, size)
60
+ pub ( crate ) fn as_slice ( & self , lua : & RawLua ) -> & [ u8 ] {
61
+ unsafe {
62
+ let ( buf, size) = self . as_raw_parts ( lua) ;
63
+ std:: slice:: from_raw_parts ( buf, size)
64
+ }
58
65
}
59
66
60
67
#[ cfg( feature = "luau" ) ]
61
- unsafe fn as_raw_parts ( & self ) -> ( * mut u8 , usize ) {
62
- let lua = self . 0 . lua . lock ( ) ;
68
+ unsafe fn as_raw_parts ( & self , lua : & RawLua ) -> ( * mut u8 , usize ) {
63
69
let mut size = 0usize ;
64
70
let buf = ffi:: lua_tobuffer ( lua. ref_thread ( ) , self . 0 . index , & mut size) ;
65
71
mlua_assert ! ( !buf. is_null( ) , "invalid Luau buffer" ) ;
66
72
( buf as * mut u8 , size)
67
73
}
68
74
69
75
#[ cfg( not( feature = "luau" ) ) ]
70
- unsafe fn as_raw_parts ( & self ) -> ( * mut u8 , usize ) {
76
+ unsafe fn as_raw_parts ( & self , lua : & RawLua ) -> ( * mut u8 , usize ) {
71
77
unreachable ! ( )
72
78
}
73
79
}
74
80
75
81
#[ cfg( feature = "serde" ) ]
76
82
impl Serialize for Buffer {
77
83
fn serialize < S : Serializer > ( & self , serializer : S ) -> std:: result:: Result < S :: Ok , S :: Error > {
78
- serializer. serialize_bytes ( unsafe { self . as_slice ( ) } )
84
+ let lua = self . 0 . lua . lock ( ) ;
85
+ serializer. serialize_bytes ( self . as_slice ( & lua) )
79
86
}
80
87
}
81
88
0 commit comments