// Copyright 2016 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 TestDeoptFromComputedNameInObjectLiteral() { function f() { var o = { toString: function() { %DeoptimizeFunction(f); return "x"; } }; return { [o]() { return 23 } }; } assertEquals(23, f().x()); assertEquals(23, f().x()); %OptimizeFunctionOnNextCall(f); assertEquals(23, f().x()); })(); (function TestDeoptFromComputedNameInObjectLiteralWithModifiedPrototype() { // The prototype chain should not be used if the definition // happens in the object literal. Object.defineProperty(Object.prototype, 'x_proto', { get: function () { return 21; }, set: function () { } }); function f() { var o = { toString: function() { %DeoptimizeFunction(f); return "x_proto"; } }; return { [o]() { return 23 } }; } assertEquals(23, f().x_proto()); assertEquals(23, f().x_proto()); %OptimizeFunctionOnNextCall(f); assertEquals(23, f().x_proto()); delete Object.prototype.c; })(); (function TestDeoptFromComputedNameInClassLiteral() { function g() { var o = { toString: function() { %DeoptimizeFunction(g); return "y"; } }; class C { [o]() { return 42 }; } return new C(); } assertEquals(42, g().y()); assertEquals(42, g().y()); %OptimizeFunctionOnNextCall(g); assertEquals(42, g().y()); })();