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