| // Copyright 2017 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 --noalways-opt |
| |
| function foo() { |
| function g(o) { |
| return o.f; |
| } |
| return g; |
| } |
| |
| let g1 = foo(); |
| let g2 = foo(); |
| %PrepareFunctionForOptimization(g1); |
| |
| g1({ f : 1}); |
| g1({ f : 2}); |
| g2({ f : 2}); |
| g2({ f : 2}); |
| |
| %OptimizeFunctionOnNextCall(g1); |
| g1({ f : 1}); |
| |
| %PrepareFunctionForOptimization(g2); |
| %OptimizeFunctionOnNextCall(g2); |
| g2({ f : 2}); |
| g1({}); |
| if (%DynamicMapChecksEnabled()) { |
| // One more call to ensure a deopt even if dynamic map checks is enabled. |
| g1({}); |
| } |
| |
| assertUnoptimized(g1); |
| |
| // Deoptimization of g1 should also deoptimize g2 because they should share |
| // the optimized code object. (Unfortunately, this test bakes in various |
| // other assumptions about dealing with optimized code, and thus might break |
| // in future.) |
| assertUnoptimized(g2); |
| |
| g2({}); |