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
/// type of it.
pub unsafe fn array_buffer_view_data<'a, T: ArrayBufferViewContents>(abv: *mut JSObject) -> Option<&'a mut [T]> {
/// Returns a mutable slice of the Array Buffer View data, viewed as T, without
/// checking the real type of it.
pub unsafe fn array_buffer_view_data<'a, T>(abv: *mut JSObject) -> Option<&'a mut [T]>
where T: ArrayBufferViewContents
{
assert!(!abv.is_null());
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>()))
}
/// Returns a copy of the ArrayBufferView data, viewed as T, without checking the real type of it.
pub fn array_buffer_view_to_vec<T: ArrayBufferViewContents>(abv: *mut JSObject) -> Option<Vec<T>> {
unsafe {
/// Returns a copy of the ArrayBufferView data, viewed as T, without checking
/// the real type of it.
pub unsafe fn array_buffer_view_to_vec<T>(abv: *mut JSObject) -> Option<Vec<T>>
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
/// of it is ty.
pub unsafe fn array_buffer_view_data_checked<'a, T: ArrayBufferViewContents>(abv: *mut JSObject)
-> Option<&'a mut [T]> {
/// Returns a mutable slice of the Array Buffer View data, viewed as T, checking
/// that the real type of it is ty.
pub unsafe fn array_buffer_view_data_checked<'a, T>(abv: *mut JSObject) -> Option<&'a mut [T]>
where T: ArrayBufferViewContents
{
array_buffer_view_data::<T>(abv).and_then(|data| {
if T::is_type_compatible(JS_GetArrayBufferViewType(abv)) {
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
/// of it is ty.
pub fn array_buffer_view_to_vec_checked<T: ArrayBufferViewContents>(abv: *mut JSObject) -> Option<Vec<T>> {
unsafe {
/// Returns a copy of the ArrayBufferView data, viewed as T, checking that the
/// real type of it is ty.
pub unsafe fn array_buffer_view_to_vec_checked<T>(abv: *mut JSObject) -> Option<Vec<T>>
where T: ArrayBufferViewContents
{
array_buffer_view_data_checked(abv).map(|data| data.to_vec())
}
}
/// Returns whether `value` is an array-like object.

View file

@ -863,7 +863,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
_ => 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));
} else {
// 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);
}
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() {
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
#[allow(unsafe_code)]
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 {
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
#[allow(unsafe_code)]
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 {
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
#[allow(unsafe_code)]
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 {
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
#[allow(unsafe_code)]
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 {
return self.webgl_error(InvalidOperation);
}
@ -2219,8 +2227,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
let buff = if data.is_null() {
vec![0u8; expected_byte_length as usize]
} else {
unsafe {
array_buffer_view_to_vec::<u8>(data)
.expect("Can't reach here without being an ArrayBufferView!")
}
};
if buff.len() != expected_byte_length as usize {
@ -2312,8 +2322,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
let buff = if data.is_null() {
vec![0u8; expected_byte_length as usize]
} else {
unsafe {
array_buffer_view_to_vec::<u8>(data)
.expect("Can't reach here without being an ArrayBufferView!")
}
};
if expected_byte_length != 0 &&