Skip to content

Commit 478305b

Browse files
Ms2gerfitzgen
authored andcommitted
Return a ConversionResult::Failure when converting a non-iterable value to Vec.
1 parent 5b30592 commit 478305b

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

mozjs/js/rust/src/conversions.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,10 +580,14 @@ impl<C: Clone, T: FromJSValConvertible<Config=C>> FromJSValConvertible for Vec<T
580580
let mut iterator = ForOfIteratorGuard::new(cx, &mut iterator);
581581
let iterator = &mut *iterator.root;
582582

583-
if !iterator.init(value, JS::ForOfIterator_NonIterableBehavior::ThrowOnNonIterable) {
583+
if !iterator.init(value, JS::ForOfIterator_NonIterableBehavior::AllowNonIterable) {
584584
return Err(())
585585
}
586586

587+
if iterator.iterator.ptr.is_null() {
588+
return Ok(ConversionResult::Failure("Value is not iterable".into()));
589+
}
590+
587591
let mut ret = vec![];
588592

589593
loop {

mozjs/js/rust/tests/vec_conversion.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ extern crate js;
77

88
use js::ac::AutoCompartment;
99
use js::conversions::ConversionBehavior;
10+
use js::conversions::ConversionResult;
1011
use js::conversions::FromJSValConvertible;
1112
use js::conversions::ToJSValConvertible;
1213
use js::jsapi::root::JS::CompartmentOptions;
@@ -67,5 +68,13 @@ fn vec_conversion() {
6768
ConversionBehavior::Default).unwrap();
6869

6970
assert_eq!(&orig_vec, converted.get_success_value().unwrap());
71+
72+
rt.evaluate_script(global, "({})", "test", 1, rval.handle_mut()).unwrap();
73+
let converted = Vec::<i32>::from_jsval(cx, rval.handle(),
74+
ConversionBehavior::Default);
75+
assert!(match converted {
76+
Ok(ConversionResult::Failure(_)) => true,
77+
_ => false,
78+
});
7079
}
7180
}

0 commit comments

Comments
 (0)