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;
20//int array
21let literalIntArrayWithHole = [0,,2,,4,,]
22let literalIntArrayNoHole = [0,1,2,3,4,5,6]
23let nIntArray = new Array(6)
24nIntArray[0] = 0
25nIntArray[2] = 2
26nIntArray[4] = 4
27function returnDoubleTypeIntNotConstant(x){
28  if (x>0){
29    return 3.5+0.5
30  } else {
31    return 1.5+0.5
32  }
33}
34//double array
35let literalDoubleArrayWithHole = [0.5,,2.5,,4.5,,NaN,,]
36function returnNotConstantDouble(x){
37  if (x>0){
38    return 4+0.5
39  } else {
40    return 2+0.5
41  }
42}
43let nDoubleArray = new Array(7)
44nDoubleArray[1] = 1.5
45nDoubleArray[4] = 4.5
46nDoubleArray[6] = NaN
47//string array
48let literalStringArrayWithHole = ["string1",,"string2",,"string4",,]
49let nStringArray = new Array(5)
50nStringArray[1] = "1"
51nStringArray[4] = "4"
52function returnNotLitaralString(x){
53  if (x>0){
54    return "string" + "4"
55  } else {
56    return "string4"
57  }
58}
59//object array
60let find1 = {1:1}
61class findClass{
62  x;
63  constructor(x){
64    this.x = x
65  }
66}
67let find3 = new findClass(3)
68let find5 = new Date()
69let objArrayWithHoleNeverFind = [{0:0},,{2:2},,{4:4},,]
70let objnewArraywithHoleNeverFind = new Array(7)
71objnewArraywithHoleNeverFind[0] = {0:0}
72objnewArraywithHoleNeverFind[2] = {2:2}
73objnewArraywithHoleNeverFind[4] = {4:4}
74
75let objArrayWithHoleCanFind = [,find1,,find3,,find5,]
76let objnewArraywithHoleCanFind = new Array(7)
77objnewArraywithHoleCanFind[1] = find1
78objnewArraywithHoleCanFind[3] = find3
79objnewArraywithHoleCanFind[5] = find5
80//====================start nomarl kind test=================//
81//includes int
82//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
83print(literalIntArrayWithHole.includes(4)) //: true
84//aot: [trace] aot inline function name: #*#returnDoubleTypeIntNotConstant@builtinArrayIncludes caller function name: func_main_0@builtinArrayIncludes
85//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
86print(literalIntArrayWithHole.includes(returnDoubleTypeIntNotConstant(1))) //: true
87//aot: [trace] aot inline function name: #*#returnDoubleTypeIntNotConstant@builtinArrayIncludes caller function name: func_main_0@builtinArrayIncludes
88//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
89print(literalIntArrayWithHole.includes(returnDoubleTypeIntNotConstant(0))) //: true
90//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
91print(nIntArray.includes(4)) //: true
92//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
93print(nIntArray.includes(undefined)) //: true
94//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
95print(literalIntArrayWithHole.includes(undefined)) //: true
96//nohole hole
97//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
98print(literalIntArrayNoHole.includes(4)) //: true
99//aot: [trace] aot inline function name: #*#returnDoubleTypeIntNotConstant@builtinArrayIncludes caller function name: func_main_0@builtinArrayIncludes
100//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
101print(literalIntArrayNoHole.includes(returnDoubleTypeIntNotConstant(1))) //: true
102//aot: [trace] aot inline function name: #*#returnDoubleTypeIntNotConstant@builtinArrayIncludes caller function name: func_main_0@builtinArrayIncludes
103//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
104print(literalIntArrayNoHole.includes(returnDoubleTypeIntNotConstant(0))) //: true
105//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
106print(literalIntArrayNoHole.includes(undefined)) //: false
107//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
108print(literalIntArrayNoHole.includes(NaN)) //: false
109//includes double
110//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
111print(literalDoubleArrayWithHole.includes(4.5)) //: true
112//aot: [trace] aot inline function name: #*#returnNotConstantDouble@builtinArrayIncludes caller function name: func_main_0@builtinArrayIncludes
113//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
114print(literalDoubleArrayWithHole.includes(returnNotConstantDouble(1))) //: true
115//aot: [trace] aot inline function name: #*#returnNotConstantDouble@builtinArrayIncludes caller function name: func_main_0@builtinArrayIncludes
116//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
117print(literalDoubleArrayWithHole.includes(returnNotConstantDouble(0))) //: true
118//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
119print(nDoubleArray.includes(4.5)) //: true
120//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
121print(nDoubleArray.includes(NaN)) //: true
122//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
123print(literalDoubleArrayWithHole.includes(undefined)) //: true
124//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
125print(literalIntArrayNoHole.includes(literalIntArrayNoHole.length)) //: false
126
127//includes string
128//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
129print(literalStringArrayWithHole.includes("string4")) //: true
130//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
131print(literalStringArrayWithHole.includes(returnNotLitaralString(1))) //: true
132//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
133print(literalStringArrayWithHole.includes(returnNotLitaralString(0))) //: true
134//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
135print(nStringArray.includes("4")) //: true
136//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
137print(nStringArray.includes(undefined)) //: true
138
139//neverequal
140//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
141print(objArrayWithHoleNeverFind.includes({4:4})) //: false
142//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
143print(objnewArraywithHoleNeverFind.includes({4:4})) //: false
144//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
145print(objnewArraywithHoleNeverFind.includes(undefined)) //: true
146//can find
147//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
148print(objArrayWithHoleCanFind.includes(find1)) //: true
149//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
150print(objArrayWithHoleCanFind.includes(find3)) //: true
151//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
152print(objArrayWithHoleCanFind.includes(find5)) //: true
153//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
154print(objnewArraywithHoleCanFind.includes(find1)) //: true
155//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
156print(objnewArraywithHoleCanFind.includes(find3)) //: true
157//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
158print(objnewArraywithHoleCanFind.includes(find5)) //: true
159
160//============special test
161//aot: [trace] aot inline builtin: BigInt, caller function name:func_main_0@builtinArrayIncludes
162let specialArray = [null, , false, true, undefined, +0, -0, BigInt(123456), NaN, 5, 5.5]
163//includes use samevaluezero
164//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
165print(specialArray.includes(NaN)) //: true
166//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
167print(specialArray.includes(undefined, 3)) //: true
168//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
169print(specialArray.includes(undefined)) //: true
170//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
171print(specialArray.includes(NaN)) //: true
172//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
173print(specialArray.includes(+0)) //: true
174//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
175print(specialArray.includes(-0)) //: true
176//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
177print(specialArray.includes(false)) //: true
178//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
179print(specialArray.includes(true)) //: true
180//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
181print(specialArray.includes(null)) //: true
182//aot: [trace] aot inline builtin: BigInt, caller function name:func_main_0@builtinArrayIncludes
183//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
184print(specialArray.includes(BigInt(123456))) //: true
185//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
186print(specialArray.includes(5)) //: true
187//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
188print(specialArray.includes(5.5)) //: true
189
190print('unusual cases') //: unusual cases
191print(specialArray.includes()) //: true
192//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
193print(specialArray.includes(() => {})) //: false
194//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
195print(specialArray.includes(NaN, 0)) //: true
196//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
197print(specialArray.includes(NaN, 2000000)) //: false
198//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
199print(specialArray.includes(NaN, -2000000)) //: true
200//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
201print(specialArray.includes(NaN, -1)) //: false
202//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
203print(specialArray.includes(5, 5, 78)) //: true
204
205function notIntIndex() {
206  let specialArray = [1, 2, NaN]
207  //aot: [trace] Check Type: IndexNotInt
208  print(specialArray.includes(false, "str")) //: false
209}
210notIntIndex()
211
212// Check inside try-block
213try {
214  //aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
215  print(specialArray.includes(null)) //: true
216} catch(e) { 
217}
218
219let obj = {};
220obj.valueOf = (() => { return 5; })
221//aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
222print(specialArray.includes(obj)); //: false
223
224function Throwing() {
225    this.value = 2;
226    Throwing.prototype.valueOf = function() {
227        if (this.value > 0) {
228            throw new Error("positive");
229        }
230        return this.value;
231    }
232}
233let throwingObj = new Throwing();
234try {
235    //aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
236    print(specialArray.includes(throwingObj)); //: false
237} catch(e) {
238    print(e);
239} finally {
240    //aot: [trace] aot inline builtin: Array.prototype.includes, caller function name:func_main_0@builtinArrayIncludes
241    print(specialArray.includes(obj)); //: false
242}
243
244//===========deopt type
245function prototypeChange(){
246  let tArray = [1,,3]
247  Array.prototype[1] = 2
248  print(tArray.includes(2))
249}
250//aot: [trace] Check Type: NotStableArray1
251prototypeChange() //: true
252function lengthChange(){
253    let tArray = [1,,3]
254    tArray.length = 2
255    print(tArray.includes(3))
256}
257//aot: [trace] Check Type: NotStableArray1
258lengthChange() //: false
259
260
261// Replace standard builtin
262function replace(a : any) {
263  return a;
264}
265
266let newArr = [1, 2, NaN]
267let true_includes = newArr.includes
268newArr.includes = replace
269
270print(newArr.includes(undefined)); //: undefined
271newArr.includes = true_includes
272print(newArr.includes(undefined)); //: false
273
274
275function doIncludes(x: any): any {
276  return newArr.includes(x);
277}
278
279function printIncludes(x: any) {
280  try {
281      print(doIncludes(x));
282  } finally {
283  }
284}
285
286if (ArkTools.isAOTCompiled(printIncludes)) {
287  // Replace standard builtin after call to standard builtin was profiled
288  newArr.includes = replace
289}
290printIncludes(2.5); //pgo: false
291//aot: [trace] Check Type: NotCallTarget1
292//aot: 2.5
293
294printIncludes("abc"); //pgo: false
295//aot: [trace] Check Type: NotCallTarget1
296//aot: abc
297
298newArr.includes = true_includes
299
300function includesCase1() {
301  print('case 1 includes') //: case 1 includes
302  let arr1 = [1, 2]
303  let arr2 = [1, 2]
304  arr2.garbage = function(x: any): any {
305      return undefined;
306  }
307  //aot: [trace] Check Type: NotStableArray1
308  print(arr1.includes(1)); //: true
309  print(arr2.includes(2)); //: true
310}
311includesCase1()
312
313
314function includesCase2() {
315  print('case 2 includes') //: case 2 includes
316  let arr1 = [1, 2]
317  let arr2 = [1, 2]
318  arr2.includes = function(x: any) {
319      return x
320  }
321
322  //aot: [trace] aot inline builtin: Object.getPrototypeOf, caller function name:#*#includesCase2@builtinArrayIncludes
323  print(Object.getPrototypeOf(arr2) === Array.prototype) //: true
324
325  //aot: [trace] Check Type: NotStableArray1
326  print(arr1.includes(1)); //: true
327  print(arr2.includes(1)); //: 1
328}
329includesCase2()
330
331
332function includesCase3() {
333  print('case 3 includes') //: case 3 includes
334  let marr = [1, 2]
335  let true_includes = marr.includes
336  let mimicArray = {
337      includes: true_includes,
338  }
339
340  //aot: [trace] Check Type: NotStableArray1
341  print(marr.includes(500)); //: false
342  Object.setPrototypeOf(marr, mimicArray)
343
344  print(marr.includes(500)); //: false
345}
346includesCase3()
347
348
349function includesCase4() {
350  print('case 4 includes') //: case 4 includes
351  let arr1 = [1, 2]
352  let arr2 = [1, 2]
353  let notArray = {
354      includes(x: any) {
355          return -100
356      }
357  }
358  Object.setPrototypeOf(arr2, notArray)
359
360  //aot: [trace] Check Type: NotStableArray1
361  print(arr1.includes(1)); //: true
362  print(arr2.includes(1)); //: -100
363}
364includesCase4()
365
366
367function includesCase5() {
368  print('case 5 includes') //: case 5 includes
369  let arr1 = [1, 2]
370  Array.prototype.includes = function(x: any) {
371      return x
372  }
373
374  //aot: [trace] Check Type: NotStableArray1
375  print(arr1.includes(1)); //: 1
376}
377includesCase5()
378