2024-08-14 20:41:00 +02:00
|
|
|
// Copyright 2024 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.
|
|
|
|
|
2025-04-29 08:03:15 +02:00
|
|
|
// Flags: --allow-natives-syntax --turbolev --turbofan
|
2024-08-14 20:41:00 +02:00
|
|
|
// Flags: --no-always-turbofan
|
|
|
|
|
|
|
|
function string_cmp(str1, str2, cmp) {
|
|
|
|
if (cmp == 0) { return str1 < str2; }
|
|
|
|
if (cmp == 1) { return str1 <= str2; }
|
|
|
|
if (cmp == 2) { return str1 > str2; }
|
|
|
|
if (cmp == 3) { return str1 >= str2; }
|
|
|
|
if (cmp == 4) { return str1 == str2; }
|
|
|
|
if (cmp == 5) { return str1 != str2; }
|
|
|
|
}
|
|
|
|
|
|
|
|
%PrepareFunctionForOptimization(string_cmp);
|
|
|
|
assertEquals(true, string_cmp("ab", "cd", 0)); // <
|
|
|
|
assertEquals(false, string_cmp("ab", "ab", 0));
|
|
|
|
assertEquals(false, string_cmp("ar", "ab", 0));
|
|
|
|
assertEquals(true, string_cmp("ab", "cd", 1)); // <=
|
|
|
|
assertEquals(true, string_cmp("ab", "ab", 1));
|
|
|
|
assertEquals(false, string_cmp("ar", "ab", 1));
|
|
|
|
assertEquals(true, string_cmp("cd", "ab", 2)); // >
|
|
|
|
assertEquals(false, string_cmp("ab", "ab", 2));
|
|
|
|
assertEquals(false, string_cmp("ab", "cd", 2));
|
|
|
|
assertEquals(true, string_cmp("cd", "ab", 3)); // >=
|
|
|
|
assertEquals(true, string_cmp("ab", "ab", 3));
|
|
|
|
assertEquals(false, string_cmp("ab", "cd", 3));
|
|
|
|
assertEquals(true, string_cmp("ab", "ab", 4)); // ==
|
|
|
|
assertEquals(false, string_cmp("ar", "ab", 4));
|
|
|
|
assertEquals(true, string_cmp("ab", "cd", 5)); // !=
|
|
|
|
assertEquals(false, string_cmp("ab", "ab", 5));
|
|
|
|
|
|
|
|
%OptimizeFunctionOnNextCall(string_cmp);
|
|
|
|
assertEquals(true, string_cmp("ab", "cd", 0)); // <
|
|
|
|
assertEquals(false, string_cmp("ab", "ab", 0));
|
|
|
|
assertEquals(false, string_cmp("ar", "ab", 0));
|
|
|
|
assertOptimized(string_cmp);
|
|
|
|
assertEquals(true, string_cmp("ab", "cd", 1)); // <=
|
|
|
|
assertEquals(true, string_cmp("ab", "ab", 1));
|
|
|
|
assertEquals(false, string_cmp("ar", "ab", 1));
|
|
|
|
assertOptimized(string_cmp);
|
|
|
|
assertEquals(true, string_cmp("cd", "ab", 2)); // >
|
|
|
|
assertEquals(false, string_cmp("ab", "ab", 2));
|
|
|
|
assertEquals(false, string_cmp("ab", "cd", 2));
|
|
|
|
assertOptimized(string_cmp);
|
|
|
|
assertEquals(true, string_cmp("cd", "ab", 3)); // >=
|
|
|
|
assertEquals(true, string_cmp("ab", "ab", 3));
|
|
|
|
assertEquals(false, string_cmp("ab", "cd", 3));
|
|
|
|
assertOptimized(string_cmp);
|
|
|
|
assertEquals(true, string_cmp("ab", "ab", 4)); // ==
|
|
|
|
assertEquals(false, string_cmp("ar", "ab", 4));
|
|
|
|
assertEquals(true, string_cmp("ab", "cd", 5)); // !=
|
|
|
|
assertEquals(false, string_cmp("ab", "ab", 5));
|
|
|
|
assertOptimized(string_cmp);
|
|
|
|
|
|
|
|
// Passing a non-internal string as a parameter will trigger a deopt in "=="
|
|
|
|
let str = "abcdefghi";
|
|
|
|
assertEquals(false, string_cmp(str + "azeazeaze", "abc", 4));
|
|
|
|
assertUnoptimized(string_cmp);
|