2cb8a6e349
Bytecode flushing can make tests using assertOptimized flaky if the bytecode is flushed between marking and optimization. It can also be flaky if the feedback vector is collected before optimization. To prevent this, a new %PrepareForOptimization runtime-test function is added that hold onto the bytecode strongly until it is optimized after being explicitly marked for optimization by %OptimizeFunctionOnNextCall. BUG=v8:8801,v8:8395 Change-Id: Idbd962a3a2044b915903f9c5e92d1789942b5b41 Reviewed-on: https://chromium-review.googlesource.com/c/1463525 Commit-Queue: Ross McIlroy <rmcilroy@chromium.org> Reviewed-by: Ulan Degenbaev <ulan@chromium.org> Reviewed-by: Jaroslav Sevcik <jarin@chromium.org> Cr-Commit-Position: refs/heads/master@{#59914}
44 lines
1.3 KiB
JavaScript
44 lines
1.3 KiB
JavaScript
// Copyright 2014 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 --opt --no-always-opt
|
|
|
|
var v = 0;
|
|
|
|
// Test that elements setters/getters on prototype chain set after the fact are
|
|
// property detected and don't lead to overzealous optimization.
|
|
var my_array_proto = {};
|
|
my_array_proto.__proto__ = [].__proto__;
|
|
|
|
function push_wrapper_2(array, value) {
|
|
array.push(value);
|
|
}
|
|
%PrepareFunctionForOptimization(push_wrapper_2);
|
|
array = [];
|
|
array.__proto__ = my_array_proto;
|
|
push_wrapper_2(array, 66);
|
|
assertEquals(1, array.length);
|
|
assertEquals(0, v);
|
|
assertEquals(66, array[0]);
|
|
push_wrapper_2(array, 77);
|
|
assertEquals(2, array.length);
|
|
assertEquals(0, v);
|
|
assertEquals(77, array[1]);
|
|
%OptimizeFunctionOnNextCall(push_wrapper_2);
|
|
push_wrapper_2(array, 88);
|
|
assertEquals(3, array.length);
|
|
assertEquals(0, v);
|
|
assertEquals(88, array[2]);
|
|
assertOptimized(push_wrapper_2);
|
|
// Defining accessor should deopt optimized push.
|
|
Object.defineProperty(my_array_proto, "3", {
|
|
get: function() { return "get " + v; },
|
|
set: function(value) { v += value; }
|
|
});
|
|
assertUnoptimized(push_wrapper_2);
|
|
push_wrapper_2(array, 99);
|
|
assertEquals(4, array.length);
|
|
assertEquals(99, v);
|
|
assertEquals("get 99", array[3]);
|