// 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 (function testMaybeAssignedWithShadowing() { function foo() { let a = 0; let g; with ({}) { g = function g() { // Increment a, should set it maybe_assigned but doesn't in the bug. ++a; } // Shadowing the outer 'a' with a dynamic one. a; } return function () { // The access to a would be context specialized (to 2 since it's after the // second call) if maybe_assigned were incorrectly not set. g(a); return a; } }; f = foo(); %PrepareFunctionForOptimization(f); assertEquals(f(), 1); assertEquals(f(), 2); %OptimizeFunctionOnNextCall(f); assertEquals(f(), 3); })(); // Same test as above, just with more shadowing (including dynamic->dynamic // shadowing) and skipping over scopes with shadows. (function testMaybeAssignedWithDeeplyNestedShadowing() { function foo() { let a = 0; let g; // Increment a, should set it maybe_assigned but doesn't in the bug. with ({}) { with ({}) { with ({}) { with ({}) { with ({}) { g = function g() { ++a; } // Shadow the second dynamic 'a'. a; } // Shadowing the first dynamic 'a'. a; } // Skip shadowing here } // Skip shadowing here } // Shadowing the outer 'a' with a dynamic one. a; } return function () { // The access to a would be context specialized (to 2 since it's after the // second call) if maybe_assigned were incorrectly not set. g(a); return a; } }; f = foo(); %PrepareFunctionForOptimization(f); assertEquals(f(), 1); assertEquals(f(), 2); %OptimizeFunctionOnNextCall(f); assertEquals(f(), 3); })();