1/* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16declare interface ArkTools { 17 isAOTCompiled(args: any): boolean; 18} 19 20declare function print(arg:any):string; 21function replace(a : number) 22{ 23 return a; 24} 25 26function doCeil(x: any): number { 27 return Math.ceil(x); 28} 29 30function printCeil(x: any) { 31 try { 32 print(doCeil(x)); 33 } finally { 34 } 35} 36 37// Check without params 38//aot: [trace] aot inline builtin: Math.ceil, caller function name:func_main_0@builtinMathCeil 39print(Math.ceil()); //: NaN 40 41// Replace standart builtin 42let backup = Math.ceil 43//aot: [trace] Check Type: NotCallTarget1 44Math.ceil = replace 45printCeil(111); //: 111 46Math.ceil = backup 47 48// Check with NaN param 49//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 50printCeil(NaN); //: NaN 51 52// Check with infinity param 53//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 54printCeil(-Infinity); //: -Infinity 55//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 56printCeil(+Infinity); //: Infinity 57 58// Check with zero param 59//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 60printCeil(-0.0); //: 0 61//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 62printCeil(0.0); //: 0 63//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 64printCeil(+0.0); //: 0 65 66// Check with integer param 67//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 68printCeil(-1.0); //: -1 69//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 70printCeil(+1.0); //: 1 71//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 72printCeil(-12.0); //: -12 73//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 74printCeil(+12.0); //: 12 75//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 76printCeil(-123.0); //: -123 77//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 78printCeil(+123.0); //: 123 79 80//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 81printCeil(1.5); //: 2 82// Call standard builtin with non-number param 83//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 84printCeil("abc"); //aot: [trace] Check Type: NotNumber1 85 //: NaN 86//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 87printCeil("1.5"); //aot: [trace] Check Type: NotNumber1 88 //: 2 89 90if (ArkTools.isAOTCompiled(printCeil)) { 91 // Replace standard builtin after call to standard builtin was profiled 92 Math.ceil = replace 93} 94printCeil(1.5); //aot: [trace] Check Type: NotCallTarget1 95 //aot: 1.5 96 //pgo: 2 97printCeil("abc"); //aot: [trace] Check Type: NotCallTarget1 98 //aot: abc 99 //pgo: NaN 100 101Math.ceil = backup 102 103// Check with fractional param 104//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 105printCeil(-1.25); //: -1 106//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 107printCeil(+1.25); //: 2 108//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 109printCeil(-1.50); //: -1 110//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 111printCeil(+1.50); //: 2 112//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 113printCeil(-1.75); //: -1 114//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 115printCeil(+1.75); //: 2 116 117// Check with non-number param 118//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 119printCeil("string"); //aot: [trace] Check Type: NotNumber1 120 //: NaN 121//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 122printCeil(null); //aot: [trace] Check Type: NotNumber1 123 //: 0 124//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 125printCeil(undefined); //aot: [trace] Check Type: NotNumber1 126 //: NaN 127//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 128printCeil(false); //aot: [trace] Check Type: NotNumber1 129 //: 0 130//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 131printCeil(true); //aot: [trace] Check Type: NotNumber1 132 //: 1 133//aot: [trace] aot inline builtin: Math.ceil, caller function name:#*#doCeil@builtinMathCeil 134printCeil(new Object); //aot: [trace] Check Type: NotNumber1 135 //: NaN 136printCeil("1.3333"); 137 //: 2