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