1/* ***** BEGIN LICENSE BLOCK ***** 2* Version: NPL 1.1/GPL 2.0/LGPL 2.1 3* 4* The contents of this file are subject to the Netscape Public License 5* Version 1.1 (the "License"); you may not use this file except in 6* compliance with the License. You may obtain a copy of the License at 7* http://www.mozilla.org/NPL/ 8* 9* Software distributed under the License is distributed on an "AS IS" basis, 10* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11* for the specific language governing rights and limitations under the 12* License. 13* 14* The Original Code is JavaScript Engine testing utilities. 15* 16* The Initial Developer of the Original Code is Netscape Communications Corp. 17* Portions created by the Initial Developer are Copyright (C) 2002 18* the Initial Developer. All Rights Reserved. 19* 20* Contributor(s): jim-patterson@ncf.ca, brendan@mozilla.org, 21* pschwartau@netscape.com 22* 23* Alternatively, the contents of this file may be used under the terms of 24* either the GNU General Public License Version 2 or later (the "GPL"), or 25* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 26* in which case the provisions of the GPL or the LGPL are applicable instead 27* of those above. If you wish to allow use of your version of this file only 28* under the terms of either the GPL or the LGPL, and not to allow others to 29* use your version of this file under the terms of the NPL, indicate your 30* decision by deleting the provisions above and replace them with the notice 31* and other provisions required by the GPL or the LGPL. If you do not delete 32* the provisions above, a recipient may use your version of this file under 33* the terms of any one of the NPL, the GPL or the LGPL. 34* 35* ***** END LICENSE BLOCK ***** 36* 37* 38* Date: 18 Jun 2002 39* SUMMARY: Shouldn't crash when catch parameter is "hidden" by varX 40* See http://bugzilla.mozilla.org/show_bug.cgi?id=146596 41* 42*/ 43//----------------------------------------------------------------------------- 44var UBound = 0; 45var bug = 146596; 46var summary = "Shouldn't crash when catch parameter is 'hidden' by varX"; 47var status = ''; 48var statusitems = []; 49var actual = ''; 50var actualvalues = []; 51var expect= ''; 52var expectedvalues = []; 53 54 55/* 56 * Just seeing we don't crash when executing this function - 57 * This example provided by jim-patterson@ncf.ca 58 * 59 * Brendan: "Jim, thanks for the testcase. But note that |var| 60 * in a JS function makes a function-scoped variable -- JS lacks 61 * block scope apart from for catch variables within catch blocks. 62 * 63 * Therefore the catch variable hides the function-local variable." 64 */ 65function F() 66{ 67 try 68 { 69 return "A simple exception"; 70 } 71 catch(e) 72 { 73 var e = "Another exception"; 74 } 75 76 return 'XYZ'; 77} 78 79status = inSection(1); 80actual = F(); 81expect = "A simple exception"; 82addThis(); 83 84 85 86/* 87 * Sanity check by Brendan: "This should output 88 * 89 * 24 90 * 42 91 * undefined 92 * 93 * and throw no uncaught exception." 94 * 95 */ 96function f(obj) 97{ 98 var res = []; 99 100 try 101 { 102 throw 42; 103 } 104 catch(e) 105 { 106 with(obj) 107 { 108 var e; 109 res[0] = e; // |with| binds tighter than |catch|; s/b |obj.e| 110 } 111 112 res[1] = e; // |catch| binds tighter than function scope; s/b 42 113 } 114 115 res[2] = e; // |var e| has function scope; s/b visible but contain |undefined| 116 return res; 117} 118 119status = inSection(2); 120actual = f({e:24}); 121expect = [24, 42, undefined]; 122addThis(); 123 124 125 126 127//----------------------------------------------------------------------------- 128test(); 129//----------------------------------------------------------------------------- 130 131 132 133function addThis() 134{ 135 statusitems[UBound] = status; 136 actualvalues[UBound] = actual.toString(); 137 expectedvalues[UBound] = expect.toString(); 138 UBound++; 139} 140 141 142function test() 143{ 144 enterFunc('test'); 145 printBugNumber(bug); 146 printStatus(summary); 147 148 for (var i=0; i<UBound; i++) 149 { 150 reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); 151 } 152 153 exitFunc ('test'); 154} 155