/*
* 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 replace(a : number)
{
return a;
}
function doCeil(x: any): number {
return Math.ceil(x);
}
function printCeil(x: any) {
try {
print(doCeil(x));
} finally {
}
}
// Check without params
//aot: [trace] aot inline builtin: Math.ceil, caller function name:func_main_0@builtinMathCeil
print(Math.ceil()); //: NaN
// Replace standart builtin
let backup = Math.ceil
//aot: [trace] Check Type: NotCallTarget1
Math.ceil = replace
printCeil(111); //: 111
Math.ceil = backup
// Check with NaN param
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(NaN); //: NaN
// Check with infinity param
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(-Infinity); //: -Infinity
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(+Infinity); //: Infinity
// Check with zero param
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(-0.0); //: 0
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(0.0); //: 0
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(+0.0); //: 0
// Check with integer param
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(-1.0); //: -1
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(+1.0); //: 1
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(-12.0); //: -12
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(+12.0); //: 12
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(-123.0); //: -123
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(+123.0); //: 123
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(1.5); //: 2
// Call standard builtin with non-number param
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil("abc"); //aot: [trace] Check Type: NotNumber1
//: NaN
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil("1.5"); //aot: [trace] Check Type: NotNumber1
//: 2
if (ArkTools.isAOTCompiled(printCeil)) {
// Replace standard builtin after call to standard builtin was profiled
Math.ceil = replace
}
printCeil(1.5); //aot: [trace] Check Type: NotCallTarget1
//aot: 1.5
//pgo: 2
printCeil("abc"); //aot: [trace] Check Type: NotCallTarget1
//aot: abc
//pgo: NaN
Math.ceil = backup
// Check with fractional param
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(-1.25); //: -1
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(+1.25); //: 2
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(-1.50); //: -1
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(+1.50); //: 2
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(-1.75); //: -1
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(+1.75); //: 2
// Check with non-number param
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil("string"); //aot: [trace] Check Type: NotNumber1
//: NaN
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(null); //aot: [trace] Check Type: NotNumber1
//: 0
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(undefined); //aot: [trace] Check Type: NotNumber1
//: NaN
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(false); //aot: [trace] Check Type: NotNumber1
//: 0
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(true); //aot: [trace] Check Type: NotNumber1
//: 1
//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil
printCeil(new Object); //aot: [trace] Check Type: NotNumber1
//: NaN
printCeil("1.3333");
//: 2