14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_cideclare interface ArkTools {
174514f5e3Sopenharmony_ci    isAOTCompiled(args: any): boolean;
184514f5e3Sopenharmony_ci}
194514f5e3Sopenharmony_cideclare function print(arg:any):string;
204514f5e3Sopenharmony_civar x = [1,2.1,-1,null,undefined,,false,NaN]
214514f5e3Sopenharmony_ci//aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:func_main_0@builtinArrayPop
224514f5e3Sopenharmony_ciprint(x.pop()) //: NaN
234514f5e3Sopenharmony_ci//aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:func_main_0@builtinArrayPop
244514f5e3Sopenharmony_ciprint(x.pop(undefined)) //: false
254514f5e3Sopenharmony_ci//aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:func_main_0@builtinArrayPop
264514f5e3Sopenharmony_ciprint(x.pop(1,2,3,4,5,6,7,8)) //: undefined
274514f5e3Sopenharmony_civar y = new Array(10)
284514f5e3Sopenharmony_cifor (let i = 0; i < y.length; i++) {
294514f5e3Sopenharmony_ci    y[i] = i
304514f5e3Sopenharmony_ci}
314514f5e3Sopenharmony_ci//aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:func_main_0@builtinArrayPop
324514f5e3Sopenharmony_ciprint(y.pop()) //: 9
334514f5e3Sopenharmony_ci//aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:func_main_0@builtinArrayPop
344514f5e3Sopenharmony_ciprint(y.pop(undefined)) //: 8
354514f5e3Sopenharmony_ci//aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:func_main_0@builtinArrayPop
364514f5e3Sopenharmony_ciprint(y.pop(1,2,3,4,5,6,7,8)) //: 7
374514f5e3Sopenharmony_ci
384514f5e3Sopenharmony_ci// Check inside try-block
394514f5e3Sopenharmony_citry {
404514f5e3Sopenharmony_ci  //aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:func_main_0@builtinArrayPop
414514f5e3Sopenharmony_ci  print(y.pop()) //: 6
424514f5e3Sopenharmony_ci} catch(e) { 
434514f5e3Sopenharmony_ci}
444514f5e3Sopenharmony_ci
454514f5e3Sopenharmony_cilet obj = {};
464514f5e3Sopenharmony_ciobj.valueOf = (() => { return 5; })
474514f5e3Sopenharmony_ci//aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:func_main_0@builtinArrayPop
484514f5e3Sopenharmony_ciprint(y.pop(obj)); //: 5
494514f5e3Sopenharmony_ci
504514f5e3Sopenharmony_cifunction Throwing() {
514514f5e3Sopenharmony_ci    this.value = 2;
524514f5e3Sopenharmony_ci    Throwing.prototype.valueOf = function() {
534514f5e3Sopenharmony_ci        if (this.value > 0) {
544514f5e3Sopenharmony_ci            throw new Error("positive");
554514f5e3Sopenharmony_ci        }
564514f5e3Sopenharmony_ci        return this.value;
574514f5e3Sopenharmony_ci    }
584514f5e3Sopenharmony_ci}
594514f5e3Sopenharmony_cilet throwingObj = new Throwing();
604514f5e3Sopenharmony_citry {
614514f5e3Sopenharmony_ci    //aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:func_main_0@builtinArrayPop
624514f5e3Sopenharmony_ci    print(y.pop(throwingObj)); //: 4
634514f5e3Sopenharmony_ci} catch(e) {
644514f5e3Sopenharmony_ci    print(e);
654514f5e3Sopenharmony_ci} finally {
664514f5e3Sopenharmony_ci    //aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:func_main_0@builtinArrayPop
674514f5e3Sopenharmony_ci    print(y.pop(obj)); //: 3
684514f5e3Sopenharmony_ci}
694514f5e3Sopenharmony_ci
704514f5e3Sopenharmony_ci// Replace standard builtin
714514f5e3Sopenharmony_cifunction replace(a : any) {
724514f5e3Sopenharmony_ci  return a;
734514f5e3Sopenharmony_ci}
744514f5e3Sopenharmony_ci
754514f5e3Sopenharmony_cilet newArr = [1, 2, NaN]
764514f5e3Sopenharmony_cilet true_pop = newArr.pop
774514f5e3Sopenharmony_cinewArr.pop = replace
784514f5e3Sopenharmony_ci
794514f5e3Sopenharmony_ciprint(newArr.pop(undefined)); //: undefined
804514f5e3Sopenharmony_cinewArr.pop = true_pop
814514f5e3Sopenharmony_ci//aot: [trace] Check Type: BuiltinInstanceHClassMismatch
824514f5e3Sopenharmony_ciprint(newArr.pop(undefined)); //: NaN
834514f5e3Sopenharmony_ci
844514f5e3Sopenharmony_ci
854514f5e3Sopenharmony_cifunction doPop(x: any): any {
864514f5e3Sopenharmony_ci  return newArr.pop(x);
874514f5e3Sopenharmony_ci}
884514f5e3Sopenharmony_ci
894514f5e3Sopenharmony_cifunction printPop(x: any) {
904514f5e3Sopenharmony_ci  try {
914514f5e3Sopenharmony_ci      print(doPop(x));
924514f5e3Sopenharmony_ci  } finally {
934514f5e3Sopenharmony_ci  }
944514f5e3Sopenharmony_ci}
954514f5e3Sopenharmony_ci
964514f5e3Sopenharmony_ciif (ArkTools.isAOTCompiled(printPop)) {
974514f5e3Sopenharmony_ci  // Replace standard builtin after call to standard builtin was profiled
984514f5e3Sopenharmony_ci  newArr.pop = replace
994514f5e3Sopenharmony_ci}
1004514f5e3Sopenharmony_ciprintPop(-1); //pgo: 2
1014514f5e3Sopenharmony_ci//aot: [trace] Check Type: NotCallTarget1
1024514f5e3Sopenharmony_ci//aot: -1
1034514f5e3Sopenharmony_ci
1044514f5e3Sopenharmony_ciprintPop("abc"); //pgo: 1
1054514f5e3Sopenharmony_ci//aot: [trace] Check Type: NotCallTarget1
1064514f5e3Sopenharmony_ci//aot: abc
1074514f5e3Sopenharmony_ci
1084514f5e3Sopenharmony_cinewArr.pop = true_pop
1094514f5e3Sopenharmony_ci
1104514f5e3Sopenharmony_cifunction popCase1() {
1114514f5e3Sopenharmony_ci  print('case 1 pop') //: case 1 pop
1124514f5e3Sopenharmony_ci  let arr1 = [1, 2]
1134514f5e3Sopenharmony_ci  let arr2 = [1, 2]
1144514f5e3Sopenharmony_ci  arr2.garbage = function(x: any): any {
1154514f5e3Sopenharmony_ci      return undefined;
1164514f5e3Sopenharmony_ci  }
1174514f5e3Sopenharmony_ci  //aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:#*#popCase1@builtinArrayPop
1184514f5e3Sopenharmony_ci  print(arr1.pop()); //: 2
1194514f5e3Sopenharmony_ci  print(arr2.pop()); //aot: [trace] Check Type: BuiltinInstanceHClassMismatch
1204514f5e3Sopenharmony_ci                     //: 2
1214514f5e3Sopenharmony_ci}
1224514f5e3Sopenharmony_cipopCase1()
1234514f5e3Sopenharmony_ci
1244514f5e3Sopenharmony_ci
1254514f5e3Sopenharmony_cifunction popCase2() {
1264514f5e3Sopenharmony_ci  print('case 2 pop') //: case 2 pop
1274514f5e3Sopenharmony_ci  let arr1 = [1, 2]
1284514f5e3Sopenharmony_ci  let arr2 = [1, 2]
1294514f5e3Sopenharmony_ci  arr2.pop = function(x: any) {
1304514f5e3Sopenharmony_ci      return x
1314514f5e3Sopenharmony_ci  }
1324514f5e3Sopenharmony_ci
1334514f5e3Sopenharmony_ci  //aot: [trace] aot inline builtin: Object.getPrototypeOf, caller function name:#*#popCase2@builtinArrayPop
1344514f5e3Sopenharmony_ci  print(Object.getPrototypeOf(arr2) === Array.prototype) //: true
1354514f5e3Sopenharmony_ci
1364514f5e3Sopenharmony_ci  //aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:#*#popCase2@builtinArrayPop
1374514f5e3Sopenharmony_ci  print(arr1.pop(1)); //: 2
1384514f5e3Sopenharmony_ci  print(arr2.pop(1)); //: 1
1394514f5e3Sopenharmony_ci}
1404514f5e3Sopenharmony_cipopCase2()
1414514f5e3Sopenharmony_ci
1424514f5e3Sopenharmony_ci
1434514f5e3Sopenharmony_cifunction popCase3() {
1444514f5e3Sopenharmony_ci  print('case 3 pop') //: case 3 pop
1454514f5e3Sopenharmony_ci  let marr = [1, 2]
1464514f5e3Sopenharmony_ci  let true_pop = marr.pop
1474514f5e3Sopenharmony_ci  let mimicArray = {
1484514f5e3Sopenharmony_ci      pop: true_pop,
1494514f5e3Sopenharmony_ci  }
1504514f5e3Sopenharmony_ci
1514514f5e3Sopenharmony_ci  //aot: [trace] aot inline builtin: Array.prototype.pop, caller function name:#*#popCase3@builtinArrayPop
1524514f5e3Sopenharmony_ci  print(marr.pop(500)); //: 2
1534514f5e3Sopenharmony_ci  Object.setPrototypeOf(marr, mimicArray)
1544514f5e3Sopenharmony_ci
1554514f5e3Sopenharmony_ci  //aot: [trace] Check Type: BuiltinInstanceHClassMismatch
1564514f5e3Sopenharmony_ci  print(marr.pop()); //: 1
1574514f5e3Sopenharmony_ci}
1584514f5e3Sopenharmony_cipopCase3()
1594514f5e3Sopenharmony_ci
1604514f5e3Sopenharmony_ci
1614514f5e3Sopenharmony_cifunction popCase4() {
1624514f5e3Sopenharmony_ci  print('case 4 pop') //: case 4 pop
1634514f5e3Sopenharmony_ci  let arr1 = [1, 2]
1644514f5e3Sopenharmony_ci  let arr2 = [1, 2]
1654514f5e3Sopenharmony_ci  let notArray = {
1664514f5e3Sopenharmony_ci      pop(x: any) {
1674514f5e3Sopenharmony_ci          return -100
1684514f5e3Sopenharmony_ci      }
1694514f5e3Sopenharmony_ci  }
1704514f5e3Sopenharmony_ci  Object.setPrototypeOf(arr2, notArray)
1714514f5e3Sopenharmony_ci
1724514f5e3Sopenharmony_ci  //aot: [trace] Check Type: NotStableArray1
1734514f5e3Sopenharmony_ci  print(arr1.pop(1)); //: 2
1744514f5e3Sopenharmony_ci  print(arr2.pop(1)); //: -100
1754514f5e3Sopenharmony_ci}
1764514f5e3Sopenharmony_cipopCase4()
1774514f5e3Sopenharmony_ci
1784514f5e3Sopenharmony_ci
1794514f5e3Sopenharmony_cifunction popCase5() {
1804514f5e3Sopenharmony_ci  print('case 5 pop') //: case 5 pop
1814514f5e3Sopenharmony_ci  let arr1 = [1, 2]
1824514f5e3Sopenharmony_ci  Array.prototype.pop = function(x: any) {
1834514f5e3Sopenharmony_ci      return x
1844514f5e3Sopenharmony_ci  }
1854514f5e3Sopenharmony_ci
1864514f5e3Sopenharmony_ci  //aot: [trace] Check Type: NotStableArray1
1874514f5e3Sopenharmony_ci  print(arr1.pop(1)); //: 1
1884514f5e3Sopenharmony_ci}
1894514f5e3Sopenharmony_cipopCase5()
190