// 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 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