From e0960e19aa4ea2a6c15b6c0aceb2ed83e0a9a48d Mon Sep 17 00:00:00 2001 From: "verwaest@chromium.org" Date: Thu, 13 Feb 2014 16:55:38 +0000 Subject: [PATCH] Fix polymorphic inlining of accessors in a test-context. R=ishell@chromium.org Review URL: https://codereview.chromium.org/164003002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19363 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/hydrogen.cc | 10 ++++++--- .../regress/polymorphic-accessor-test-context.js | 25 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 test/mjsunit/regress/polymorphic-accessor-test-context.js diff --git a/src/hydrogen.cc b/src/hydrogen.cc index e59048a..51e7706 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -5791,9 +5791,13 @@ void HOptimizedGraphBuilder::HandlePolymorphicNamedFieldAccess( } ASSERT(join != NULL); - join->SetJoinId(ast_id); - set_current_block(join); - if (!ast_context()->IsEffect()) ast_context()->ReturnValue(Pop()); + if (join->HasPredecessor()) { + join->SetJoinId(ast_id); + set_current_block(join); + if (!ast_context()->IsEffect()) ast_context()->ReturnValue(Pop()); + } else { + set_current_block(NULL); + } } diff --git a/test/mjsunit/regress/polymorphic-accessor-test-context.js b/test/mjsunit/regress/polymorphic-accessor-test-context.js new file mode 100644 index 0000000..6188279 --- /dev/null +++ b/test/mjsunit/regress/polymorphic-accessor-test-context.js @@ -0,0 +1,25 @@ +// Copyright 2014 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 t1() { return this instanceof t1; } +function t2() { return this instanceof t2; } + +var o1 = new (function() { })(); +Object.defineProperty(o1, "t", {get:function() { return this instanceof o1.constructor; }}); +var o2 = new (function() { })(); +Object.defineProperty(o2, "t", {get:function() { return this instanceof o1.constructor; }}); +var o3 = new (function() { })(); +o3.t = true; + +function f(o) { + return 1 + (o.t ? 1 : 2); +} + +f(o1); +f(o1); +f(o2); +%OptimizeFunctionOnNextCall(f); +f(o3); -- 2.7.4