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