Support unions of objects in overloads

Part of #20513, implementing the parts useful for WebGL.
This commit is contained in:
Anthony Ramine 2018-08-27 12:08:17 +02:00
parent 4cf944eab8
commit 900a19058e
8 changed files with 37 additions and 89 deletions

View file

@ -1326,19 +1326,6 @@ impl Drop for WebGLRenderingContext {
}
}
#[allow(unsafe_code)]
unsafe fn fallible_array_buffer_view_to_vec(
cx: *mut JSContext,
abv: *mut JSObject,
) -> Result<Vec<u8>, Error> {
assert!(!abv.is_null());
typedarray!(in(cx) let array_buffer_view: ArrayBufferView = abv);
match array_buffer_view {
Ok(v) => Ok(v.to_vec()),
Err(_) => Err(Error::Type("Not an ArrayBufferView".to_owned())),
}
}
impl WebGLRenderingContextMethods for WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1
fn Canvas(&self) -> DomRoot<HTMLCanvasElement> {
@ -1894,52 +1881,44 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
handle_potential_webgl_error!(self, texture.generate_mipmap());
}
#[allow(unsafe_code)]
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
unsafe fn BufferData(
fn BufferData(
&self,
cx: *mut JSContext,
target: u32,
data: *mut JSObject,
data: Option<ArrayBufferViewOrArrayBuffer>,
usage: u32,
) -> ErrorResult {
if data.is_null() {
return Ok(self.webgl_error(InvalidValue));
}
typedarray!(in(cx) let array_buffer: ArrayBuffer = data);
let data_vec = match array_buffer {
Ok(data) => data.to_vec(),
Err(_) => fallible_array_buffer_view_to_vec(cx, data)?,
) {
let data = match data {
Some(ArrayBufferViewOrArrayBuffer::ArrayBuffer(data)) => data.to_vec(),
Some(ArrayBufferViewOrArrayBuffer::ArrayBufferView(data)) => data.to_vec(),
None => return self.webgl_error(InvalidValue),
};
let bound_buffer = handle_potential_webgl_error!(self, self.bound_buffer(target), return Ok(()));
let bound_buffer = handle_potential_webgl_error!(self, self.bound_buffer(target), return);
let bound_buffer = match bound_buffer {
Some(bound_buffer) => bound_buffer,
None => return Ok(self.webgl_error(InvalidOperation)),
None => return self.webgl_error(InvalidOperation),
};
handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, data_vec, usage));
Ok(())
handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, data, usage));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
fn BufferData_(&self, target: u32, size: i64, usage: u32) -> ErrorResult {
let bound_buffer = handle_potential_webgl_error!(self, self.bound_buffer(target), return Ok(()));
fn BufferData_(&self, target: u32, size: i64, usage: u32) {
let bound_buffer = handle_potential_webgl_error!(self, self.bound_buffer(target), return);
let bound_buffer = match bound_buffer {
Some(bound_buffer) => bound_buffer,
None => return Ok(self.webgl_error(InvalidOperation)),
None => return self.webgl_error(InvalidOperation),
};
if size < 0 {
return Ok(self.webgl_error(InvalidValue));
return self.webgl_error(InvalidValue);
}
// FIXME: Allocating a buffer based on user-requested size is
// not great, but we don't have a fallible allocation to try.
let data = vec![0u8; size as usize];
handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, data, usage));
Ok(())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5