mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-03-16 02:00:51 +00:00
Remove string allocation from try_iter
This allows to significantly speed up iteration over small collections, where string encoding is the primary overhead. Related to #1386, but works around only this partial case.
This commit is contained in:
parent
b4b3926bb8
commit
11bb8f03c2
@ -1101,6 +1101,14 @@ impl IterState {
|
||||
/// Create an iterator over `val` using the JS iteration protocol and
|
||||
/// `Symbol.iterator`.
|
||||
pub fn try_iter(val: &JsValue) -> Result<Option<IntoIter>, JsValue> {
|
||||
#[wasm_bindgen]
|
||||
extern "C" {
|
||||
type MaybeIterator;
|
||||
|
||||
#[wasm_bindgen(method, getter)]
|
||||
fn next(this: &MaybeIterator) -> JsValue;
|
||||
}
|
||||
|
||||
let iter_sym = Symbol::iterator();
|
||||
let iter_fn = Reflect::get(val, iter_sym.as_ref())?;
|
||||
if !iter_fn.is_function() {
|
||||
@ -1113,8 +1121,7 @@ pub fn try_iter(val: &JsValue) -> Result<Option<IntoIter>, JsValue> {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
let next = JsValue::from("next");
|
||||
let next = Reflect::get(&it, &next)?;
|
||||
let next = it.unchecked_ref::<MaybeIterator>().next();
|
||||
|
||||
Ok(if next.is_function() {
|
||||
let it: Iterator = it.unchecked_into();
|
||||
|
Loading…
x
Reference in New Issue
Block a user