Remove some usage of unsafe code in iterator.rs

This commit is contained in:
marmeladema 2019-07-27 17:23:15 +01:00
parent b08a3e6217
commit ce3778afcc

View file

@ -13,10 +13,10 @@ use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::trace::{JSTraceable, RootedTraceableBox}; use crate::dom::bindings::trace::{JSTraceable, RootedTraceableBox};
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::script_runtime::JSContext as SafeJSContext; use crate::script_runtime::JSContext;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use js::conversions::ToJSValConvertible; use js::conversions::ToJSValConvertible;
use js::jsapi::{Heap, JSContext, JSObject}; use js::jsapi::{Heap, JSObject};
use js::jsval::UndefinedValue; use js::jsval::UndefinedValue;
use js::rust::{HandleValue, MutableHandleObject}; use js::rust::{HandleValue, MutableHandleObject};
use std::cell::Cell; use std::cell::Cell;
@ -63,7 +63,7 @@ impl<T: DomObject + JSTraceable + Iterable> IterableIterator<T> {
pub fn new( pub fn new(
iterable: &T, iterable: &T,
type_: IteratorType, type_: IteratorType,
wrap: unsafe fn(SafeJSContext, &GlobalScope, Box<IterableIterator<T>>) -> DomRoot<Self>, wrap: unsafe fn(JSContext, &GlobalScope, Box<IterableIterator<T>>) -> DomRoot<Self>,
) -> DomRoot<Self> { ) -> DomRoot<Self> {
let iterator = Box::new(IterableIterator { let iterator = Box::new(IterableIterator {
reflector: Reflector::new(), reflector: Reflector::new(),
@ -76,12 +76,12 @@ impl<T: DomObject + JSTraceable + Iterable> IterableIterator<T> {
/// Return the next value from the iterable object. /// Return the next value from the iterable object.
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub fn Next(&self, cx: SafeJSContext) -> Fallible<NonNull<JSObject>> { pub fn Next(&self, cx: JSContext) -> Fallible<NonNull<JSObject>> {
let index = self.index.get(); let index = self.index.get();
rooted!(in(*cx) let mut value = UndefinedValue()); rooted!(in(*cx) let mut value = UndefinedValue());
rooted!(in(*cx) let mut rval = ptr::null_mut::<JSObject>()); rooted!(in(*cx) let mut rval = ptr::null_mut::<JSObject>());
let result = if index >= self.iterable.get_iterable_length() { let result = if index >= self.iterable.get_iterable_length() {
dict_return(*cx, rval.handle_mut(), true, value.handle()) dict_return(cx, rval.handle_mut(), true, value.handle())
} else { } else {
match self.type_ { match self.type_ {
IteratorType::Keys => { IteratorType::Keys => {
@ -90,7 +90,7 @@ impl<T: DomObject + JSTraceable + Iterable> IterableIterator<T> {
.get_key_at_index(index) .get_key_at_index(index)
.to_jsval(*cx, value.handle_mut()); .to_jsval(*cx, value.handle_mut());
} }
dict_return(*cx, rval.handle_mut(), false, value.handle()) dict_return(cx, rval.handle_mut(), false, value.handle())
}, },
IteratorType::Values => { IteratorType::Values => {
unsafe { unsafe {
@ -98,7 +98,7 @@ impl<T: DomObject + JSTraceable + Iterable> IterableIterator<T> {
.get_value_at_index(index) .get_value_at_index(index)
.to_jsval(*cx, value.handle_mut()); .to_jsval(*cx, value.handle_mut());
} }
dict_return(*cx, rval.handle_mut(), false, value.handle()) dict_return(cx, rval.handle_mut(), false, value.handle())
}, },
IteratorType::Entries => { IteratorType::Entries => {
rooted!(in(*cx) let mut key = UndefinedValue()); rooted!(in(*cx) let mut key = UndefinedValue());
@ -110,7 +110,7 @@ impl<T: DomObject + JSTraceable + Iterable> IterableIterator<T> {
.get_value_at_index(index) .get_value_at_index(index)
.to_jsval(*cx, value.handle_mut()); .to_jsval(*cx, value.handle_mut());
} }
key_and_value_return(*cx, rval.handle_mut(), key.handle(), value.handle()) key_and_value_return(cx, rval.handle_mut(), key.handle(), value.handle())
}, },
} }
}; };
@ -120,7 +120,7 @@ impl<T: DomObject + JSTraceable + Iterable> IterableIterator<T> {
} }
fn dict_return( fn dict_return(
cx: *mut JSContext, cx: JSContext,
mut result: MutableHandleObject, mut result: MutableHandleObject,
done: bool, done: bool,
value: HandleValue, value: HandleValue,
@ -128,16 +128,16 @@ fn dict_return(
let mut dict = IterableKeyOrValueResult::empty(); let mut dict = IterableKeyOrValueResult::empty();
dict.done = done; dict.done = done;
dict.value.set(value.get()); dict.value.set(value.get());
rooted!(in(cx) let mut dict_value = UndefinedValue()); rooted!(in(*cx) let mut dict_value = UndefinedValue());
unsafe { unsafe {
dict.to_jsval(cx, dict_value.handle_mut()); dict.to_jsval(*cx, dict_value.handle_mut());
} }
result.set(dict_value.to_object()); result.set(dict_value.to_object());
Ok(()) Ok(())
} }
fn key_and_value_return( fn key_and_value_return(
cx: *mut JSContext, cx: JSContext,
mut result: MutableHandleObject, mut result: MutableHandleObject,
key: HandleValue, key: HandleValue,
value: HandleValue, value: HandleValue,
@ -150,9 +150,9 @@ fn key_and_value_return(
.map(|handle| RootedTraceableBox::from_box(Heap::boxed(handle.get()))) .map(|handle| RootedTraceableBox::from_box(Heap::boxed(handle.get())))
.collect(), .collect(),
); );
rooted!(in(cx) let mut dict_value = UndefinedValue()); rooted!(in(*cx) let mut dict_value = UndefinedValue());
unsafe { unsafe {
dict.to_jsval(cx, dict_value.handle_mut()); dict.to_jsval(*cx, dict_value.handle_mut());
} }
result.set(dict_value.to_object()); result.set(dict_value.to_object());
Ok(()) Ok(())