| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- var actuals = new Array();
- var hasAllPassed = true;
- function verify(expected, testCase)
- {
- if(actuals.toString() != expected.toString())
- {
- print(testCase + " failed.");
- print("ACTUALS:");
- for(var item = 0; item < actuals.length; actuals++)
- {
- print(actuals[item]);
- }
- print("EXPECTED");
- for(var item = 0; item < expected.length; expected++)
- {
- print(expected[item]);
- }
- hasAllPassed = false;
- }
- actuals = [];
- }
- //Test1 : Tests Optimization with bailout.
- var shouldBailout = false;
- var test1 = function (argMath3)
- {
- if(shouldBailout)
- {
- arguments[0] = 4;
- for(var o in arguments)
- {
- actuals.push(o);
- }
- }
- actuals.push(argMath3);
- };
- test1(10,2); // Interpreter
- shouldBailout = true;
- test1(10,2); // full jit
- verify([10,0,1,4], "TEST 1");
- //Test2: Test Inlinee Arguments optimization with StackArgsWithFormals
- var inner_test2 = function(argMath6=1) {
- return argMath6;
- };
- function test2(a,b,c) {
- return inner_test2.apply({}, arguments);
- }
- actuals.push(test2(1,2,3));
- actuals.push(test2(4,5,6));
- verify([1,4], "TEST 2");
- //Test3: Non Simple Parameter List
- function test3(a, b =2, c = 5)
- {
- if(shouldBailout)
- {
- arguments[2] = 10;
- var result = arguments[2] + a;
- actuals.push(result);
- return;
- }
- actuals.push(a+b+arguments[1]);
- }
- shouldBailout = false;
- test3(1,2,3,4);
- test3(5,6,7,8);
- shouldBailout = true;
- test3(10,11,12,14);
- verify([5,17,20], "TEST 3");
- //Test4: With Rest argument
- function test4(a,b,c,d,e) {
- inner_test4(a,b,c,d);
- }
- var inner_test4 = function (a, b, ...argArr0) {
- if (arguments.length > 1) {
- actuals.push(a + b);
- actuals.push(argArr0[0])
- }
- };
-
- test4(1,2,3,4);
- test4(5,6,7,8);
- verify([3,3,11,7], "TEST 4");
- //Test5: Inside Loop and Bails out due to out of range of actuals access
- function test5(a,b,c=10)
- {
- var result = 0;
- for(var i = 0; i < 5; i++)
- {
- result += arguments[i];
- }
- result += (a+c);
- actuals.push(result);
- }
- test5(1,2,3,4,5,6);
- test5(1,2,3);// Bail out here.
- verify([19, NaN], "TEST 5");
- //Test6 : Using strict mode
- function test6(a,b,c)
- {
- 'use strict';
- actuals.push(arguments[0] + arguments[2] + a + b);
- }
- test6(1,2,3);
- test6(4,5,6,7);
- verify([7,19], "TEST 6");
- //Test7 : Use strict with bail out
- function test7(a,b,c)
- {
- 'use strict';
- if(shouldBailout)
- {
- arguments[0] = 4;
- }
- actuals.push(a);
- }
- shouldBailout = false;
- test7(11,12,13);
- shouldBailout = true;
- test7(10,20,30);
- verify([11,10], "TEST 7");
- //Test 8 : for-in statement
- function test8(a,b)
- {
- for(a in [10,20])
- {
- actuals.push(a);
- actuals.push(arguments[0]);
- }
- }
- test8(1,2);
- test8('x','y');
- verify([0,0,1,1,0,0,1,1], "TEST 8");
- //Test 9 : Array Destructuring.
- function test9(a,b)
- {
- [a,b] = [10,20];
- actuals.push(a + arguments[0]);
- }
- test9(1,2);
- test9('x','y');
- verify([20,20], "TEST 9");
- //Test 10 : Object Destructuring.
- function test10(a,b)
- {
- ({a:a} = {a:10.5})
- actuals.push(a + arguments[0]);
- }
- test10(1,2);
- test10('x','y');
- verify([21,21], "TEST 10");
- //Test 11 : for-of statement
- function test11(a,b)
- {
- for([a] of [[10],[20]])
- {
- actuals.push(a + arguments[0]);
- }
- }
- test11(1,2);
- test11('x','y');
- verify([20,40,20,40], "TEST 11");
- var obj12 = { method1: function () {} };
- function test12_1(arg1) {
- this.prop1 = arg1;
- obj12.method1.apply(obj12, arguments);
- }
- function test12() {
- new test12_1(-{});
- }
- test12();
- test12();
- verify([], "TEST 12");
- function test13(a) {
- actuals.push(typeof arguments[1]);
- }
- test13(1,2);
- test13({}, {});
- verify(["number", "object"], "TEST 13");
- function test14(a) {
- actuals.push(arguments[1]);
- function test14_nested1()
- {
- }
- }
- test14(1,2);
- test14(4,5);
- verify([2,5], "TEST 14");
- function test15(a){
- actuals.push(arguments[0])
- var b = 10;
- function test15_nested1()
- {
- actuals.push(b);
- };
- test15_nested1();
- }
- test15(1);
- test15(2);
- verify([1, 10, 2, 10], "TEST 15");
- function test16(a,b){
- var c = 10;
- if(shouldBailout)
- {
- actuals.push(arguments[1]);
- }
- actuals.push(c);
- function test16_nested1()
- {
- }
- }
- shouldBailout = false;
- test16(1,2);
- shouldBailout = true;
- test16(3,4);
- verify([10, 4, 10], "TEST 16");
- function test17(a){
- var b = 20;
- actuals.push(arguments[0.1*10]);
-
- function test17_nested1(){
- actuals.push(b);
- }
- test17_nested1();
- }
- test17(1);
- test17(2);
- verify([undefined, 20, undefined, 20], "TEST 17");
- function test18()
- {
- eval('function inner(a,...b) {actuals.push(a + arguments[0]);}; inner(1,2); inner(3,4);');
- }
- test18();
- verify([2, 6], "TEST18");
- function test19(a, b)
- {
- 'use strict';
- b++;
- actuals.push(arguments[0] + b);
- }
- test19(1, 2);
- test19(3, 4);
- verify([4, 8], "TEST 19");
- function test20(v16) {
- while ({}.prop0) {
- var v17 = 0;
- function test20_inner() {
- v17;
- }
- arguments;
- }
- }
- test20();
- test20();
- if(hasAllPassed)
- {
- print("PASSED");
- }
|