b8f475045c
This adds a very first version of inlined Array.prototype.pop into TurboFan optimized code. We currently limit the inlining to fast object or smi elements, until the unclear situation around hole NaNs is resolved and we have a clear semantics inside the compiler. It's also probably overly defensive in when it's safe to inline the call to Array.prototype.pop, but we can always extend that later once we have sufficient trust in the implementation and see an actual need to extend it. BUG=v8:2229,v8:3952,v8:5267 R=epertoso@chromium.org Review-Url: https://codereview.chromium.org/2239703002 Cr-Commit-Position: refs/heads/master@{#38578}
84 lines
1.6 KiB
JavaScript
84 lines
1.6 KiB
JavaScript
// 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() {
|
|
function foo(a) { return a.pop(); }
|
|
|
|
var x = {};
|
|
var a = [x,x,];
|
|
|
|
assertEquals(x, foo(a));
|
|
assertEquals(x, foo(a));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertEquals(undefined, foo(a));
|
|
assertOptimized(foo);
|
|
})();
|
|
|
|
(function() {
|
|
function foo(a) { return a.pop(); }
|
|
|
|
var x = 0;
|
|
var a = [x,x,];
|
|
|
|
assertEquals(x, foo(a));
|
|
assertEquals(x, foo(a));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertEquals(undefined, foo(a));
|
|
assertOptimized(foo);
|
|
})();
|
|
|
|
(function() {
|
|
function foo(a) { return a.pop(); }
|
|
|
|
var x = 0;
|
|
var a = [x,x,x];
|
|
|
|
assertEquals(x, foo(a));
|
|
assertEquals(x, foo(a));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertEquals(x, foo(a));
|
|
assertOptimized(foo);
|
|
})();
|
|
|
|
(function() {
|
|
function foo(a) { return a.pop(); }
|
|
|
|
var x = {};
|
|
var a = [x,x,x];
|
|
|
|
assertEquals(x, foo(a));
|
|
assertEquals(x, foo(a));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertEquals(x, foo(a));
|
|
assertOptimized(foo);
|
|
})();
|
|
|
|
(function() {
|
|
function foo(a) { return a.pop(); }
|
|
|
|
var a = [,,];
|
|
|
|
assertEquals(undefined, foo(a));
|
|
assertEquals(undefined, foo(a));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertEquals(undefined, foo(a));
|
|
assertOptimized(foo);
|
|
})();
|
|
|
|
(function() {
|
|
var pop = Array.prototype.pop;
|
|
|
|
function foo(a) { return a.pop(); }
|
|
|
|
var a = [1, 2, 3];
|
|
|
|
assertEquals(3, foo(a));
|
|
assertEquals(2, foo(a));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertEquals(1, foo(a));
|
|
assertOptimized(foo);
|
|
})();
|