| //------------------------------------------------------------------------------------------------------- | |
| // Copyright (C) Microsoft. All rights reserved. | |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
| //------------------------------------------------------------------------------------------------------- | |
| // WinBlue 266843 | |
| // -debuglaunch -targeted -maxinterpretcount:1 | |
| // Test #0: issue in the bug: shared bailout does not support conditional branch instrs, | |
| // such as branch with BailOnImplicitCalls. | |
| var shouldBailout = false; | |
| function test0() { | |
| var obj1 = {}; | |
| var arrObj0 = {}; | |
| var func0 = function (argObj0) { | |
| var __loopvar4 = 0; | |
| do { | |
| __loopvar4++; | |
| } while (((shouldBailout ? (this.prop1 = { | |
| valueOf : function () { | |
| WScript.Echo('this.prop1 valueOf'); | |
| return 3; | |
| } | |
| }, 1) : 1)) && __loopvar4 < 3) | |
| var __loopvar3 = 0; | |
| for (; obj1.prop1 < (1); __loopvar3++ + obj1.prop1++) { | |
| if (__loopvar3 > 3) | |
| break; | |
| } | |
| } | |
| arrObj0.method0 = func0; | |
| obj0 = obj1; | |
| arrObj0.method0.call(obj0, 1); | |
| }; | |
| test0(); | |
| shouldBailout = true; | |
| test0(); | |
| // Test #1: a variation of the issue from the bug. | |
| function test1() { | |
| var obj0 = {}; | |
| var obj1 = {}; | |
| var arrObj0 = {}; | |
| var func1 = function () { | |
| if ((obj0.prop1 >= arrObj0.length)) | |
| { | |
| } | |
| else { | |
| return f; | |
| } | |
| ary.pop(); | |
| } | |
| var ary = new Array(10); | |
| var f = 1; | |
| var __loopvar0 = 0; | |
| do { | |
| __loopvar0++; | |
| func1(obj0); | |
| obj1.prop0 = (obj0.prop1 = { | |
| valueOf : function () { | |
| return 3; | |
| } | |
| }, 1); | |
| } while ((1) && __loopvar0 < 3) | |
| WScript.Echo("ary.length = " + ary.length); | |
| }; | |
| test1(); | |
| // Test #2: make sure that hoisting of (only) aux bailout on AND works correctly. | |
| function test2() | |
| { | |
| var obj0 = {}; | |
| obj0.method0 = function() {}; | |
| var __loopvar1 = 1; | |
| do | |
| { | |
| obj0.method0(2147483647 & 1); | |
| } | |
| while(__loopvar1 < 1) | |
| } | |
| test2(); | |
| test2(); | |
| // Test #3: variation of test2. | |
| // Generating IgnoreException bailout shared with implicit calls bailout for the case | |
| // when implicit calls bailout is not inside helper block. | |
| function test3() | |
| { | |
| var obj1 = {}; | |
| var loopvar = 0; | |
| function func1() | |
| { | |
| while (loopvar < 1 && obj1.length < new Object()) | |
| { | |
| obj1.length; | |
| ++loopvar; | |
| } | |
| } | |
| func1(); | |
| } | |
| test3(); | |
| test3(); | |
| // Test for shared implicit call + ignore exception bailout on LdFld. | |
| // This was AV'ing on ARM because prevInstr in LowerLdFld was set to ldFldInstr which | |
| // got removed as part of generating shared bailout. | |
| function test4() | |
| { | |
| var arrObj0 = {}; | |
| var func0 = function() {}; | |
| func0(arrObj0); | |
| }; | |
| test4(); | |
| test4(); | |
| // Test for change to convert all throwing helpers to dubegger bailout instrs, | |
| // for the case when there is typeof (which converts to helper with IgnoreException bailout) | |
| // following by a branch: we generate fast bracn and lower typeof which is prev instr as part | |
| // of lowering the branch, rather then lowering it inside LowerRange. | |
| function test5() | |
| { | |
| function func1() {} | |
| var ary = new Array(10); | |
| var obj1 = {}; | |
| var func0 = function(argArr91,argMath92){} | |
| function leaf() { return 100; }; | |
| var arrObj0 = {}; | |
| var obj0 = {}; | |
| func1(obj1, leaf, ((arrObj0[(((454028936 >= 0 ? 454028936 : 0)) & 0XF)] instanceof ((typeof Object == 'function' ) ? Object : Object)) >= ary[(0)]), (((arrObj0[(((454028936 >= 0 ? 454028936 : 0)) & 0XF)] instanceof ((typeof Object == 'function' ) ? Object : Object)) < ary[(0)]) < (arrObj0[(((454028936 >= 0 ? 454028936 : 0)) & 0XF)] instanceof ((typeof Object == 'function' ) ? Object : Object)))); | |
| if (runningJITtedCode) | |
| { | |
| obj1.prop0=arrObj0[(6)]; | |
| } | |
| return (~ (func0.call(arrObj0 , obj0, arrObj0, leaf, obj0) != func0.call(obj0 , obj1, arrObj0, leaf, obj0))); | |
| } | |
| test5(); | |
| var runningJITtedCode = true; | |
| test5(); | |
| // Test to make sure that polymorphicCacheIndex in bailout info is correct. | |
| // See WinBlue 276053. | |
| var shouldBailout = false; | |
| function test6() | |
| { | |
| var func2 = function(argFunc5) | |
| { | |
| var u = (shouldBailout ? | |
| (Object.defineProperty(this, 'prop1', | |
| {set: function(_x) { WScript.Echo('this.prop1 setter'); }, configurable: true}), 1) : | |
| 1); | |
| } | |
| this.prop0 = 1; | |
| function bar3 (argFunc12, argMath13) | |
| { | |
| this.prop1 = 1; | |
| this.prop0; | |
| } | |
| c = func2(1); | |
| bar3(1, 1); | |
| }; | |
| test6(); | |
| shouldBailout = true; | |
| test6(); | |
| WScript.Echo("done"); |