regress-137000.js (3880B)
1 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 /* 7 * 8 * Date: 03 June 2002 9 * SUMMARY: Function param or local var with same name as a function property 10 * 11 * See http://bugzilla.mozilla.org/show_bug.cgi?id=137000 12 * See http://bugzilla.mozilla.org/show_bug.cgi?id=138708 13 * See http://bugzilla.mozilla.org/show_bug.cgi?id=150032 14 * See http://bugzilla.mozilla.org/show_bug.cgi?id=150859 15 * 16 */ 17 //----------------------------------------------------------------------------- 18 var UBound = 0; 19 var BUGNUMBER = 137000; 20 var summary = 'Function param or local var with same name as a function prop'; 21 var status = ''; 22 var statusitems = []; 23 var actual = ''; 24 var actualvalues = []; 25 var expect= ''; 26 var expectedvalues = []; 27 28 29 /* 30 * Note use of 'x' both for the parameter to f, 31 * and as a property name for |f| as an object 32 */ 33 function f(x) 34 { 35 } 36 37 status = inSection(1); 38 f.x = 12; 39 actual = f.x; 40 expect = 12; 41 addThis(); 42 43 44 45 /* 46 * A more elaborate example, using the call() method 47 * to chain constructors from child to parent. 48 * 49 * The key point is the use of the same name 'p' for both 50 * the parameter to the constructor, and as a property name 51 */ 52 function parentObject(p) 53 { 54 this.p = 1; 55 } 56 57 function childObject() 58 { 59 parentObject.call(this); 60 } 61 childObject.prototype = parentObject; 62 63 status = inSection(2); 64 var objParent = new parentObject(); 65 actual = objParent.p; 66 expect = 1; 67 addThis(); 68 69 status = inSection(3); 70 var objChild = new childObject(); 71 actual = objChild.p; 72 expect = 1; 73 addThis(); 74 75 76 77 /* 78 * A similar set-up. Here the same name is being used for 79 * the parameter to both the Base and Child constructors, 80 */ 81 function Base(id) 82 { 83 } 84 85 function Child(id) 86 { 87 this.prop = id; 88 } 89 Child.prototype=Base; 90 91 status = inSection(4); 92 var c1 = new Child('child1'); 93 actual = c1.prop; 94 expect = 'child1'; 95 addThis(); 96 97 98 99 /* 100 * Use same identifier as a property name, too - 101 */ 102 function BaseX(id) 103 { 104 } 105 106 function ChildX(id) 107 { 108 this.id = id; 109 } 110 ChildX.prototype=BaseX; 111 112 status = inSection(5); 113 c1 = new ChildX('child1'); 114 actual = c1.id; 115 expect = 'child1'; 116 addThis(); 117 118 119 120 /* 121 * From http://bugzilla.mozilla.org/show_bug.cgi?id=150032 122 * 123 * Here the same name is being used both for a local variable 124 * declared in g(), and as a property name for |g| as an object 125 */ 126 function g() 127 { 128 var propA = g.propA; 129 var propB = g.propC; 130 131 this.getVarA = function() {return propA;} 132 this.getVarB = function() {return propB;} 133 } 134 g.propA = 'A'; 135 g.propB = 'B'; 136 g.propC = 'C'; 137 var obj = new g(); 138 139 status = inSection(6); 140 actual = obj.getVarA(); // this one was returning 'undefined' 141 expect = 'A'; 142 addThis(); 143 144 status = inSection(7); 145 actual = obj.getVarB(); // this one is easy; it never failed 146 expect = 'C'; 147 addThis(); 148 149 150 151 /* 152 * By martin.honnen@gmx.de 153 * From http://bugzilla.mozilla.org/show_bug.cgi?id=150859 154 * 155 * Here the same name is being used for a local var in F 156 * and as a property name for |F| as an object 157 * 158 * Twist: the property is added via another function. 159 */ 160 function setFProperty(val) 161 { 162 F.propA = val; 163 } 164 165 function F() 166 { 167 var propA = 'Local variable in F'; 168 } 169 170 status = inSection(8); 171 setFProperty('Hello'); 172 actual = F.propA; // this was returning 'undefined' 173 expect = 'Hello'; 174 addThis(); 175 176 177 178 179 //----------------------------------------------------------------------------- 180 test(); 181 //----------------------------------------------------------------------------- 182 183 184 185 function addThis() 186 { 187 statusitems[UBound] = status; 188 actualvalues[UBound] = actual; 189 expectedvalues[UBound] = expect; 190 UBound++; 191 } 192 193 194 function test() 195 { 196 printBugNumber(BUGNUMBER); 197 printStatus(summary); 198 199 for (var i=0; i<UBound; i++) 200 { 201 reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); 202 } 203 }