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): 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: 03 June 2002 38* SUMMARY: Function param or local var with same name as a function property 39* 40* See http://bugzilla.mozilla.org/show_bug.cgi?id=137000 41* See http://bugzilla.mozilla.org/show_bug.cgi?id=138708 42* See http://bugzilla.mozilla.org/show_bug.cgi?id=150032 43* See http://bugzilla.mozilla.org/show_bug.cgi?id=150859 44* 45*/ 46//----------------------------------------------------------------------------- 47var UBound = 0; 48var bug = 137000; 49var summary = 'Function param or local var with same name as a function prop'; 50var status = ''; 51var statusitems = []; 52var actual = ''; 53var actualvalues = []; 54var expect= ''; 55var expectedvalues = []; 56 57 58/* 59 * Note use of 'x' both for the parameter to f, 60 * and as a property name for |f| as an object 61 */ 62function f(x) 63{ 64} 65 66status = inSection(1); 67f.x = 12; 68actual = f.x; 69expect = 12; 70addThis(); 71 72 73 74/* 75 * A more elaborate example, using the call() method 76 * to chain constructors from child to parent. 77 * 78 * The key point is the use of the same name 'p' for both 79 * the parameter to the constructor, and as a property name 80 */ 81function parentObject(p) 82{ 83 this.p = 1; 84} 85 86function childObject() 87{ 88 parentObject.call(this); 89} 90childObject.prototype = parentObject; 91 92status = inSection(2); 93var objParent = new parentObject(); 94actual = objParent.p; 95expect = 1; 96addThis(); 97 98status = inSection(3); 99var objChild = new childObject(); 100actual = objChild.p; 101expect = 1; 102addThis(); 103 104 105 106/* 107 * A similar set-up. Here the same name is being used for 108 * the parameter to both the Base and Child constructors, 109 */ 110function Base(id) 111{ 112} 113 114function Child(id) 115{ 116 this.prop = id; 117} 118Child.prototype=Base; 119 120status = inSection(4); 121var c1 = new Child('child1'); 122actual = c1.prop; 123expect = 'child1'; 124addThis(); 125 126 127 128/* 129 * Use same identifier as a property name, too - 130 */ 131function BaseX(id) 132{ 133} 134 135function ChildX(id) 136{ 137 this.id = id; 138} 139ChildX.prototype=BaseX; 140 141status = inSection(5); 142c1 = new ChildX('child1'); 143actual = c1.id; 144expect = 'child1'; 145addThis(); 146 147 148 149/* 150 * From http://bugzilla.mozilla.org/show_bug.cgi?id=150032 151 * 152 * Here the same name is being used both for a local variable 153 * declared in g(), and as a property name for |g| as an object 154 */ 155function g() 156{ 157 var propA = g.propA; 158 var propB = g.propC; 159 160 this.getVarA = function() {return propA;} 161 this.getVarB = function() {return propB;} 162} 163g.propA = 'A'; 164g.propB = 'B'; 165g.propC = 'C'; 166var obj = new g(); 167 168status = inSection(6); 169actual = obj.getVarA(); // this one was returning 'undefined' 170expect = 'A'; 171addThis(); 172 173status = inSection(7); 174actual = obj.getVarB(); // this one is easy; it never failed 175expect = 'C'; 176addThis(); 177 178 179 180/* 181 * By martin.honnen@t-online.de 182 * From http://bugzilla.mozilla.org/show_bug.cgi?id=150859 183 * 184 * Here the same name is being used for a local var in F 185 * and as a property name for |F| as an object 186 * 187 * Twist: the property is added via another function. 188 */ 189function setFProperty(val) 190{ 191 F.propA = val; 192} 193 194function F() 195{ 196 var propA = 'Local variable in F'; 197} 198 199status = inSection(8); 200setFProperty('Hello'); 201actual = F.propA; // this was returning 'undefined' 202expect = 'Hello'; 203addThis(); 204 205 206 207 208//----------------------------------------------------------------------------- 209test(); 210//----------------------------------------------------------------------------- 211 212 213 214function addThis() 215{ 216 statusitems[UBound] = status; 217 actualvalues[UBound] = actual; 218 expectedvalues[UBound] = expect; 219 UBound++; 220} 221 222 223function test() 224{ 225 enterFunc('test'); 226 printBugNumber(bug); 227 printStatus(summary); 228 229 for (var i=0; i<UBound; i++) 230 { 231 reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); 232 } 233 234 exitFunc ('test'); 235} 236