// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --allow-natives-syntax // This tests checks some possible wrong exception handling due to, // for instance, the OSR loop peeling. If exception handlers are not updated // correctly, when we run the second iteration of the outermost loop, which // is the OSR optimised version, the try-catch will fail... which should not // fail on a correct code. function SingleLoop() { for (var a = 0; a < 2; a++) { try { throw 'The exception should have been caught.'; } catch(e) {} for (var b = 0; b < 1; b++) { %OptimizeOsr(); %PrepareFunctionForOptimization(SingleLoop); } } } %PrepareFunctionForOptimization(SingleLoop); // These function could also fail if the exception handlers are not updated at // the right time: a JSStackCheck gets created for the print, just after the // bytecode for the while LoopHeader. If the OSR phase did not exit properly // the exception before visiting the bytecode for the print, it will fail // because some IfSuccess gets created for nothing (the IfException will // become dead code and removed). function EmptyBody() { try {; } catch(e) {; } var a = 0; while (1) { %OptimizeOsr(); print("foo"); if (a == 1) break; a++; %PrepareFunctionForOptimization(EmptyBody); } } %PrepareFunctionForOptimization(EmptyBody); function NestedLoops() { for (var a = 0; a < 2; a++) { try {; } catch(e) {; } %OptimizeOsr(); var b = 0; while (1) { print("bar"); if (b == 1) break; b++; } %PrepareFunctionForOptimization(NestedLoops); } } %PrepareFunctionForOptimization(NestedLoops); SingleLoop(); EmptyBody(); NestedLoops();