Skip to content

Commit 57bdd32

Browse files
author
bors-servo
authored
Auto merge of #15672 - servo:typed-arrays-heap, r=<try>
Use Heap for typed arrays. <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/15672) <!-- Reviewable:end -->
2 parents 808ffff + 65599bd commit 57bdd32

File tree

9 files changed

+55
-43
lines changed

9 files changed

+55
-43
lines changed

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/script/dom/bindings/trace.rs

+7
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ use js::glue::{CallObjectTracer, CallValueTracer};
5858
use js::jsapi::{GCTraceKindToAscii, Heap, JSObject, JSTracer, TraceKind};
5959
use js::jsval::JSVal;
6060
use js::rust::Runtime;
61+
use js::typedarray::{TypedArray, TypedArrayElement};
6162
use msg::constellation_msg::{FrameId, FrameType, PipelineId};
6263
use net_traits::{Metadata, NetworkError, ReferrerPolicy, ResourceThreads};
6364
use net_traits::filemanager_thread::RelativePos;
@@ -153,6 +154,12 @@ pub fn trace_object(tracer: *mut JSTracer, description: &str, obj: &Heap<*mut JS
153154
}
154155
}
155156

157+
unsafe impl<T: TypedArrayElement> JSTraceable for TypedArray<T> {
158+
unsafe fn trace(&self, trc: *mut JSTracer) {
159+
trace_object(trc, "typed array", self.object());
160+
}
161+
}
162+
156163
unsafe impl<T: JSTraceable> JSTraceable for Rc<T> {
157164
unsafe fn trace(&self, trc: *mut JSTracer) {
158165
(**self).trace(trc)

components/script/dom/crypto.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ use dom::bindings::codegen::Bindings::CryptoBinding::CryptoMethods;
99
use dom::bindings::error::{Error, Fallible};
1010
use dom::bindings::js::Root;
1111
use dom::bindings::reflector::{Reflector, reflect_dom_object};
12+
use dom::bindings::trace::RootedTraceableBox;
1213
use dom::globalscope::GlobalScope;
1314
use dom_struct::dom_struct;
14-
use js::jsapi::{JSContext, JSObject};
15-
use js::jsapi::Type;
15+
use js::jsapi::{JSContext, JSObject, Type};
16+
use js::typedarray::ArrayBufferView;
1617
use servo_rand::{ServoRng, Rng};
1718

1819
unsafe_no_jsmanaged_fields!(ServoRng);
@@ -42,11 +43,11 @@ impl CryptoMethods for Crypto {
4243
#[allow(unsafe_code)]
4344
// https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#Crypto-method-getRandomValues
4445
unsafe fn GetRandomValues(&self,
45-
_cx: *mut JSContext,
46+
cx: *mut JSContext,
4647
input: *mut JSObject)
4748
-> Fallible<NonZero<*mut JSObject>> {
4849
assert!(!input.is_null());
49-
typedarray!(in(_cx) let mut array_buffer_view: ArrayBufferView = input);
50+
let mut array_buffer_view = RootedTraceableBox::new(ArrayBufferView::from(cx, input));
5051
let (array_type, mut data) = match array_buffer_view.as_mut() {
5152
Ok(x) => (x.get_array_type(), x.as_mut_slice()),
5253
Err(_) => {

components/script/dom/imagedata.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use dom::bindings::codegen::Bindings::ImageDataBinding;
77
use dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods;
88
use dom::bindings::js::Root;
99
use dom::bindings::reflector::{Reflector, reflect_dom_object};
10+
use dom::bindings::trace::RootedTraceableBox;
1011
use dom::globalscope::GlobalScope;
1112
use dom_struct::dom_struct;
1213
use euclid::size::Size2D;
@@ -60,8 +61,8 @@ impl ImageData {
6061
assert!(!self.data.get().is_null());
6162
let cx = Runtime::get();
6263
assert!(!cx.is_null());
63-
typedarray!(in(cx) let array: Uint8ClampedArray = self.data.get());
64-
let vec = array.unwrap().as_slice().to_vec();
64+
let mut array = RootedTraceableBox::new(Uint8ClampedArray::from(cx, self.data.get()));
65+
let vec = array.as_mut().unwrap().as_slice().to_vec();
6566
vec
6667
}
6768
}

components/script/dom/textdecoder.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ use dom::bindings::error::{Error, Fallible};
88
use dom::bindings::js::Root;
99
use dom::bindings::reflector::{Reflector, reflect_dom_object};
1010
use dom::bindings::str::{DOMString, USVString};
11+
use dom::bindings::trace::RootedTraceableBox;
1112
use dom::globalscope::GlobalScope;
1213
use dom_struct::dom_struct;
1314
use encoding::label::encoding_from_whatwg_label;
1415
use encoding::types::{DecoderTrap, EncodingRef};
1516
use js::jsapi::{JSContext, JSObject};
17+
use js::typedarray::ArrayBufferView;
1618
use std::borrow::ToOwned;
1719

1820
#[dom_struct]
@@ -78,16 +80,16 @@ impl TextDecoderMethods for TextDecoder {
7880

7981
#[allow(unsafe_code)]
8082
// https://encoding.spec.whatwg.org/#dom-textdecoder-decode
81-
unsafe fn Decode(&self, _cx: *mut JSContext, input: Option<*mut JSObject>)
83+
unsafe fn Decode(&self, cx: *mut JSContext, input: Option<*mut JSObject>)
8284
-> Fallible<USVString> {
8385
let input = match input {
8486
Some(input) => input,
8587
None => return Ok(USVString("".to_owned())),
8688
};
8789

88-
typedarray!(in(_cx) let data_res: ArrayBufferView = input);
89-
let mut data = match data_res {
90-
Ok(data) => data,
90+
let mut data_res = RootedTraceableBox::new(ArrayBufferView::from(cx, input));
91+
let mut data = match *data_res {
92+
Ok(ref mut data) => data,
9193
Err(_) => {
9294
return Err(Error::Type("Argument to TextDecoder.decode is not an ArrayBufferView".to_owned()));
9395
}

components/script/dom/vrframedata.rs

+9-8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use dom::bindings::error::Fallible;
99
use dom::bindings::js::{JS, Root};
1010
use dom::bindings::num::Finite;
1111
use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
12+
use dom::bindings::trace::RootedTraceableBox;
1213
use dom::globalscope::GlobalScope;
1314
use dom::vrpose::VRPose;
1415
use dom::window::Window;
@@ -81,20 +82,20 @@ impl VRFrameData {
8182
pub fn update(&self, data: &WebVRFrameData) {
8283
unsafe {
8384
let cx = self.global().get_cx();
84-
typedarray!(in(cx) let left_proj_array: Float32Array = self.left_proj.get());
85-
if let Ok(mut array) = left_proj_array {
85+
let mut left_proj_array = RootedTraceableBox::new(Float32Array::from(cx, self.left_proj.get()));
86+
if let Ok(ref mut array) = *left_proj_array {
8687
array.update(&data.left_projection_matrix);
8788
}
88-
typedarray!(in(cx) let left_view_array: Float32Array = self.left_view.get());
89-
if let Ok(mut array) = left_view_array {
89+
let mut left_view_array = RootedTraceableBox::new(Float32Array::from(cx, self.left_view.get()));
90+
if let Ok(ref mut array) = *left_view_array {
9091
array.update(&data.left_view_matrix);
9192
}
92-
typedarray!(in(cx) let right_proj_array: Float32Array = self.right_proj.get());
93-
if let Ok(mut array) = right_proj_array {
93+
let mut right_proj_array = RootedTraceableBox::new(Float32Array::from(cx, self.right_proj.get()));
94+
if let Ok(ref mut array) = *right_proj_array {
9495
array.update(&data.right_projection_matrix);
9596
}
96-
typedarray!(in(cx) let right_view_array: Float32Array = self.right_view.get());
97-
if let Ok(mut array) = right_view_array {
97+
let mut right_view_array = RootedTraceableBox::new(Float32Array::from(cx, self.right_view.get()));
98+
if let Ok(ref mut array) = *right_view_array {
9899
array.update(&data.right_view_matrix);
99100
}
100101
}

components/script/dom/vrpose.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use dom::bindings::codegen::Bindings::VRPoseBinding;
77
use dom::bindings::codegen::Bindings::VRPoseBinding::VRPoseMethods;
88
use dom::bindings::js::Root;
99
use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
10+
use dom::bindings::trace::RootedTraceableBox;
1011
use dom::globalscope::GlobalScope;
1112
use dom_struct::dom_struct;
1213
use js::jsapi::{Heap, JSContext, JSObject};
@@ -34,8 +35,8 @@ unsafe fn update_or_create_typed_array(cx: *mut JSContext,
3435
if dst.get().is_null() {
3536
let _ = Float32Array::create(cx, CreateWith::Slice(data), dst.handle_mut());
3637
} else {
37-
typedarray!(in(cx) let array: Float32Array = dst.get());
38-
if let Ok(mut array) = array {
38+
let mut array = RootedTraceableBox::new(Float32Array::from(cx, dst.get()));
39+
if let Ok(ref mut array) = *array {
3940
array.update(data);
4041
}
4142
}

components/script/dom/vrstageparameters.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use dom::bindings::codegen::Bindings::VRStageParametersBinding::VRStageParameter
99
use dom::bindings::js::Root;
1010
use dom::bindings::num::Finite;
1111
use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
12+
use dom::bindings::trace::RootedTraceableBox;
1213
use dom::globalscope::GlobalScope;
1314
use dom_struct::dom_struct;
1415
use js::jsapi::{Heap, JSContext, JSObject};
@@ -54,8 +55,8 @@ impl VRStageParameters {
5455
pub fn update(&self, parameters: &WebVRStageParameters) {
5556
unsafe {
5657
let cx = self.global().get_cx();
57-
typedarray!(in(cx) let array: Float32Array = self.transform.get());
58-
if let Ok(mut array) = array {
58+
let mut array = RootedTraceableBox::new(Float32Array::from(cx, self.transform.get()));
59+
if let Ok(ref mut array) = *array {
5960
array.update(&parameters.sitting_to_standing_transform);
6061
}
6162
}

components/script/dom/webglrenderingcontext.rs

+18-20
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use dom::bindings::inheritance::Castable;
1515
use dom::bindings::js::{JS, LayoutJS, MutNullableJS, Root};
1616
use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
1717
use dom::bindings::str::DOMString;
18+
use dom::bindings::trace::RootedTraceableBox;
1819
use dom::event::{Event, EventBubbles, EventCancelable};
1920
use dom::globalscope::GlobalScope;
2021
use dom::htmlcanvaselement::HTMLCanvasElement;
@@ -38,9 +39,9 @@ use dom_struct::dom_struct;
3839
use euclid::size::Size2D;
3940
use ipc_channel::ipc::{self, IpcSender};
4041
use js::conversions::ConversionBehavior;
41-
use js::jsapi::{JSContext, JSObject, Type, Rooted};
42+
use js::jsapi::{JSContext, JSObject, Type};
4243
use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UndefinedValue};
43-
use js::typedarray::{TypedArray, TypedArrayElement, Float32, Int32};
44+
use js::typedarray::{TypedArray, TypedArrayElement, Float32, Int32, Uint8Array, Uint16Array, ArrayBufferView};
4445
use net_traits::image::base::PixelFormat;
4546
use net_traits::image_cache_thread::ImageResponse;
4647
use offscreen_gl_context::{GLContextAttributes, GLLimits};
@@ -512,8 +513,8 @@ impl WebGLRenderingContext {
512513
// if it is UNSIGNED_SHORT_5_6_5, UNSIGNED_SHORT_4_4_4_4,
513514
// or UNSIGNED_SHORT_5_5_5_1, a Uint16Array must be supplied.
514515
// If the types do not match, an INVALID_OPERATION error is generated.
515-
typedarray!(in(cx) let typedarray_u8: Uint8Array = data);
516-
typedarray!(in(cx) let typedarray_u16: Uint16Array = data);
516+
let typedarray_u8 = RootedTraceableBox::new(Uint8Array::from(cx, data));
517+
let typedarray_u16 = RootedTraceableBox::new(Uint16Array::from(cx, data));
517518
let received_size = if data.is_null() {
518519
element_size
519520
} else {
@@ -779,15 +780,12 @@ unsafe fn typed_array_or_sequence_to_vec<T>(cx: *mut JSContext,
779780
sequence_or_abv: *mut JSObject,
780781
config: <T::Element as FromJSValConvertible>::Config)
781782
-> Result<Vec<T::Element>, Error>
782-
where T: TypedArrayElement,
783+
where T: TypedArrayElement + 'static,
783784
T::Element: FromJSValConvertible + Clone,
784785
<T::Element as FromJSValConvertible>::Config: Clone,
785786
{
786-
// TODO(servo/rust-mozjs#330): replace this with a macro that supports generic types.
787-
let mut typed_array_root = Rooted::new_unrooted();
788-
let typed_array: Option<TypedArray<T>> =
789-
TypedArray::from(cx, &mut typed_array_root, sequence_or_abv).ok();
790-
if let Some(mut typed_array) = typed_array {
787+
let mut typed_array = RootedTraceableBox::new(TypedArray::<T>::from(cx, sequence_or_abv).ok());
788+
if let Some(ref mut typed_array) = *typed_array {
791789
return Ok(typed_array.as_slice().to_vec());
792790
}
793791
assert!(!sequence_or_abv.is_null());
@@ -807,9 +805,9 @@ unsafe fn typed_array_or_sequence_to_vec<T>(cx: *mut JSContext,
807805
unsafe fn fallible_array_buffer_view_to_vec(cx: *mut JSContext, abv: *mut JSObject) -> Result<Vec<u8>, Error>
808806
{
809807
assert!(!abv.is_null());
810-
typedarray!(in(cx) let array_buffer_view: ArrayBufferView = abv);
811-
match array_buffer_view {
812-
Ok(mut v) => Ok(v.as_slice().to_vec()),
808+
let mut array_buffer_view = RootedTraceableBox::new(ArrayBufferView::from(cx, abv));
809+
match *array_buffer_view {
810+
Ok(ref mut v) => Ok(v.as_slice().to_vec()),
813811
Err(_) => Err(Error::Type("Not an ArrayBufferView".to_owned())),
814812
}
815813
}
@@ -1194,9 +1192,9 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
11941192
return Ok(self.webgl_error(InvalidValue));
11951193
}
11961194

1197-
typedarray!(in(cx) let array_buffer: ArrayBuffer = data);
1198-
let data_vec = match array_buffer {
1199-
Ok(mut data) => data.as_slice().to_vec(),
1195+
let mut array_buffer = RootedTraceableBox::new(ArrayBufferView::from(cx, data));
1196+
let data_vec = match *array_buffer {
1197+
Ok(ref mut data) => data.as_slice().to_vec(),
12001198
Err(_) => try!(fallible_array_buffer_view_to_vec(cx, data)),
12011199
};
12021200

@@ -1262,9 +1260,9 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
12621260
return Ok(self.webgl_error(InvalidValue));
12631261
}
12641262

1265-
typedarray!(in(cx) let array_buffer: ArrayBuffer = data);
1266-
let data_vec = match array_buffer {
1267-
Ok(mut data) => data.as_slice().to_vec(),
1263+
let mut array_buffer = RootedTraceableBox::new(ArrayBufferView::from(cx, data));
1264+
let data_vec = match *array_buffer {
1265+
Ok(ref mut data) => data.as_slice().to_vec(),
12681266
Err(_) => try!(fallible_array_buffer_view_to_vec(cx, data)),
12691267
};
12701268

@@ -2080,7 +2078,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
20802078
return Ok(self.webgl_error(InvalidValue));
20812079
}
20822080

2083-
typedarray!(in(cx) let mut pixels_data: ArrayBufferView = pixels);
2081+
let mut pixels_data = RootedTraceableBox::new(ArrayBufferView::from(cx, pixels));
20842082
let (array_type, mut data) = match { pixels_data.as_mut() } {
20852083
Ok(data) => (data.get_array_type(), data.as_mut_slice()),
20862084
Err(_) => return Err(Error::Type("Not an ArrayBufferView".to_owned())),

0 commit comments

Comments
 (0)