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