diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2015-11-11 23:15:15 +0530 |
---|---|---|
committer | bors-servo <lbergstrom+bors@mozilla.com> | 2015-11-11 23:15:15 +0530 |
commit | 12f6ba29a74029fa8c83cc7274181d441e1e52dd (patch) | |
tree | 449ede9784e35351d4445e107854bf27f79afde4 /components/script/dom/bindings/conversions.rs | |
parent | 01ff78b438fe905b02735762d696408b4d073e90 (diff) | |
parent | e33330db4eb9d9187c98139aad732ff86ab9d828 (diff) | |
download | servo-12f6ba29a74029fa8c83cc7274181d441e1e52dd.tar.gz servo-12f6ba29a74029fa8c83cc7274181d441e1e52dd.zip |
Auto merge of #8412 - ecoal95:webidl-sequence-return, r=jdm
Add WebIDL sequence return values
And use it for `WebGLRenderingContext::getSupportedExtensions`.
Part of #544
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/8412)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/bindings/conversions.rs')
-rw-r--r-- | components/script/dom/bindings/conversions.rs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs index 45279e7a966..493ed4c0c27 100644 --- a/components/script/dom/bindings/conversions.rs +++ b/components/script/dom/bindings/conversions.rs @@ -46,6 +46,7 @@ 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_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}; @@ -811,6 +812,28 @@ impl<T: FromJSValConvertible> FromJSValConvertible for Option<T> { } } +impl<T: ToJSValConvertible> ToJSValConvertible for Vec<T> { + fn to_jsval(&self, cx: *mut JSContext, rval: MutableHandleValue) { + let js_array = RootedObject::new(cx, + unsafe { JS_NewArrayObject1(cx, self.len() as libc::size_t) }); + assert!(!js_array.handle().is_null()); + + for (index, obj) in self.iter().enumerate() { + let mut val = RootedValue::new(cx, UndefinedValue()); + obj.to_jsval(cx, val.handle_mut()); + + unsafe { + assert!(JS_DefineElement(cx, js_array.handle(), + index as u32, val.handle(), js::JSPROP_ENUMERATE, None, None)); + } + } + + unsafe { + rval.set(ObjectValue(&*js_array.handle().get())); + } + } +} + //http://heycam.github.io/webidl/#es-object impl ToJSValConvertible for *mut JSObject { fn to_jsval(&self, cx: *mut JSContext, rval: MutableHandleValue) { |