mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Support unions of objects in overloads
Part of #20513, implementing the parts useful for WebGL.
This commit is contained in:
parent
4cf944eab8
commit
900a19058e
8 changed files with 37 additions and 89 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue