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