• 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;
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
175//aot: [trace] aot call builtin: Array.prototype.indexOf, caller function name:func_main_0@builtinArrayIndexOf
176print(specialArray.indexOf()) //: 4
177//aot: [trace] aot inline builtin: Array.prototype.indexOf, caller function name:func_main_0@builtinArrayIndexOf
178print(specialArray.indexOf(() => {})) //: -1
179//aot: [trace] aot inline builtin: Array.prototype.indexOf, caller function name:func_main_0@builtinArrayIndexOf
180print(specialArray.indexOf(true, 2000000)) //: -1
181//aot: [trace] aot inline builtin: Array.prototype.indexOf, caller function name:func_main_0@builtinArrayIndexOf
182print(specialArray.indexOf(true, -2000000)) //: 3
183//aot: [trace] aot inline builtin: Array.prototype.indexOf, caller function name:func_main_0@builtinArrayIndexOf
184print(specialArray.indexOf(true, -1)) //: -1
185//aot: [trace] aot inline builtin: Array.prototype.indexOf, caller function name:func_main_0@builtinArrayIndexOf
186print(specialArray.indexOf(5, 5, 78)) //: 9
187
188function notIntIndex() {
189  let specialArray = [1, 2, NaN]
190  //aot: [trace] Check Type: IndexNotInt
191  print(specialArray.indexOf(false, "str")) //: -1
192}
193notIntIndex()
194
195// Check inside try-block
196try {
197  //aot: [trace] aot inline builtin: Array.prototype.indexOf, caller function name:func_main_0@builtinArrayIndexOf
198  print(specialArray.indexOf(null)) //: 0
199} catch(e) {
200}
201
202let obj = {};
203obj.valueOf = (() => { return 5; })
204//aot: [trace] aot inline builtin: Array.prototype.indexOf, caller function name:func_main_0@builtinArrayIndexOf
205print(specialArray.indexOf(obj)); //: -1
206
207function Throwing() {
208    this.value = 2;
209    Throwing.prototype.valueOf = function() {
210        if (this.value > 0) {
211            throw new Error("positive");
212        }
213        return this.value;
214    }
215}
216let throwingObj = new Throwing();
217try {
218    //aot: [trace] aot inline builtin: Array.prototype.indexOf, caller function name:func_main_0@builtinArrayIndexOf
219    print(specialArray.indexOf(throwingObj)); //: -1
220} catch(e) {
221    print(e);
222} finally {
223    //aot: [trace] aot inline builtin: Array.prototype.indexOf, caller function name:func_main_0@builtinArrayIndexOf
224    print(specialArray.indexOf(obj)); //: -1
225}
226
227//===========deopt type
228function prototypeChange(){
229  let tArray = [1,,3]
230  Array.prototype[1] = 2
231  print(tArray.indexOf(2))
232}
233//aot: [trace] Check Type: NotStableArray1
234prototypeChange() //: 1
235function lengthChange(){
236    let tArray = [1,,3]
237    tArray.length = 2
238    print(tArray.indexOf(3))
239}
240//aot: [trace] Check Type: NotStableArray1
241lengthChange() //: -1
242
243
244// Replace standard builtin
245function replace(a : any) {
246  return a;
247}
248
249let newArr = [1, 2, NaN]
250let true_indexOf = newArr.indexOf
251newArr.indexOf = replace
252
253print(newArr.indexOf(undefined)); //: undefined
254newArr.indexOf = true_indexOf
255//aot: [trace] Check Type: BuiltinInstanceHClassMismatch
256print(newArr.indexOf(undefined)); //: -1
257
258
259function doIndexOf(x: any): any {
260  return newArr.indexOf(x);
261}
262
263function printIndexOf(x: any) {
264  try {
265      print(doIndexOf(x));
266  } finally {
267  }
268}
269
270if (ArkTools.isAOTCompiled(printIndexOf)) {
271  // Replace standard builtin after call to standard builtin was profiled
272  newArr.indexOf = replace
273}
274printIndexOf(2); //pgo: 1
275//aot: [trace] Check Type: NotCallTarget1
276//aot: 2
277
278printIndexOf("abc"); //pgo: -1
279//aot: [trace] Check Type: NotCallTarget1
280//aot: abc
281
282newArr.indexOf = true_indexOf
283
284function indexOfCase1() {
285  print('case 1 indexOf') //: case 1 indexOf
286  let arr1 = [1, 2]
287  let arr2 = [1, 2]
288  arr2.garbage = function(x: any): any {
289      return undefined;
290  }
291  //aot: [trace] Check Type: NotStableArray1
292  print(arr1.indexOf(1)); //: 0
293  print(arr2.indexOf(2)); //: 1
294}
295indexOfCase1()
296
297
298function indexOfCase2() {
299  print('case 2 indexOf') //: case 2 indexOf
300  let arr1 = [1, 2]
301  let arr2 = [1, 2]
302  arr2.indexOf = function(x: any) {
303      return x
304  }
305
306  //aot: [trace] aot inline builtin: Object.getPrototypeOf, caller function name:#*#indexOfCase2@builtinArrayIndexOf
307  print(Object.getPrototypeOf(arr2) === Array.prototype) //: true
308
309  //aot: [trace] Check Type: NotStableArray1
310  print(arr1.indexOf(1)); //: 0
311  print(arr2.indexOf(1)); //: 1
312}
313indexOfCase2()
314
315
316function indexOfCase3() {
317  print('case 3 indexOf') //: case 3 indexOf
318  let marr = [1, 2]
319  let true_indexOf = marr.indexOf
320  let mimicArray = {
321      indexOf: true_indexOf,
322  }
323
324  //aot: [trace] Check Type: NotStableArray1
325  print(marr.indexOf(500)); //: -1
326  Object.setPrototypeOf(marr, mimicArray)
327
328  print(marr.indexOf(500)); //: -1
329}
330indexOfCase3()
331
332
333function indexOfCase4() {
334  print('case 4 indexOf') //: case 4 indexOf
335  let arr1 = [1, 2]
336  let arr2 = [1, 2]
337  let notArray = {
338      indexOf(x: any) {
339          return -100
340      }
341  }
342  //aot: [trace] aot call builtin: Object.SetPrototypeOf, caller function name:#*#indexOfCase4@builtinArrayIndexOf
343  Object.setPrototypeOf(arr2, notArray)
344
345  //aot: [trace] Check Type: NotStableArray1
346  print(arr1.indexOf(1)); //: 0
347  print(arr2.indexOf(1)); //: -100
348}
349indexOfCase4()
350
351
352function indexOfCase5() {
353  print('case 5 indexOf') //: case 5 indexOf
354  let arr1 = [1, 2]
355  Array.prototype.indexOf = function(x: any) {
356      return x
357  }
358
359  //aot: [trace] Check Type: NotStableArray1
360  print(arr1.indexOf(1)); //: 1
361}
362indexOfCase5()
363