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