script: Mark as unsafe multiple array_buffer_view_to_xxx functions that take a raw JSObject pointer.

This commit is contained in:
Emilio Cobos Álvarez 2016-09-17 13:59:42 -07:00
parent ea8f115b8c
commit 602246a14c
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
2 changed files with 44 additions and 28 deletions

View file

@ -532,9 +532,11 @@ unsafe impl ArrayBufferViewContents for f64 {
} }
} }
/// Returns a mutable slice of the Array Buffer View data, viewed as T, without checking the real /// Returns a mutable slice of the Array Buffer View data, viewed as T, without
/// type of it. /// checking the real type of it.
pub unsafe fn array_buffer_view_data<'a, T: ArrayBufferViewContents>(abv: *mut JSObject) -> Option<&'a mut [T]> { pub unsafe fn array_buffer_view_data<'a, T>(abv: *mut JSObject) -> Option<&'a mut [T]>
where T: ArrayBufferViewContents
{
assert!(!abv.is_null()); assert!(!abv.is_null());
let mut byte_length = 0; let mut byte_length = 0;
@ -548,17 +550,19 @@ pub unsafe fn array_buffer_view_data<'a, T: ArrayBufferViewContents>(abv: *mut J
Some(slice::from_raw_parts_mut(ptr as *mut T, byte_length as usize / mem::size_of::<T>())) Some(slice::from_raw_parts_mut(ptr as *mut T, byte_length as usize / mem::size_of::<T>()))
} }
/// Returns a copy of the ArrayBufferView data, viewed as T, without checking the real type of it. /// Returns a copy of the ArrayBufferView data, viewed as T, without checking
pub fn array_buffer_view_to_vec<T: ArrayBufferViewContents>(abv: *mut JSObject) -> Option<Vec<T>> { /// the real type of it.
unsafe { pub unsafe fn array_buffer_view_to_vec<T>(abv: *mut JSObject) -> Option<Vec<T>>
array_buffer_view_data(abv).map(|data| data.to_vec()) where T: ArrayBufferViewContents
} {
array_buffer_view_data(abv).map(|data| data.to_vec())
} }
/// Returns a mutable slice of the Array Buffer View data, viewed as T, checking that the real type /// Returns a mutable slice of the Array Buffer View data, viewed as T, checking
/// of it is ty. /// that the real type of it is ty.
pub unsafe fn array_buffer_view_data_checked<'a, T: ArrayBufferViewContents>(abv: *mut JSObject) pub unsafe fn array_buffer_view_data_checked<'a, T>(abv: *mut JSObject) -> Option<&'a mut [T]>
-> Option<&'a mut [T]> { where T: ArrayBufferViewContents
{
array_buffer_view_data::<T>(abv).and_then(|data| { array_buffer_view_data::<T>(abv).and_then(|data| {
if T::is_type_compatible(JS_GetArrayBufferViewType(abv)) { if T::is_type_compatible(JS_GetArrayBufferViewType(abv)) {
Some(data) Some(data)
@ -568,12 +572,12 @@ pub unsafe fn array_buffer_view_data_checked<'a, T: ArrayBufferViewContents>(abv
}) })
} }
/// Returns a copy of the ArrayBufferView data, viewed as T, checking that the real type /// Returns a copy of the ArrayBufferView data, viewed as T, checking that the
/// of it is ty. /// real type of it is ty.
pub fn array_buffer_view_to_vec_checked<T: ArrayBufferViewContents>(abv: *mut JSObject) -> Option<Vec<T>> { pub unsafe fn array_buffer_view_to_vec_checked<T>(abv: *mut JSObject) -> Option<Vec<T>>
unsafe { where T: ArrayBufferViewContents
array_buffer_view_data_checked(abv).map(|data| data.to_vec()) {
} array_buffer_view_data_checked(abv).map(|data| data.to_vec())
} }
/// Returns whether `value` is an array-like object. /// Returns whether `value` is an array-like object.

View file

@ -863,7 +863,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
_ => return self.webgl_error(InvalidEnum), _ => return self.webgl_error(InvalidEnum),
} }
if let Some(data_vec) = array_buffer_view_to_vec::<u8>(data) { if let Some(data_vec) = unsafe { array_buffer_view_to_vec::<u8>(data) } {
handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, &data_vec, usage)); handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, &data_vec, usage));
} else { } else {
// NB: array_buffer_view_to_vec should never fail when we have // NB: array_buffer_view_to_vec should never fail when we have
@ -894,7 +894,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidValue); return self.webgl_error(InvalidValue);
} }
if let Some(data_vec) = array_buffer_view_to_vec::<u8>(data) { if let Some(data_vec) = unsafe { array_buffer_view_to_vec::<u8>(data) } {
if (offset as usize) + data_vec.len() > bound_buffer.capacity() { if (offset as usize) + data_vec.len() > bound_buffer.capacity() {
return self.webgl_error(InvalidValue); return self.webgl_error(InvalidValue);
} }
@ -2061,8 +2061,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
} }
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
#[allow(unsafe_code)]
fn VertexAttrib1fv(&self, _cx: *mut JSContext, indx: u32, data: *mut JSObject) { fn VertexAttrib1fv(&self, _cx: *mut JSContext, indx: u32, data: *mut JSObject) {
if let Some(data_vec) = array_buffer_view_to_vec_checked::<f32>(data) { assert!(!data.is_null());
if let Some(data_vec) = unsafe { array_buffer_view_to_vec_checked::<f32>(data) } {
if data_vec.len() < 1 { if data_vec.len() < 1 {
return self.webgl_error(InvalidOperation); return self.webgl_error(InvalidOperation);
} }
@ -2078,8 +2080,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
} }
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
#[allow(unsafe_code)]
fn VertexAttrib2fv(&self, _cx: *mut JSContext, indx: u32, data: *mut JSObject) { fn VertexAttrib2fv(&self, _cx: *mut JSContext, indx: u32, data: *mut JSObject) {
if let Some(data_vec) = array_buffer_view_to_vec_checked::<f32>(data) { assert!(!data.is_null());
if let Some(data_vec) = unsafe { array_buffer_view_to_vec_checked::<f32>(data) } {
if data_vec.len() < 2 { if data_vec.len() < 2 {
return self.webgl_error(InvalidOperation); return self.webgl_error(InvalidOperation);
} }
@ -2095,8 +2099,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
} }
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
#[allow(unsafe_code)]
fn VertexAttrib3fv(&self, _cx: *mut JSContext, indx: u32, data: *mut JSObject) { fn VertexAttrib3fv(&self, _cx: *mut JSContext, indx: u32, data: *mut JSObject) {
if let Some(data_vec) = array_buffer_view_to_vec_checked::<f32>(data) { assert!(!data.is_null());
if let Some(data_vec) = unsafe { array_buffer_view_to_vec_checked::<f32>(data) } {
if data_vec.len() < 3 { if data_vec.len() < 3 {
return self.webgl_error(InvalidOperation); return self.webgl_error(InvalidOperation);
} }
@ -2112,8 +2118,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
} }
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
#[allow(unsafe_code)]
fn VertexAttrib4fv(&self, _cx: *mut JSContext, indx: u32, data: *mut JSObject) { fn VertexAttrib4fv(&self, _cx: *mut JSContext, indx: u32, data: *mut JSObject) {
if let Some(data_vec) = array_buffer_view_to_vec_checked::<f32>(data) { assert!(!data.is_null());
if let Some(data_vec) = unsafe { array_buffer_view_to_vec_checked::<f32>(data) } {
if data_vec.len() < 4 { if data_vec.len() < 4 {
return self.webgl_error(InvalidOperation); return self.webgl_error(InvalidOperation);
} }
@ -2219,8 +2227,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
let buff = if data.is_null() { let buff = if data.is_null() {
vec![0u8; expected_byte_length as usize] vec![0u8; expected_byte_length as usize]
} else { } else {
array_buffer_view_to_vec::<u8>(data) unsafe {
.expect("Can't reach here without being an ArrayBufferView!") array_buffer_view_to_vec::<u8>(data)
.expect("Can't reach here without being an ArrayBufferView!")
}
}; };
if buff.len() != expected_byte_length as usize { if buff.len() != expected_byte_length as usize {
@ -2312,8 +2322,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
let buff = if data.is_null() { let buff = if data.is_null() {
vec![0u8; expected_byte_length as usize] vec![0u8; expected_byte_length as usize]
} else { } else {
array_buffer_view_to_vec::<u8>(data) unsafe {
.expect("Can't reach here without being an ArrayBufferView!") array_buffer_view_to_vec::<u8>(data)
.expect("Can't reach here without being an ArrayBufferView!")
}
}; };
if expected_byte_length != 0 && if expected_byte_length != 0 &&