Skip to content
Permalink
Browse files

Fix iterator invalidation in our forEach implementation.

  • Loading branch information
Manishearth committed Nov 26, 2019
1 parent f1aa5d8 commit d233558b9b2e33eaa236714a6c6c486e893a94d6
Showing with 12 additions and 1 deletion.
  1. +12 −1 components/script/dom/bindings/codegen/CodegenRust.py
@@ -7408,7 +7408,16 @@ def __init__(self, descriptor, iterable, methodName):
rooted!(in(*cx) let mut call_arg2 = UndefinedValue());
let mut call_args = vec![UndefinedValue(), UndefinedValue(), ObjectValue(*_obj)];
rooted!(in(*cx) let mut ignoredReturnVal = UndefinedValue());
for i in 0..(*this).get_iterable_length() {
// This has to be a while loop since get_iterable_length() may change during
// the callback, and we need to avoid iterator invalidation.
//
// It is possible for this to loop infinitely, but that matches the spec
// and other browsers.
//
// https://heycam.github.io/webidl/#es-forEach
let mut i = 0;
while i < (*this).get_iterable_length() {
(*this).get_value_at_index(i).to_jsval(*cx, call_arg1.handle_mut());
(*this).get_key_at_index(i).to_jsval(*cx, call_arg2.handle_mut());
call_args[0] = call_arg1.handle().get();
@@ -7418,6 +7427,8 @@ def __init__(self, descriptor, iterable, methodName):
ignoredReturnVal.handle_mut()) {
return false;
}
i += 1;
}
let result = ();

0 comments on commit d233558

Please sign in to comment.
You can’t perform that action at this time.