v8/test/mjsunit/compiler/inline-accessors1.js
bmeurer 9dbafbd5d3 [turbofan] Add support for inlining accessors into try-blocks.
Previously the inlining of accessors into try-blocks (i.e. try/catch,
try/finally, for-of, etc.) was disabled in JSNativeContextSpecialization,
which prevented a couple of interesting optimizations, i.e. we end up
with a LOAD_IC in optimized code for this simple example:

  class A { get x() { return 1; } }
  function foo(a) {
    try {
      return a.x;
    } catch (e) {
      return 0;
    }
  }
  foo(new A)

This is now fixed and the accessors are properly rewired into the
handler chain.

BUG=v8:6278,v8:6344,v8:6424
R=jarin@chromium.org

Review-Url: https://codereview.chromium.org/2902533003
Cr-Commit-Position: refs/heads/master@{#45485}
2017-05-23 12:02:28 +00:00

78 lines
1.2 KiB
JavaScript

// 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
(function() {
class O {
get x() {
return 1;
}
}
var o = new O;
function foo(o) {
try {
return o.x;
} catch (e) {
return 0;
}
}
assertEquals(1, foo(o));
assertEquals(1, foo(o));
%OptimizeFunctionOnNextCall(foo);
assertEquals(1, foo(o));
})();
(function() {
class O {
get x() {
%DeoptimizeFunction(foo);
return 1;
}
}
var o = new O;
function foo(o) {
try {
return o.x;
} catch (e) {
return 0;
}
}
assertEquals(1, foo(o));
assertEquals(1, foo(o));
%OptimizeFunctionOnNextCall(foo);
assertEquals(1, foo(o));
})();
(function() {
function bar(x) {
throw x;
}
class O {
get x() {
%DeoptimizeFunction(foo);
return bar("x");
}
}
var o = new O;
function foo(o) {
try {
return o.x;
} catch (e) {
return 0;
}
}
assertEquals(0, foo(o));
assertEquals(0, foo(o));
%OptimizeFunctionOnNextCall(foo);
assertEquals(0, foo(o));
})();