| // 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); |
| })(); |