/*
* Copyright (c) 2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
declare interface ArkTools {
isAOTCompiled(args: any): boolean;
}
declare function print(arg:any):string;
function printZero(x: any) {
if (Object.is(x, -0)) {
print("-0");
} else {
print(x);
}
}
function replace(a : number)
{
return a;
}
// Use try to prevent inlining to main
function printMax(x: any, y: any) {
try {
print(Math.max(x, y));
} finally {
}
}
function printMax1(x: any) {
try {
print(Math.max(x));
} finally {
}
}
function printMax3(x: any, y: any, z: any) {
try {
print(Math.max(x, y, z));
} finally {
}
}
let doubleObj = {
valueOf: () => { return 2.7; }
}
let nanObj = {
valueOf: () => { return "something"; }
}
let obj = {
valueOf: () => {
print("obj.valueOf")
return -23;
}
};
// Check without params
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max()); //: -Infinity
// Check with single param
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(0)); //: 0
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(567)); //: 567
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-1e80)); //: -1e+80
// Check with special float params
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(Infinity)); //: Infinity
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-Infinity)); //: -Infinity
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(NaN)); //: NaN
// Check with 2 int params
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(3, 300)); //: 300
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(300, 3)); //: 300
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(3, -2)); //: 3
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-22, -2)); //: -2
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-1, -1)); //: -1
// Check with 2 float params
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(3.2, 300.7)); //: 300.7
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(300.7, 3.2)); //: 300.7
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(3e9, -2e10)); //: 3000000000
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-22.1, -2e-10)); //: -2e-10
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-1.8, -1.8)); //: -1.8
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(Infinity, -1.8)); //: Infinity
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-1.8, Infinity)); //: Infinity
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-Infinity, -1.8)); //: -1.8
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-1.8, -Infinity)); //: -1.8
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-1.8, NaN)); //: NaN
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(NaN, -1.8)); //: NaN
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-Infinity, NaN)); //: NaN
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(Infinity, NaN)); //: NaN
// Check 0 and -0
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
//aot: [trace] aot inline function name: #*#printZero@builtinMathMax caller function name: func_main_0@builtinMathMax
//aot: [trace] aot inline builtin: Object.is, caller function name:#*#printZero@builtinMathMax
printZero(Math.max(0, -0)); //: 0
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
//aot: [trace] aot inline function name: #*#printZero@builtinMathMax caller function name: func_main_0@builtinMathMax
//aot: [trace] aot inline builtin: Object.is, caller function name:#*#printZero@builtinMathMax
printZero(Math.max(-0, 0)); //: 0
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
//aot: [trace] aot inline function name: #*#printZero@builtinMathMax caller function name: func_main_0@builtinMathMax
//aot: [trace] aot inline builtin: Object.is, caller function name:#*#printZero@builtinMathMax
printZero(Math.max(0, 0)); //: 0
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
//aot: [trace] aot inline function name: #*#printZero@builtinMathMax caller function name: func_main_0@builtinMathMax
//aot: [trace] aot inline builtin: Object.is, caller function name:#*#printZero@builtinMathMax
printZero(Math.max(-0, -0)); //: -0
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
//aot: [trace] aot inline function name: #*#printZero@builtinMathMax caller function name: func_main_0@builtinMathMax
//aot: [trace] aot inline builtin: Object.is, caller function name:#*#printZero@builtinMathMax
printZero(Math.max(-5, -0)); //: -0
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
//aot: [trace] aot inline function name: #*#printZero@builtinMathMax caller function name: func_main_0@builtinMathMax
//aot: [trace] aot inline builtin: Object.is, caller function name:#*#printZero@builtinMathMax
printZero(Math.max(-5, 0)); //: 0
// Check with int and float param
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(1.5, 3)); //: 3
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(3, 1.5)); //: 3
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(2.5, 1)); //: 2.5
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(1, 2.5)); //: 2.5
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(1, -Infinity)); //: 1
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(5, NaN)); //: NaN
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(NaN, 5)); //: NaN
// Check with 3 params
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(2, 4, 6)); //: 6
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(4, 6, 2)); //: 6
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(6, 2, 4)); //: 6
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-1, 1, 2.5)); //: 2.5
// Check with 4 params
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(-4, 0, 2, -Infinity)); //: 2
// Check with 5 params
//aot: [trace] aot inline builtin: Math.max, caller function name:func_main_0@builtinMathMax
print(Math.max(1, 2, 1.5, 2, 8)); //: 8
// Replace standard builtin
let trueMax = Math.max
Math.max = replace
print(Math.max(-1.001, -90)); //: -1.001
Math.max = trueMax
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax@builtinMathMax
printMax(-12, -100); //: -12
// Call standard builtin with non-number param
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax@builtinMathMax
//aot: [trace] Check Type: NotNumber2
printMax("abc", -100); //: NaN
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax@builtinMathMax
//aot: [trace] Check Type: NotNumber2
printMax("-12", -100); //: -12
if (ArkTools.isAOTCompiled(printMax)) {
// Replace standard builtin after call to standard builtin was profiled
Math.max = replace
}
//aot: [trace] Check Type: NotCallTarget1
printMax(5, 12); //pgo: 12
//aot: 5
//aot: [trace] Check Type: NotCallTarget1
printMax("abc", 2); //pgo: NaN
//aot: abc
Math.max = trueMax
// Check IR correctness inside try-block
try {
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax@builtinMathMax
printMax(19, 20); //: 20
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax@builtinMathMax
printMax(19, 12); //: 19
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax@builtinMathMax
//aot: [trace] Check Type: NotNumber2
printMax("abc", 5); //: NaN
} catch (e) {
}
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax1@builtinMathMax
//aot: [trace] Check Type: InconsistentType1
//: obj.valueOf
printMax1(obj); //: -23
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax1@builtinMathMax
//aot: [trace] Check Type: InconsistentType1
printMax1(doubleObj); //: 2.7
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax@builtinMathMax
//aot: [trace] Check Type: NotNumber2
printMax(doubleObj, doubleObj); //: 2.7
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax@builtinMathMax
//aot: [trace] Check Type: NotNumber2
//: obj.valueOf
printMax(nanObj, obj); //: NaN
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax@builtinMathMax
//aot: [trace] Check Type: NotNumber2
//: obj.valueOf
printMax(2, obj); //: 2
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax@builtinMathMax
//aot: [trace] Check Type: NotNumber2
//: obj.valueOf
printMax(-100, obj); //: -23
// call obj.valueOf twice
//aot: [trace] aot inline builtin: Math.max, caller function name:#*#printMax3@builtinMathMax
//aot: [trace] Check Type: NotNumber2
//: obj.valueOf
//: obj.valueOf
printMax3(NaN, obj, obj); //: NaN