From 602246a14ccf3027232d642eaa30ed97dab48c2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 17 Sep 2016 13:59:42 -0700 Subject: [PATCH] script: Mark as unsafe multiple array_buffer_view_to_xxx functions that take a raw JSObject pointer. --- components/script/dom/bindings/conversions.rs | 40 ++++++++++--------- .../script/dom/webglrenderingcontext.rs | 32 ++++++++++----- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs index 0b050a4fc64..e87feadf9e0 100644 --- a/components/script/dom/bindings/conversions.rs +++ b/components/script/dom/bindings/conversions.rs @@ -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::())) } -/// Returns a copy of the ArrayBufferView data, viewed as T, without checking the real type of it. -pub fn array_buffer_view_to_vec(abv: *mut JSObject) -> Option> { - unsafe { - array_buffer_view_data(abv).map(|data| data.to_vec()) - } +/// 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(abv: *mut JSObject) -> Option> + 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::(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(abv: *mut JSObject) -> Option> { - unsafe { - array_buffer_view_data_checked(abv).map(|data| data.to_vec()) - } +/// 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(abv: *mut JSObject) -> Option> + where T: ArrayBufferViewContents +{ + array_buffer_view_data_checked(abv).map(|data| data.to_vec()) } /// Returns whether `value` is an array-like object. diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 0b285ba21be..644066b6710 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -863,7 +863,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { _ => return self.webgl_error(InvalidEnum), } - if let Some(data_vec) = array_buffer_view_to_vec::(data) { + if let Some(data_vec) = unsafe { array_buffer_view_to_vec::(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::(data) { + if let Some(data_vec) = unsafe { array_buffer_view_to_vec::(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::(data) { + assert!(!data.is_null()); + if let Some(data_vec) = unsafe { array_buffer_view_to_vec_checked::(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::(data) { + assert!(!data.is_null()); + if let Some(data_vec) = unsafe { array_buffer_view_to_vec_checked::(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::(data) { + assert!(!data.is_null()); + if let Some(data_vec) = unsafe { array_buffer_view_to_vec_checked::(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::(data) { + assert!(!data.is_null()); + if let Some(data_vec) = unsafe { array_buffer_view_to_vec_checked::(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 { - array_buffer_view_to_vec::(data) - .expect("Can't reach here without being an ArrayBufferView!") + unsafe { + array_buffer_view_to_vec::(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 { - array_buffer_view_to_vec::(data) - .expect("Can't reach here without being an ArrayBufferView!") + unsafe { + array_buffer_view_to_vec::(data) + .expect("Can't reach here without being an ArrayBufferView!") + } }; if expected_byte_length != 0 &&