diff options
author | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-01-04 14:58:57 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-01-04 15:19:29 +0100 |
commit | 9ad49c8aa1524f597707aaa4ea937a48534b2415 (patch) | |
tree | 5f970e782ac96dbb99244fdf9cdcb90a223d738d /components/script/dom/textdecoder.rs | |
parent | 4d32444bf731f75c29e6bad7777ae8eacb96bcdc (diff) | |
download | servo-9ad49c8aa1524f597707aaa4ea937a48534b2415.tar.gz servo-9ad49c8aa1524f597707aaa4ea937a48534b2415.zip |
conversion: Extrapolate array_buffer_view_data
And use it instead of the raw jsapi calls.
Diffstat (limited to 'components/script/dom/textdecoder.rs')
-rw-r--r-- | components/script/dom/textdecoder.rs | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/components/script/dom/textdecoder.rs b/components/script/dom/textdecoder.rs index c0dcd485c9f..30ecb84f2af 100644 --- a/components/script/dom/textdecoder.rs +++ b/components/script/dom/textdecoder.rs @@ -4,6 +4,7 @@ use dom::bindings::codegen::Bindings::TextDecoderBinding; use dom::bindings::codegen::Bindings::TextDecoderBinding::TextDecoderMethods; +use dom::bindings::conversions::array_buffer_view_data; use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; @@ -13,10 +14,8 @@ use dom::bindings::trace::JSTraceable; use encoding::Encoding; use encoding::label::encoding_from_whatwg_label; use encoding::types::{DecoderTrap, EncodingRef}; -use js::jsapi::JS_GetObjectAsArrayBufferView; use js::jsapi::{JSContext, JSObject}; use std::borrow::ToOwned; -use std::{ptr, slice}; use util::str::DOMString; #[dom_struct] @@ -89,21 +88,20 @@ impl TextDecoderMethods for TextDecoder { None => return Ok(USVString("".to_owned())), }; - let mut length = 0; - let mut data = ptr::null_mut(); - if unsafe { JS_GetObjectAsArrayBufferView(input, &mut length, &mut data).is_null() } { - return Err(Error::Type("Argument to TextDecoder.decode is not an ArrayBufferView".to_owned())); - } - - let buffer = unsafe { - slice::from_raw_parts(data as *const _, length as usize) + let data = match unsafe { array_buffer_view_data::<u8>(input) } { + Some(data) => data, + None => { + return Err(Error::Type("Argument to TextDecoder.decode is not an ArrayBufferView".to_owned())); + } }; + let trap = if self.fatal { DecoderTrap::Strict } else { DecoderTrap::Replace }; - match self.encoding.decode(buffer, trap) { + + match self.encoding.decode(data, trap) { Ok(s) => Ok(USVString(s)), Err(_) => Err(Error::Type("Decoding failed".to_owned())), } |