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