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