node/deps/v8/test/mjsunit/turbolev/string-slice.js
Michaël Zasso f1e0b83e7b
deps: update V8 to 14.6.202.33
PR-URL: https://github.com/nodejs/node/pull/61898
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
2026-04-24 18:01:28 +02:00

160 lines
3.3 KiB
JavaScript

// Copyright 2025 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 --turbolev --turbofan
function test1(s) {
return s.slice(1, 3);
}
%PrepareFunctionForOptimization(test1);
test1('foo');
%OptimizeFunctionOnNextCall(test1);
assertEquals('oo', test1('foo'));
assertEquals('o', test1('fo'));
assertEquals('', test1('f'));
assertEquals('', test1(''));
function test2(s) {
return s.slice(-2, 3);
}
%PrepareFunctionForOptimization(test2);
test2('foo');
%OptimizeFunctionOnNextCall(test2);
assertEquals('oo', test2('foo'));
assertEquals('fo', test2('fo'));
assertEquals('f', test2('f'));
assertEquals('', test2(''));
function test3(s) {
return s.slice(-3, -1);
}
%PrepareFunctionForOptimization(test3);
test3('foo');
%OptimizeFunctionOnNextCall(test3);
assertEquals('fo', test3('foo'));
assertEquals('f', test3('fo'));
assertEquals('', test3('f'));
assertEquals('', test3(''));
function test4(s) {
return s.slice(-2147483648, -1);
}
%PrepareFunctionForOptimization(test4);
test4('foo');
%OptimizeFunctionOnNextCall(test4);
assertEquals('fo', test4('foo'));
assertEquals('f', test4('fo'));
assertEquals('', test4('f'));
assertEquals('', test4(''));
function test5(s) {
return s.slice(0, -2147483648);
}
%PrepareFunctionForOptimization(test5);
test5('foo');
%OptimizeFunctionOnNextCall(test5);
assertEquals('', test5('foo'));
assertEquals('', test5('fo'));
assertEquals('', test5('f'));
assertEquals('', test5(''));
function test6(s) {
return s.slice(3, 2); // always empty
}
%PrepareFunctionForOptimization(test6);
test6('foo');
%OptimizeFunctionOnNextCall(test6);
assertEquals('', test6('foo'));
assertEquals('', test6('fo'));
assertEquals('', test6('f'));
assertEquals('', test6(''));
function test7(s) {
return s.slice(-2, -3); // always empty
}
%PrepareFunctionForOptimization(test7);
test7('foo');
%OptimizeFunctionOnNextCall(test7);
assertEquals('', test7('foo'));
assertEquals('', test7('fo'));
assertEquals('', test7('f'));
assertEquals('', test7(''));
function test8(s) {
let s1 = s.slice(1, 3);
let s2 = s.slice(1, 3);
%TurbofanStaticAssert(s1 == s2);
return s1;
}
%PrepareFunctionForOptimization(test8);
test8('foo');
%OptimizeFunctionOnNextCall(test8);
assertEquals('oo', test8('foo'));
let valueOfCalled = 0;
var evil = {
valueOf: () => {++valueOfCalled; return 1;}
};
function test9(s) {
let s1 = s.slice(evil, 2);
let s2 = s.slice(evil, 2); // Cannot be elided
return [s1, s2];
}
%PrepareFunctionForOptimization(test9);
test9('foo');
assertEquals(2, valueOfCalled);
%OptimizeFunctionOnNextCall(test9);
assertEquals(['o', 'o'], test9('foo'));
assertEquals(4, valueOfCalled);
function test10(s, start, end) {
return s.slice(start, end);
}
%PrepareFunctionForOptimization(test10)
assertEquals("oo", test10("foo", 1, 3));
%OptimizeFunctionOnNextCall(test10);
assertEquals("oo", test10("foo", 1, 3));
assertOptimized(test10);
// Deopts when start or end aren't numbers.
assertEquals("", test10("foo", 1, "not a number"));
assertUnoptimized(test10);
// Reopting
%OptimizeFunctionOnNextCall(test10);
assertEquals("oo", test10("foo", 1, 3));
assertOptimized(test10);
// This time doesn't deopt anymore (==> no deopt loop)
assertEquals("", test10("foo", 1, "not a number"));
assertOptimized(test10);