585d822a84
We need to keep strong references to the final map, otherwise the test may start failing randomly depending on GC timing, because the optimized code will get deoptimized when the map disappears. Bug: v8:9236 Change-Id: I3c18cba96546020b4d70b95993e1531e787ed253 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1607652 Commit-Queue: Benedikt Meurer <bmeurer@chromium.org> Reviewed-by: Maya Lekova <mslekova@chromium.org> Cr-Commit-Position: refs/heads/master@{#61438}
83 lines
2.3 KiB
JavaScript
83 lines
2.3 KiB
JavaScript
// Copyright 2019 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 --modify-field-representation-inplace
|
|
// Flags: --no-always-opt --opt
|
|
|
|
// Test that code embedding accesses to a Smi field gets properly
|
|
// deoptimized if s->t field representation changes are done in-place.
|
|
(function() {
|
|
function O(x) { this.x = x; }
|
|
|
|
function foo(o) { return o.x; }
|
|
%PrepareFunctionForOptimization(foo);
|
|
// We need to keep an instance around to make the GC stress testing work.
|
|
const o1 = new O(1);
|
|
foo(o1);
|
|
foo(new O(2));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
foo(new O(3));
|
|
assertOptimized(foo);
|
|
|
|
new O(null);
|
|
assertUnoptimized(foo);
|
|
})();
|
|
|
|
// Test that code embedding assignments to a Smi field gets properly
|
|
// deoptimized if s->t field representation changes are done in-place.
|
|
(function() {
|
|
function O(x) { this.x = x; }
|
|
|
|
function foo(o) { o.x = 0; }
|
|
%PrepareFunctionForOptimization(foo);
|
|
// We need to keep an instance around to make the GC stress testing work.
|
|
const o1 = new O(1);
|
|
foo(o1);
|
|
foo(new O(2));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
foo(new O(3));
|
|
assertOptimized(foo);
|
|
|
|
new O(null);
|
|
assertUnoptimized(foo);
|
|
})();
|
|
|
|
// Test that code embedding accesses to a HeapObject field gets properly
|
|
// deoptimized if h->t field representation changes are done in-place.
|
|
(function() {
|
|
function O(x) { this.x = x; }
|
|
|
|
function foo(o) { return o.x; }
|
|
%PrepareFunctionForOptimization(foo);
|
|
// We need to keep an instance around to make the GC stress testing work.
|
|
const onull = new O(null);
|
|
foo(onull);
|
|
foo(new O("Hello"));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
foo(new O({}));
|
|
assertOptimized(foo);
|
|
|
|
new O(1);
|
|
assertUnoptimized(foo);
|
|
})();
|
|
|
|
// Test that code embedding assignments to a Smi field gets properly
|
|
// deoptimized if s->t field representation changes are done in-place.
|
|
(function() {
|
|
function O(x) { this.x = x; }
|
|
|
|
function foo(o) { o.x = true; }
|
|
%PrepareFunctionForOptimization(foo);
|
|
// We need to keep an instance around to make the GC stress testing work.
|
|
const onull = new O(null);
|
|
foo(onull);
|
|
foo(new O("Hello"));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
foo(new O({}));
|
|
assertOptimized(foo);
|
|
|
|
new O(1);
|
|
assertUnoptimized(foo);
|
|
})();
|