6031f172ed
Instead of changing the [[IteratedObject]] field to undefined to mark an array iterator as exhausted, store the appropriate maximum value into the [[ArrayIteratorNextIndex]] field such that the iterator will never produce any values again. Without this change the map check and the "length" access on the [[IteratedObject]] cannot be eliminated inside the loop, since the object can either be the array or undefined. Even with this change it's still not possible immediately due to missing aliasing information in the LoadElimination, but it paves the way for follow up improvements. Eventually the goal is to have `for..of` as fast as a traditional `for` loop even for really tight loops. This CL also hardens the implementation of the ArrayIterator by using proper CASTs and CSA_ASSERTs. The readability of the CSA builtin was improved by utilizing proper helper functions. Bug: v8:7510, v8:7514, v8:8070 Change-Id: Ib46604fadad1a0f80e77fe71a1f47b0ca31ab841 Reviewed-on: https://chromium-review.googlesource.com/1181902 Commit-Queue: Benedikt Meurer <bmeurer@chromium.org> Reviewed-by: Jaroslav Sevcik <jarin@chromium.org> Cr-Commit-Position: refs/heads/master@{#55261}
24 lines
510 B
JavaScript
24 lines
510 B
JavaScript
// Copyright 2018 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --allow-natives-syntax
|
|
|
|
function bar(iterator) {
|
|
for (const entry of iterator) {}
|
|
}
|
|
|
|
%NeverOptimizeFunction(bar);
|
|
|
|
function foo(a) {
|
|
const iterator = a.values();
|
|
bar(iterator);
|
|
return iterator.next().done;
|
|
}
|
|
|
|
const a = [1, 2, 3];
|
|
assertTrue(foo(a));
|
|
assertTrue(foo(a));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertTrue(foo(a));
|