diff --git a/test/cctest/compiler/test-run-jsexceptions.cc b/test/cctest/compiler/test-run-jsexceptions.cc index 172f0f8914..b1c1e4d63e 100644 --- a/test/cctest/compiler/test-run-jsexceptions.cc +++ b/test/cctest/compiler/test-run-jsexceptions.cc @@ -182,3 +182,78 @@ TEST(FinallyBreak) { T.CheckCall(T.Val("-A-B-D-"), T.false_value(), T.true_value()); T.CheckCall(T.Val("-A-B-C-D-"), T.false_value(), T.false_value()); } + + +TEST(DeoptTry) { + i::FLAG_turbo_exceptions = true; + i::FLAG_turbo_deoptimization = true; + const char* src = + "(function f(a) {" + " try {" + " %DeoptimizeFunction(f);" + " throw a;" + " } catch (e) {" + " return e + 1;" + " }" + "})"; + FunctionTester T(src); + +#if 0 // TODO(mstarzinger): Enable once we can. + T.CheckCall(T.Val(2), T.Val(1)); +#endif +} + + +TEST(DeoptCatch) { + i::FLAG_turbo_exceptions = true; + i::FLAG_turbo_deoptimization = true; + const char* src = + "(function f(a) {" + " try {" + " throw a;" + " } catch (e) {" + " %DeoptimizeFunction(f);" + " return e + 1;" + " }" + "})"; + FunctionTester T(src); + + T.CheckCall(T.Val(2), T.Val(1)); +} + + +TEST(DeoptFinallyReturn) { + i::FLAG_turbo_exceptions = true; + i::FLAG_turbo_deoptimization = true; + const char* src = + "(function f(a) {" + " try {" + " throw a;" + " } finally {" + " %DeoptimizeFunction(f);" + " return a + 1;" + " }" + "})"; + FunctionTester T(src); + + T.CheckCall(T.Val(2), T.Val(1)); +} + + +TEST(DeoptFinallyReThrow) { + i::FLAG_turbo_exceptions = true; + i::FLAG_turbo_deoptimization = true; + const char* src = + "(function f(a) {" + " try {" + " throw a;" + " } finally {" + " %DeoptimizeFunction(f);" + " }" + "})"; + FunctionTester T(src); + +#if 0 // TODO(mstarzinger): Enable once we can. + T.CheckThrows(T.NewObject("new Error"), T.Val(1)); +#endif +} diff --git a/test/mjsunit/compiler/try-deopt.js b/test/mjsunit/compiler/try-deopt.js new file mode 100644 index 0000000000..dc44e7326f --- /dev/null +++ b/test/mjsunit/compiler/try-deopt.js @@ -0,0 +1,56 @@ +// Copyright 2015 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. + +// TODO(mstarzinger): Add FLAG_turbo_exceptions once we want ClusterFuzz. +// Flags: --allow-natives-syntax --turbo-deoptimization + +function DeoptFromTry(x) { + try { + %DeoptimizeFunction(DeoptFromTry); + throw x; + } catch (e) { + return e + 1; + } + return x + 2; +} +%OptimizeFunctionOnNextCall(DeoptFromTry); +assertEquals(24, DeoptFromTry(23)); + + +function DeoptFromCatch(x) { + try { + throw x; + } catch (e) { + %DeoptimizeFunction(DeoptFromCatch); + return e + 1; + } + return x + 2; +} +%OptimizeFunctionOnNextCall(DeoptFromCatch); +assertEquals(24, DeoptFromCatch(23)); + + +function DeoptFromFinally_Return(x) { + try { + throw x; + } finally { + %DeoptimizeFunction(DeoptFromFinally_Return); + return x + 1; + } + return x + 2; +} +%OptimizeFunctionOnNextCall(DeoptFromFinally_Return); +assertEquals(24, DeoptFromFinally_Return(23)); + + +function DeoptFromFinally_ReThrow(x) { + try { + throw x; + } finally { + %DeoptimizeFunction(DeoptFromFinally_ReThrow); + } + return x + 2; +} +%OptimizeFunctionOnNextCall(DeoptFromFinally_ReThrow); +assertThrows("DeoptFromFinally_ReThrow(new Error)", Error);