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 (at) 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 //----------------------------------------------------------------------------- 47 var UBound = 0; 48 var bug = 137000; 49 var summary = 'Function param or local var with same name as a function prop'; 50 var status = ''; 51 var statusitems = []; 52 var actual = ''; 53 var actualvalues = []; 54 var expect= ''; 55 var 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 */ 62 function f(x) 63 { 64 } 65 66 status = inSection(1); 67 f.x = 12; 68 actual = f.x; 69 expect = 12; 70 addThis(); 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 */ 81 function parentObject(p) 82 { 83 this.p = 1; 84 } 85 86 function childObject() 87 { 88 parentObject.call(this); 89 } 90 childObject.prototype = parentObject; 91 92 status = inSection(2); 93 var objParent = new parentObject(); 94 actual = objParent.p; 95 expect = 1; 96 addThis(); 97 98 status = inSection(3); 99 var objChild = new childObject(); 100 actual = objChild.p; 101 expect = 1; 102 addThis(); 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 */ 110 function Base(id) 111 { 112 } 113 114 function Child(id) 115 { 116 this.prop = id; 117 } 118 Child.prototype=Base; 119 120 status = inSection(4); 121 var c1 = new Child('child1'); 122 actual = c1.prop; 123 expect = 'child1'; 124 addThis(); 125 126 127 128 /* 129 * Use same identifier as a property name, too - 130 */ 131 function BaseX(id) 132 { 133 } 134 135 function ChildX(id) 136 { 137 this.id = id; 138 } 139 ChildX.prototype=BaseX; 140 141 status = inSection(5); 142 c1 = new ChildX('child1'); 143 actual = c1.id; 144 expect = 'child1'; 145 addThis(); 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 */ 155 function 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 } 163 g.propA = 'A'; 164 g.propB = 'B'; 165 g.propC = 'C'; 166 var obj = new g(); 167 168 status = inSection(6); 169 actual = obj.getVarA(); // this one was returning 'undefined' 170 expect = 'A'; 171 addThis(); 172 173 status = inSection(7); 174 actual = obj.getVarB(); // this one is easy; it never failed 175 expect = 'C'; 176 addThis(); 177 178 179 180 /* 181 * By martin.honnen (at) 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 */ 189 function setFProperty(val) 190 { 191 F.propA = val; 192 } 193 194 function F() 195 { 196 var propA = 'Local variable in F'; 197 } 198 199 status = inSection(8); 200 setFProperty('Hello'); 201 actual = F.propA; // this was returning 'undefined' 202 expect = 'Hello'; 203 addThis(); 204 205 206 207 208 //----------------------------------------------------------------------------- 209 test(); 210 //----------------------------------------------------------------------------- 211 212 213 214 function addThis() 215 { 216 statusitems[UBound] = status; 217 actualvalues[UBound] = actual; 218 expectedvalues[UBound] = expect; 219 UBound++; 220 } 221 222 223 function 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