1use crate::ArrayBuffer;
2use crate::ArrayBufferView;
3use crate::BackingStore;
4use crate::HandleScope;
5use crate::Local;
6use crate::SharedRef;
7use crate::binding::memory_span_t;
8use crate::support::int;
9use std::convert::TryInto;
10use std::ffi::c_void;
11
12unsafe extern "C" {
13 fn v8__ArrayBufferView__Buffer(
14 this: *const ArrayBufferView,
15 ) -> *const ArrayBuffer;
16 fn v8__ArrayBufferView__Buffer__Data(
17 this: *const ArrayBufferView,
18 ) -> *mut c_void;
19 fn v8__ArrayBufferView__ByteLength(this: *const ArrayBufferView) -> usize;
20 fn v8__ArrayBufferView__ByteOffset(this: *const ArrayBufferView) -> usize;
21 fn v8__ArrayBufferView__CopyContents(
22 this: *const ArrayBufferView,
23 dest: *mut c_void,
24 byte_length: int,
25 ) -> usize;
26 fn v8__ArrayBufferView__GetContents(
27 this: *const ArrayBufferView,
28 storage: memory_span_t,
29 ) -> memory_span_t;
30}
31
32impl ArrayBufferView {
33 #[inline(always)]
35 pub fn buffer<'s>(
36 &self,
37 scope: &mut HandleScope<'s>,
38 ) -> Option<Local<'s, ArrayBuffer>> {
39 unsafe { scope.cast_local(|_| v8__ArrayBufferView__Buffer(self)) }
40 }
41
42 #[inline(always)]
47 pub fn get_backing_store(&self) -> Option<SharedRef<BackingStore>> {
48 let buffer = unsafe { v8__ArrayBufferView__Buffer(self) };
49 unsafe { buffer.as_ref().map(|buffer| buffer.get_backing_store()) }
50 }
51
52 #[inline(always)]
56 pub fn data(&self) -> *mut c_void {
57 unsafe {
58 v8__ArrayBufferView__Buffer__Data(self)
59 .add(v8__ArrayBufferView__ByteOffset(self))
60 }
61 }
62
63 #[inline(always)]
65 pub fn byte_length(&self) -> usize {
66 unsafe { v8__ArrayBufferView__ByteLength(self) }
67 }
68
69 #[inline(always)]
71 pub fn byte_offset(&self) -> usize {
72 unsafe { v8__ArrayBufferView__ByteOffset(self) }
73 }
74
75 #[inline(always)]
80 pub fn copy_contents(&self, dest: &mut [u8]) -> usize {
81 unsafe {
82 v8__ArrayBufferView__CopyContents(
83 self,
84 dest.as_mut_ptr() as *mut c_void,
85 dest.len().try_into().unwrap(),
86 )
87 }
88 }
89
90 #[inline(always)]
96 pub unsafe fn get_contents_raw_parts(
97 &self,
98 storage: &mut [u8],
99 ) -> (*mut u8, usize) {
100 unsafe {
101 let span = v8__ArrayBufferView__GetContents(
102 self,
103 memory_span_t {
104 data: storage.as_mut_ptr(),
105 size: storage.len(),
106 },
107 );
108 (span.data, span.size)
109 }
110 }
111
112 #[inline(always)]
118 pub fn get_contents<'s, 'a>(&'s self, storage: &'a mut [u8]) -> &'a [u8]
119 where
120 's: 'a,
121 {
122 unsafe {
123 let (data, size) = self.get_contents_raw_parts(storage);
124 if data.is_null() {
125 debug_assert_eq!(size, 0);
126 std::slice::from_raw_parts(std::ptr::dangling(), size)
127 } else {
128 std::slice::from_raw_parts(data, size)
129 }
130 }
131 }
132}