Index: test/webkit/fast/js/kde/exception_propagation.js |
diff --git a/test/webkit/fast/js/kde/exception_propagation.js b/test/webkit/fast/js/kde/exception_propagation.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..71be4f784ecba8a1113137d6cf90eb7dfffd53a9 |
--- /dev/null |
+++ b/test/webkit/fast/js/kde/exception_propagation.js |
@@ -0,0 +1,446 @@ |
+// Copyright 2013 the V8 project authors. All rights reserved. |
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
+// |
+// Redistribution and use in source and binary forms, with or without |
+// modification, are permitted provided that the following conditions |
+// are met: |
+// 1. Redistributions of source code must retain the above copyright |
+// notice, this list of conditions and the following disclaimer. |
+// 2. Redistributions in binary form must reproduce the above copyright |
+// notice, this list of conditions and the following disclaimer in the |
+// documentation and/or other materials provided with the distribution. |
+// |
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY |
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+description("KDE JS Test"); |
+var global = this; |
+function myfunc() { |
+} |
+function throwex() { |
+ throw new Error("test exception"); |
+} |
+ |
+//--------------------------- |
+var func_ret_with_ex_func = 4; |
+try { |
+ func_ret_with_ex_func = throwex()(); |
+} |
+catch (e) { |
+} |
+shouldBe("func_ret_with_ex_func", "4"); |
+ |
+// --------------------------------- |
+ |
+var func_ret_from_ex_throw_args = 4; |
+try { |
+ func_ret_from_ex_throw_args = Math.abs(throwex()); |
+} |
+catch (e) { |
+} |
+shouldBe("func_ret_from_ex_throw_args", "4"); |
+ |
+// --------------------------------- |
+ |
+var set_from_throw_func_args = 4; |
+try { |
+ throwex()(set_from_throw_func_args = 1); |
+} |
+catch (e) { |
+} |
+shouldBe("set_from_throw_func_args","4"); |
+ |
+// --------------------------------- |
+ |
+var set_from_func_throw_args = 4; |
+try { |
+ myfunc(throwex(), set_from_func_throw_args = 1); |
+} |
+catch (e) { |
+} |
+shouldBe("set_from_func_throw_args","4"); |
+ |
+// --------------------------------- |
+ |
+var set_from_before_func_throw_args = 4; |
+try { |
+ myfunc(set_from_before_func_throw_args = 1, throwex()); |
+} |
+catch (e) { |
+} |
+shouldBe("set_from_before_func_throw_args","1"); |
+ |
+// --------------------------------- |
+ |
+// ### move to function.js |
+var function_param_order = ""; |
+function aparam() { |
+ function_param_order += "a"; |
+} |
+function bparam() { |
+ function_param_order += "b"; |
+} |
+function cparam() { |
+ function_param_order += "c"; |
+} |
+myfunc(aparam(),bparam(),cparam()); |
+shouldBe("function_param_order","'abc'"); |
+ |
+// --------------------------------- |
+// ### move to function.js |
+var new_param_order = ""; |
+function anewparam() { |
+ new_param_order += "a"; |
+} |
+function bnewparam() { |
+ new_param_order += "b"; |
+} |
+function cnewparam() { |
+ new_param_order += "c"; |
+} |
+new myfunc(anewparam(),bnewparam(),cnewparam()); |
+shouldBe("new_param_order","'abc'"); |
+ |
+// --------------------------------- |
+// ### move to function.js |
+var elision_param_order = ""; |
+function aelision() { |
+ elision_param_order += "a"; |
+} |
+function belision() { |
+ elision_param_order += "b"; |
+} |
+function celision() { |
+ elision_param_order += "c"; |
+} |
+[aelision(),belision(),celision()]; |
+shouldBe("elision_param_order","'abc'"); |
+ |
+// --------------------------------- |
+// ### move to function.js |
+var comma_order = ""; |
+function acomma() { |
+ comma_order += "a"; |
+} |
+function bcomma() { |
+ comma_order += "b"; |
+} |
+function ccomma() { |
+ comma_order += "c"; |
+} |
+acomma(),bcomma(),ccomma(); |
+shouldBe("comma_order","'abc'"); |
+ |
+// --------------------------------- |
+ |
+function checkOperator(op,name) { |
+ var code =( |
+ "global."+name+"_part1 = 4;\n"+ |
+ "try {\n"+ |
+ " ("+name+"_part1 = 1) "+op+" throwex();\n"+ |
+ "}\n"+ |
+ "catch (e) {\n"+ |
+ "}\n"+ |
+ "shouldBe('"+name+"_part1', '1');\n"+ |
+ "global."+name+"_part2 = 4;\n"+ |
+ "try {\n"+ |
+ " throwex() "+op+" ("+name+"_part2 = 1);\n"+ |
+ "}\n"+ |
+ "catch (e) {\n"+ |
+ "}\n"+ |
+ "shouldBe('"+name+"_part2', '4');\n"); |
+// print("\n\n\n"); |
+// print(code); |
+ eval(code); |
+} |
+ |
+checkOperator("==","OpEqEq"); |
+checkOperator("!=","OpNotEq"); |
+checkOperator("===","OpStrEq"); |
+checkOperator("!==","OpStrNEq"); |
+// ### these generate a syntax error in mozilla - kjs should do the same (?) |
+//checkOperator("+=","OpPlusEq"); |
+//checkOperator("-=","OpMinusEq"); |
+//checkOperator("*=","OpMultEq"); |
+//checkOperator("/=","OpDivEq"); |
+// OpPlusPlus, |
+// OpMinusMinus, |
+checkOperator("<","OpLess"); |
+checkOperator("<=","OpLessEq"); |
+checkOperator(">","OpGreater"); |
+checkOperator(">=","OpGreaterEq"); |
+//checkOperator("&=","OpAndEq"); |
+//checkOperator("^=","OpXOrEq"); |
+//checkOperator("|=","OpOrEq"); |
+//checkOperator("%=","OpModEq"); |
+checkOperator("&&","OpAnd"); |
+checkOperator("||","OpOr"); |
+checkOperator("&","OpBitAnd"); |
+checkOperator("^","OpBitXOr"); |
+checkOperator("|","OpBitOr"); |
+checkOperator("<<","OpLShift"); |
+checkOperator(">>","OpRShift"); |
+checkOperator(">>>","OpURShift"); |
+// OpIn, |
+checkOperator("instanceof","OpInstanceOf"); |
+ |
+// --------------------------------- |
+var set_from_if_stmt = 4; |
+try { |
+ if (throwex()) { |
+ set_from_if_stmt = 1; |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("set_from_if_stmt","4"); |
+ |
+// --------------------------------- |
+var set_from_if_else_stmt = 4; |
+try { |
+ if (throwex()) { |
+ set_from_if_else_stmt = 1; |
+ } |
+ else { |
+ undefined; |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("set_from_if_else_stmt","4"); |
+ |
+// --------------------------------- |
+ |
+var set_from_else_in_if_else_stmt = 4; |
+try { |
+ if (throwex()) { |
+ undefined; |
+ } |
+ else { |
+ set_from_else_in_if_else_stmt = 1; |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("set_from_else_in_if_else_stmt","4"); |
+ |
+// --------------------------------- |
+ |
+var comma_left = 4; |
+try { |
+ comma_left = 1, throwex(); |
+} |
+catch (e) { |
+} |
+shouldBe("comma_left","1"); |
+ |
+// --------------------------------- |
+ |
+var comma_left = 4; |
+try { |
+ throwex(), comma_left = 1; |
+} |
+catch (e) { |
+} |
+shouldBe("comma_left","4"); |
+ |
+var vardecl_assign_throws = 4; |
+try { |
+ var vardecl_assign_throws = throwex(); |
+} |
+catch (e) { |
+} |
+shouldBe("vardecl_assign_throws","4"); |
+ |
+// --------------------------------- |
+ |
+var var_assign_before_throw_run = false; |
+function var_assign_before_throw() { |
+ var_assign_before_throw_run = true; |
+ return 1; |
+} |
+ |
+var var_assign_after_throw_run = false; |
+function var_assign_after_throw() { |
+ var_assign_after_throw_run = true; |
+ return 1; |
+} |
+ |
+try { |
+ var var_assign1 = var_assign_before_throw(), |
+ var_assign2 = throwex(), |
+ var_assign1 = var_assign_before_throw(); |
+} |
+catch (e) { |
+} |
+shouldBe("var_assign_before_throw_run","true"); |
+shouldBe("var_assign_after_throw_run","false"); |
+ |
+// --------------------------------- |
+ |
+var do_val = 4; |
+try { |
+ do { |
+ do_val++; |
+ } |
+ while (throwex()); |
+} |
+catch (e) { |
+} |
+shouldBe("do_val","5"); |
+ |
+// --------------------------------- |
+var while_val = 4; |
+try { |
+ while (throwex()) { |
+ while_val++; |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("while_val","4"); |
+ |
+// --------------------------------- |
+var for_val_part1_throw2 = 4; |
+try { |
+ for (for_val_part1_throw2 = 1; throwex(); ) { |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("for_val_part1_throw2","1"); |
+ |
+// --------------------------------- |
+var for_val_part1_throw3 = 4; |
+try { |
+ for (for_val_part1_throw3 = 1; ; throwex()) { |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("for_val_part1_throw3","1"); |
+ |
+// --------------------------------- |
+var for_val_part2_throw1 = 4; |
+try { |
+ for (throwex(); for_val_part2_throw1 = 1; ) { |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("for_val_part2_throw1","4"); |
+ |
+// --------------------------------- |
+var for_val_part2_throw3 = 4; |
+try { |
+ for (; for_val_part2_throw3 = 1; throwex()) { |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("for_val_part2_throw3","1"); |
+ |
+// --------------------------------- |
+var for_val_part3_throw1 = 4; |
+try { |
+ for (throwex(); ; for_val_part3_throw1 = 1) { |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("for_val_part3_throw1","4"); |
+ |
+// --------------------------------- |
+var for_val_part3_throw2 = 4; |
+try { |
+ for (; throwex(); for_val_part3_throw2 = 1) { |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("for_val_part3_throw2","4"); |
+ |
+// --------------------------------- |
+var for_val_part1_throwbody = 4; |
+try { |
+ for (for_val_part1_throwbody = 1; ;) { |
+ throwex(); |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("for_val_part1_throwbody","1"); |
+ |
+// --------------------------------- |
+var for_val_part2_throwbody = 4; |
+try { |
+ for (; for_val_part2_throwbody = 1; ) { |
+ throwex(); |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("for_val_part2_throwbody","1"); |
+ |
+// --------------------------------- |
+var for_val_part3_throwbody = 4; |
+try { |
+ for (; ; for_val_part3_throwbody = 1) { |
+ throwex(); |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("for_val_part3_throwbody","4"); |
+ |
+// --------------------------------- |
+var forin_test_obj = new Object(); |
+forin_test_obj.a = 1; |
+forin_test_obj.b = 2; |
+forin_test_obj.c = 3; |
+var forin_count = 4; |
+function forin_lexpr() { |
+// if (forincount == 1); |
+// throwex(); |
+ return new Object(); |
+} |
+try { |
+ for (throwex() in forin_test_obj) { |
+ forin_count++; |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("forin_count","4"); |
+ |
+// --------------------------------- |
+var set_inside_with_throw = 4; |
+try { |
+ with (throwex()) { |
+ set_inside_with_throw = 1; |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("set_inside_with_throw","4"); |
+ |
+// --------------------------------- |
+var set_inside_with_cantconverttoobject = 4; |
+try { |
+ with (undefined) { |
+ print("FAIL. This message should not be displayed"); |
+ set_inside_with_cantconverttoobject = 1; |
+ } |
+} |
+catch (e) { |
+} |
+shouldBe("set_inside_with_cantconverttoobject","4"); |
+// ### test case, sw |