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 function print(arg:any):string; 17 18function testNumberParseFloat(a : any, shouldThrow = 0): any 19{ 20 try { 21 if (shouldThrow == 1) { 22 throw Error("thr 1"); 23 } 24 let x = Number.parseFloat(a); 25 if (shouldThrow == 2) { 26 throw Error("thr 2"); 27 } 28 return x; 29 } catch (e) { 30 print("catch", "'" + e + "'", "in testNumberParseFloat"); 31 throw (e) 32 } finally { 33 print("exit testNumberParseFloat"); 34 } 35} 36 37function testParseFloat(a : any, shouldThrow = 0): any 38{ 39 try { 40 if (shouldThrow == 1) { 41 throw Error("thr 1"); 42 } 43 let x = parseFloat(a); 44 if (shouldThrow == 2) { 45 throw Error("thr 2"); 46 } 47 return x; 48 } catch (e) { 49 print("catch", "'" + e + "'", "in testParseFloat"); 50 throw (e) 51 } finally { 52 print("exit testParseFloat"); 53 } 54} 55 56print(Number.parseFloat === parseFloat); 57//: true 58 59function test(a : any) 60{ 61 let checks = [typeof a, a]; 62 print(checks) 63} 64 65function valueTest(testFunc : any) { 66 test(testFunc("12")); 67 test(testFunc("1.2")); 68 test(testFunc(".2")); 69 test(testFunc("-.2")); 70 test(testFunc("2.")); 71 test(testFunc("-2.")); 72 test(testFunc(" \t \n-.2")); 73 test(testFunc("-.2+2")); 74 test(testFunc("12e-2")); 75 test(testFunc("0.012E+2")); 76 test(testFunc(".")); 77 test(testFunc("1.7976931348623159e+308")); 78 test(testFunc("Infinity")); 79 test(testFunc("-1.7976931348623159e+308")); 80 test(testFunc("-Infinity")); 81 test(testFunc("900719925474099267n")); 82} 83 84valueTest(testParseFloat) 85//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 86//: exit testParseFloat 87//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 88//: number,12 89//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 90//: exit testParseFloat 91//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 92//: number,1.2 93//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 94//: exit testParseFloat 95//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 96//: number,0.2 97//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 98//: exit testParseFloat 99//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 100//: number,-0.2 101//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 102//: exit testParseFloat 103//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 104//: number,2 105//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 106//: exit testParseFloat 107//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 108//: number,-2 109//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 110//: exit testParseFloat 111//: number,-0.2 112//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 113//: exit testParseFloat 114//: number,-0.2 115//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 116//: exit testParseFloat 117//: number,0.12 118//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 119//: exit testParseFloat 120//: number,1.2 121//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 122//: exit testParseFloat 123//: number,NaN 124//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 125//: exit testParseFloat 126//: number,Infinity 127//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 128//: exit testParseFloat 129//: number,Infinity 130//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 131//: exit testParseFloat 132//: number,-Infinity 133//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 134//: exit testParseFloat 135//: number,-Infinity 136//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 137//: exit testParseFloat 138//: number,900719925474099300 139 140valueTest(testNumberParseFloat) 141//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 142//: exit testNumberParseFloat 143//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 144//: number,12 145//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 146//: exit testNumberParseFloat 147//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 148//: number,1.2 149//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 150//: exit testNumberParseFloat 151//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 152//: number,0.2 153//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 154//: exit testNumberParseFloat 155//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 156//: number,-0.2 157//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 158//: exit testNumberParseFloat 159//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 160//: number,2 161//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 162//: exit testNumberParseFloat 163//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: #*#valueTest@builtinNumberParseFloat 164//: number,-2 165//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 166//: exit testNumberParseFloat 167//: number,-0.2 168//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 169//: exit testNumberParseFloat 170//: number,-0.2 171//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 172//: exit testNumberParseFloat 173//: number,0.12 174//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 175//: exit testNumberParseFloat 176//: number,1.2 177//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 178//: exit testNumberParseFloat 179//: number,NaN 180//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 181//: exit testNumberParseFloat 182//: number,Infinity 183//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 184//: exit testNumberParseFloat 185//: number,Infinity 186//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 187//: exit testNumberParseFloat 188//: number,-Infinity 189//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 190//: exit testNumberParseFloat 191//: number,-Infinity 192//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 193//: exit testNumberParseFloat 194//: number,900719925474099300 195 196// Check deopt: 197let obj = {}; 198obj.toString = function () : string { 199 return "22"; 200} 201test(testParseFloat(obj)); 202//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 203//aot: [trace] Check Type: NotString1 204//: exit testParseFloat 205//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: func_main_0@builtinNumberParseFloat 206//: number,22 207test(testNumberParseFloat(obj)); 208//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 209//aot: [trace] Check Type: NotString1 210//: exit testNumberParseFloat 211//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: func_main_0@builtinNumberParseFloat 212//: number,22 213 214obj = new Number(22); 215test(testParseFloat(obj)); 216//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 217//aot: [trace] Check Type: NotString1 218//: exit testParseFloat 219//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: func_main_0@builtinNumberParseFloat 220//: number,22 221test(testNumberParseFloat(obj)); 222//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 223//aot: [trace] Check Type: NotString1 224//: exit testNumberParseFloat 225//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: func_main_0@builtinNumberParseFloat 226//: number,22 227 228// Check deopt with throw: 229try { 230 test(testParseFloat(obj, 1)); 231} catch (e) {} 232//: catch 'Error: thr 1' in testParseFloat 233//: exit testParseFloat 234try { 235 test(testNumberParseFloat(obj, 1)); 236} catch (e) {} 237//: catch 'Error: thr 1' in testNumberParseFloat 238//: exit testNumberParseFloat 239 240try { 241 test(testParseFloat(obj, 2)); 242} catch (e) {} 243//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 244//aot: [trace] Check Type: NotString1 245//: catch 'Error: thr 2' in testParseFloat 246//: exit testParseFloat 247try { 248 test(testNumberParseFloat(obj, 2)); 249} catch (e) {} 250//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testNumberParseFloat@builtinNumberParseFloat 251//aot: [trace] Check Type: NotString1 252//: catch 'Error: thr 2' in testNumberParseFloat 253//: exit testNumberParseFloat 254 255// Check replace: 256Number.parseFloat = () => { throw "CheckReplace" } 257 258test(testParseFloat("1")); 259 260//aot: [trace] aot inline builtin: Number.parseFloat, caller function name:#*#testParseFloat@builtinNumberParseFloat 261//: exit testParseFloat 262//aot: [trace] aot inline function name: #*#test@builtinNumberParseFloat caller function name: func_main_0@builtinNumberParseFloat 263//: number,1 264 265try { 266 test(testNumberParseFloat("1")); 267} catch (e) { 268 if (e != "CheckReplace") throw Error(); 269} 270//aot: [trace] Check Type: NotCallTarget1 271//: catch 'CheckReplace' in testNumberParseFloat 272//: exit testNumberParseFloat 273