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} 19declare function print(arg:any):string; 20function replace(a, b) 21{ 22 return a; 23} 24 25function doAsUintN(bits: number, b : bigint) { 26 return BigInt.asUintN(bits, b); 27} 28 29function tryDoAsUintNEmpty() { 30 try { 31 print(BigInt.asUintN()); 32 } catch(e) { 33 print(e); 34 } 35} 36 37function tryDoAsUintNSingle(a) { 38 try { 39 print(BigInt.asUintN(a)); 40 } catch(e) { 41 print(e); 42 } 43} 44 45function tryDoAsUintN(bits: number, b : bigint) { 46 try { 47 print(doAsUintN(bits, b)); 48 } catch(e) { 49 print(e); 50 } 51} 52 53function printAsUintN(bits: number, b : bigint) { 54 try { 55 print(doAsUintN(bits, b)); 56 } finally { 57 } 58} 59 60// Check standart behaviour 61// 25n = 00011001 62//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 63print(BigInt.asUintN(3, 25n)); //: 1 64//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 65print(BigInt.asUintN(4, 25n)); //: 9 66 67// Check without params 68tryDoAsUintNEmpty(); //: TypeError: Cannot convert a undefine or null value to a BigInt 69 70// Check with 1 param 71tryDoAsUintNSingle(15); //: TypeError: Cannot convert a undefine or null value to a BigInt 72tryDoAsUintNSingle(23n); //: TypeError: Cannot convert a BigInt value to a number 73 74// Check with 2 params 75// 100n = 01100100 76//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 77print(BigInt.asUintN(4, 100n)); //: 4 78 79// Check with 3 params 80//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 81print(BigInt.asUintN(8, 100n, undefined)); //: 100 82 83// Check with 4 params 84//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 85print(BigInt.asUintN(16, 100n, -20000, "abc")); //: 100 86 87// Check some corner cases 88//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 89print(BigInt.asUintN(0, 10000n)); //: 0 90//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 91print(BigInt.asUintN(32, 0n)); //: 0 92//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:#*#doAsUintN@builtinBigIntAsUintN 93//aot: [trace] Check Type: RangeError 94tryDoAsUintN(-2, 10000n); //: RangeError: integerIndex < 0 or integerIndex > SAFE_NUMBER 95//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:#*#doAsUintN@builtinBigIntAsUintN 96//aot: [trace] Check Type: RangeError 97tryDoAsUintN(2 ** 53, 100000n); //: RangeError: integerIndex < 0 or integerIndex > SAFE_NUMBER 98 99// bits > kMaxLengthBits => return bigint 100//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 101print(BigInt.asUintN(2 ** 35, 2n ** 75n)); //: 37778931862957161709568 102//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 103print(BigInt.asUintN(2 ** 35, 65531n)); //: 65531 104 105// Check maximum and minimum values 106const max32 = 2n ** 32n - 1n; // UINT32_MAX = 4294967295 107const max64 = 2n ** 64n - 1n; // UINT64_MAX = 18446744073709551615 108 109//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 110print(BigInt.asUintN(32, max32)); //: 4294967295 111//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 112print(BigInt.asUintN(32, max32 + 1n)); //: 0 113//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 114print(BigInt.asUintN(64, max64)); //: 18446744073709551615 115//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 116print(BigInt.asUintN(64, max64 + 1n)); //: 0 117//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 118print(BigInt.asUintN(32, -max32)); //: 1 119//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 120print(BigInt.asUintN(32, -max32 - 1n)); //: 0 121//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 122print(BigInt.asUintN(32, -max32 - 2n)); //: 4294967295 123//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 124print(BigInt.asUintN(64, -max64)); //: 1 125//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 126print(BigInt.asUintN(64, -max64 - 1n)); //: 0 127//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 128print(BigInt.asUintN(64, -max64 - 2n)); //: 18446744073709551615 129 130try { 131 const v10 = BigInt.asUintN(268435439, 127n) 132 const v11 = [7]; 133} catch(e) { 134 //aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 135 print("catch e") //: catch e 136} 137 138// Replace standard builtin 139let true_asUintN = BigInt.asUintN 140BigInt.asUintN = replace 141print(BigInt.asUintN(-1.001, 26n)); //: -1.001 142BigInt.asUintN = true_asUintN 143//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:#*#doAsUintN@builtinBigIntAsUintN 144printAsUintN(3, 25n); //: 1 145//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 146print(true_asUintN(3, 25n)); //: 1 147 148// Call standard builtin with non-number param 149//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:#*#doAsUintN@builtinBigIntAsUintN 150//aot: [trace] Check Type: NotNumber1 151tryDoAsUintN("abc", "abc"); //: SyntaxError: Cannot convert string to a BigInt,because not allow Infinity, decimal points, or exponents 152//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:#*#doAsUintN@builtinBigIntAsUintN 153//aot: [trace] Check Type: NotNumber1 154printAsUintN("3", 25n); //: 1 155 156if (ArkTools.isAOTCompiled(printAsUintN)) { 157 // Replace standard builtin after call to standard builtin was profiled 158 BigInt.asUintN = replace 159} 160 161printAsUintN(3, 25n); //pgo: 1 162//aot: [trace] Check Type: NotCallTarget1 163//aot: 3 164 165tryDoAsUintN("abc", "abc"); //pgo: SyntaxError: Cannot convert string to a BigInt,because not allow Infinity, decimal points, or exponents 166//aot: [trace] Check Type: NotCallTarget1 167//aot: abc 168 169BigInt.asUintN = true_asUintN 170 171// Check IR correctness inside try-block 172try { 173 //aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:#*#doAsUintN@builtinBigIntAsUintN 174 printAsUintN(3, 25n); //: 1 175 //aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:#*#doAsUintN@builtinBigIntAsUintN 176 //aot: [trace] Check Type: NotNumber1 177 printAsUintN("abc", "abc"); 178} catch (e) { 179} 180 181let obj = { 182 valueOf: () => { return 5; } 183}; 184 185// 25n = 00011001 186//aot: [trace] aot inline builtin: BigInt.asUintN, caller function name:func_main_0@builtinBigIntAsUintN 187//aot: [trace] Check Type: NotNumber1 188print(BigInt.asUintN(obj, 25n)); //: 25 189 190function Throwing() { 191 this.value = 5; 192} 193Throwing.prototype.valueOf = function() { 194 if (this.value < 0) { 195 throw new Error("negative bitness"); 196 } 197 return this.value; 198} 199let throwingObj = new Throwing(); 200 201try { 202 // 42n = 00101010 203 print(BigInt.asUintN(throwingObj, 42n)); //: 10 204 throwingObj.value = -8; 205 print(BigInt.asUintN(throwingObj, 42n)); 206} catch(e) { 207 print(e); //: Error: negative bitness 208} finally { 209 // 15n = 00001111 210 print(BigInt.asUintN(obj, 15n)); //: 15 211} 212