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 newNumber(a : any, shouldThrow = 0): any
19{
20    try {
21        if (shouldThrow == 1) {
22            throw Error("thr 1");
23        }
24        let x = new Number(a);
25        if (shouldThrow == 2) {
26            throw Error("thr 2");
27        }
28        return x;
29    } catch (e) {
30        print("catch", "'" + e + "'", "in newNumber");
31        throw (e)
32    } finally {
33        print("exit newNumber");
34    }
35}
36function newNumberZero(): any
37{
38    return new Number()
39}
40
41function test(a : any)
42{
43    a.neg = -a;
44    let checks = [typeof a, a instanceof Number, a.constructor.name, 0 + a, a.neg];
45    print(checks)
46}
47
48test(newNumber(12));
49//: exit newNumber
50//aot: [trace] aot inline function name: #*#test@builtinNumberConstructor caller function name: func_main_0@builtinNumberConstructor
51//: object,true,Number,12,-12
52
53test(newNumber("12"));
54//: exit newNumber
55//aot: [trace] aot inline function name: #*#test@builtinNumberConstructor caller function name: func_main_0@builtinNumberConstructor
56//: object,true,Number,12,-12
57
58//aot: [trace] Check Type: NotInt1
59test(newNumber("1.2"));  // Only compressed strings are supported
60//: exit newNumber
61//aot: [trace] aot inline function name: #*#test@builtinNumberConstructor caller function name: func_main_0@builtinNumberConstructor
62//: object,true,Number,1.2,-1.2
63
64test(newNumber(1.2));
65//: exit newNumber
66//aot: [trace] aot inline function name: #*#test@builtinNumberConstructor caller function name: func_main_0@builtinNumberConstructor
67//: object,true,Number,1.2,-1.2
68
69//aot: [trace] aot inline function name: #*#newNumberZero@builtinNumberConstructor caller function name: func_main_0@builtinNumberConstructor
70//aot: [trace] aot inline function name: #*#test@builtinNumberConstructor caller function name: func_main_0@builtinNumberConstructor
71test(newNumberZero());
72//: object,true,Number,0,0
73
74let numberFunction = Number;
75Number = String;
76
77//aot: [trace] Check Type: NewBuiltinCtorFail1
78test(newNumber(12));
79//: exit newNumber
80//: object,true,String,012,-12
81
82//aot: [trace] Check Type: NewBuiltinCtorFail1
83let tmp = newNumber(12);
84//: exit newNumber
85Number = numberFunction;
86test(tmp);
87//: object,false,String,012,-12
88
89//aot: [trace] Check Type: NotString1
90test(newNumber(12n));
91//: exit newNumber
92//: object,true,Number,12,-12
93
94class Foo {};
95//aot: [trace] Check Type: NotString1
96test(newNumber(new Foo()));
97//: exit newNumber
98//: object,true,Number,NaN,NaN
99
100//aot: [trace] Check Type: NotString1
101test(newNumber(new Object()));
102//: exit newNumber
103//: object,true,Number,NaN,NaN
104
105try {
106    newNumber(7, 1);
107    //: catch 'Error: thr 1' in newNumber
108    //: exit newNumber
109} catch (e) {
110    print("catch", "'" + e + "'", "in main");
111    //: catch 'Error: thr 1' in main
112}
113
114try {
115    newNumber(7, 2);
116    //: catch 'Error: thr 2' in newNumber
117    //: exit newNumber
118} catch (e) {
119    print("catch", "'" + e + "'", "in main");
120    //: catch 'Error: thr 2' in main
121}
122