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) 2001 18* the Initial Developer. All Rights Reserved. 19* 20* Contributor(s): pschwartau@netscape.com 21* 22* Alternatively, the contents of this file may be used under the terms of 23* either the GNU General Public License Version 2 or later (the "GPL"), or 24* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 25* in which case the provisions of the GPL or the LGPL are applicable instead 26* of those above. If you wish to allow use of your version of this file only 27* under the terms of either the GPL or the LGPL, and not to allow others to 28* use your version of this file under the terms of the NPL, indicate your 29* decision by deleting the provisions above and replace them with the notice 30* and other provisions required by the GPL or the LGPL. If you do not delete 31* the provisions above, a recipient may use your version of this file under 32* the terms of any one of the NPL, the GPL or the LGPL. 33* 34* ***** END LICENSE BLOCK ***** 35* 36* 37* Date: 10 Jan 2002 38* SUMMARY: Reassignment to a const is NOT an error per ECMA 39* See http://bugzilla.mozilla.org/show_bug.cgi?id=103602 40* 41* ------- Additional Comment #4 From Brendan Eich 2002-01-10 15:30 ------- 42* 43* That's per ECMA (don't blame me, I fought for what Netscape always did: 44* throw an error [could be a catchable exception since 1.3]). 45* Readonly properties, when set by assignment, are not changed, but no error 46* or exception is thrown. The value of the assignment expression is the value 47* of the r.h.s. 48* 49* If you want a *strict* warning, pls change the summary of this bug to say so. 50*/ 51//----------------------------------------------------------------------------- 52var UBound = 0; 53var bug = 103602; 54var summary = 'Reassignment to a const is NOT an error per ECMA'; 55var status = ''; 56var statusitems = []; 57var actual = ''; 58var actualvalues = []; 59var expect= ''; 60var expectedvalues = []; 61var cnFAIL_1 = 'Redeclaration of a const FAILED to cause an error'; 62var cnFAIL_2 = 'Reassigning to a const caused an ERROR! It should not!!!'; 63var sEval = ''; 64 65/* 66 * Not every implementation supports const (a non-ECMA extension) 67 * For example, Rhino does not; it would generate a complile-time error. 68 * So we have to hide this so it will be detected at run-time instead. 69 */ 70try 71{ 72 sEval = 'const one = 1'; 73 eval(sEval); 74} 75catch(e) 76{ 77 quit(); // if const is not supported, this testcase is over - 78} 79 80 81status = inSection(1); 82try 83{ 84 /* 85 * Redeclaration of const should be a compile-time error. 86 * Hide so it will be detected at run-time. 87 */ 88 sEval = 'const one = 2;'; 89 eval(sEval); 90 91 expect = ''; // we shouldn't reach this line 92 actual = cnFAIL_1; 93 addThis(); 94} 95catch(e) 96{ 97 // good - we should be here. 98 actual = expect; 99 addThis(); 100} 101 102 103status = inSection(2); 104try 105{ 106 /* 107 * Reassignment to a const should be NOT be an error, per ECMA. 108 */ 109 one = 2; 110 actual = expect; // good: no error was generated 111 addThis(); 112 113 // although no error, the assignment should have been ignored - 114 status = inSection(3); 115 actual = one; 116 expect = 1; 117 addThis(); 118 119 // the value of the EXPRESSION, however, is the value of the r.h.s. - 120 status = inSection(4); 121 actual = (one = 2); 122 expect = 2; 123 addThis(); 124} 125 126catch(e) 127{ 128 // BAD - we shouldn't be here 129 expect = ''; 130 actual = cnFAIL_2; 131 addThis(); 132} 133 134 135 136//----------------------------------------------------------------------------- 137test(); 138//----------------------------------------------------------------------------- 139 140 141function addThis() 142{ 143 statusitems[UBound] = status; 144 actualvalues[UBound] = actual; 145 expectedvalues[UBound] = expect; 146 UBound++; 147} 148 149 150function test() 151{ 152 enterFunc ('test'); 153 printBugNumber (bug); 154 printStatus (summary); 155 156 for (var i = 0; i < UBound; i++) 157 { 158 reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); 159 } 160 161 exitFunc ('test'); 162} 163