From e33330db4eb9d9187c98139aad732ff86ab9d828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 11 Nov 2015 18:07:51 +0100 Subject: [PATCH] Implement WebIDL sequence return value using `JS_NewArrayObject1` This commits changes the creation of the array to use the length, and sets the elements later. Reference implementation: https://github.com/mozilla/gecko-dev/blob/07ed19e582faf40f5f72567169db62452f6c6dc9/js/xpconnect/public/nsTArrayHelpers.h#L16 --- components/script/dom/bindings/conversions.rs | 35 +++++++------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs index 3f4da2199db..493ed4c0c27 100644 --- a/components/script/dom/bindings/conversions.rs +++ b/components/script/dom/bindings/conversions.rs @@ -38,16 +38,15 @@ use dom::bindings::js::Root; use dom::bindings::num::Finite; use dom::bindings::reflector::{Reflectable, Reflector}; use dom::bindings::str::{ByteString, USVString}; -use dom::bindings::trace::RootedVec; use dom::bindings::utils::DOMClass; use js; use js::glue::{GetProxyPrivate, IsWrapper, RUST_JS_NumberValue}; use js::glue::{RUST_JSID_IS_STRING, RUST_JSID_TO_STRING, UnwrapObject}; -use js::jsapi::{HandleId, HandleObject, HandleValue, Heap, JS_GetClass}; +use js::jsapi::{HandleId, HandleObject, HandleValue, JS_GetClass}; use js::jsapi::{JSClass, JSContext, JSObject, JSString, MutableHandleValue}; use js::jsapi::{JS_GetLatin1StringCharsAndLength, JS_GetReservedSlot}; use js::jsapi::{JS_GetTwoByteStringCharsAndLength, JS_NewStringCopyN}; -use js::jsapi::{JS_NewArrayObject, HandleValueArray, RootedValue}; +use js::jsapi::{JS_NewArrayObject1, JS_DefineElement, RootedValue, RootedObject}; use js::jsapi::{JS_NewUCStringCopyN, JS_StringHasLatin1Chars, JS_WrapValue}; use js::jsval::{BooleanValue, Int32Value, NullValue, UInt32Value, UndefinedValue}; use js::jsval::{JSVal, ObjectOrNullValue, ObjectValue, StringValue}; @@ -58,7 +57,7 @@ use libc; use num::Float; use num::traits::{Bounded, Zero}; use std::rc::Rc; -use std::{char, mem, ptr, slice}; +use std::{char, ptr, slice}; use util::str::DOMString; trait As: Copy { @@ -815,30 +814,22 @@ impl FromJSValConvertible for Option { impl ToJSValConvertible for Vec { fn to_jsval(&self, cx: *mut JSContext, rval: MutableHandleValue) { - let mut js_objects = RootedVec::new(); + let js_array = RootedObject::new(cx, + unsafe { JS_NewArrayObject1(cx, self.len() as libc::size_t) }); + assert!(!js_array.handle().is_null()); - for obj in self.iter() { - let mut heap = Heap::default(); + for (index, obj) in self.iter().enumerate() { let mut val = RootedValue::new(cx, UndefinedValue()); obj.to_jsval(cx, val.handle_mut()); - heap.set(val.handle().get()); - js_objects.push(heap); + + unsafe { + assert!(JS_DefineElement(cx, js_array.handle(), + index as u32, val.handle(), js::JSPROP_ENUMERATE, None, None)); + } } - let values: Vec = js_objects.iter() - .map(|heap| heap.handle().get()) - .collect(); - - let handle = HandleValueArray { - length_: values.len() as u64, - elements_: values.as_ptr(), - }; - unsafe { - let js_array = JS_NewArrayObject(cx, &handle); - assert!(!js_array.is_null()); - - rval.set(ObjectValue(mem::transmute(js_array))); + rval.set(ObjectValue(&*js_array.handle().get())); } } }