// 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 // This function was carefully constructed by Clusterfuzz to execute a certain // sequence of transitions. Thus, it may no longer test anything useful if // the transition logic changes. // // The more stable unit test testing the same bug is: // test-field-type-tracking/NormalizeToMigrationTarget var foo = function() { function f1(arg) { var ret = { x: arg }; ret.__defineGetter__("y", function() { }); return ret; } // Create v1 with a map with properties: {x:Smi, y:AccessorPair} let v1 = f1(10); // Create a map with properties: {x:Double, y:AccessorPair}, deprecating the // previous map. let v2 = f1(10.5); // Access x on v1 to a function that reads x, which triggers it to update its // map. This update transitions v1 to slow mode as there is already a "y" // transition with a different accessor. // // Note that the parent function `foo` can't be an IIFE, as then this callsite // would use the NoFeedback version of the LdaNamedProperty bytecode, and this // doesn't trigger the map update. v1.x; // Create v3 which overwrites a non-accessor with an accessor, triggering it // to normalize, and picking up the same cached normalized map as v1. However, // v3's map is not a migration target and v1's is (as it was migrated to when // updating v1), so the migration target bit doesn't match. This should be // fine and shouldn't trigger any DCHECKs. let v3 = { z:1 }; v3.__defineGetter__("z", function() {}); }; %EnsureFeedbackVectorForFunction(foo); foo();