• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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