| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 |
| 5 // Flags: --harmony-classes | 5 // Flags: --harmony-classes |
| 6 | 6 |
| 7 | |
| 8 (function TestSuperNamedLoads() { | 7 (function TestSuperNamedLoads() { |
| 9 function Base() { } | 8 function Base() { } |
| 9 function fBase() { } |
| 10 Base.prototype = { |
| 11 f() { |
| 12 return "Base " + this.toString(); |
| 13 }, |
| 14 x: 15, |
| 15 toString() { |
| 16 return "this is Base"; |
| 17 } |
| 18 }; |
| 19 |
| 10 function Derived() { | 20 function Derived() { |
| 11 this.derivedDataProperty = "xxx"; | 21 this.derivedDataProperty = "xxx"; |
| 12 } | 22 } |
| 13 Derived.prototype = Object.create(Base.prototype); | 23 Derived.prototype = { |
| 14 | 24 __proto__: Base.prototype, |
| 15 function fBase() { return "Base " + this.toString(); } | 25 toString() { return "this is Derived"; }, |
| 16 | 26 x: 27, |
| 17 Base.prototype.f = fBase.toMethod(Base.prototype); | 27 f() { |
| 18 | 28 assertEquals("Base this is Derived", super.f()); |
| 19 function fDerived() { | 29 var a = super.x; |
| 20 assertEquals("Base this is Derived", super.f()); | 30 assertEquals(15, a); |
| 21 var a = super.x; | 31 assertEquals(15, super.x); |
| 22 assertEquals(15, a); | 32 assertEquals(27, this.x); |
| 23 assertEquals(15, super.x); | 33 return "Derived"; |
| 24 assertEquals(27, this.x); | 34 } |
| 25 | 35 }; |
| 26 return "Derived" | |
| 27 } | |
| 28 | |
| 29 Base.prototype.x = 15; | |
| 30 Base.prototype.toString = function() { return "this is Base"; }; | |
| 31 Derived.prototype.toString = function() { return "this is Derived"; }; | |
| 32 Derived.prototype.x = 27; | |
| 33 Derived.prototype.f = fDerived.toMethod(Derived.prototype); | |
| 34 | 36 |
| 35 assertEquals("Base this is Base", new Base().f()); | 37 assertEquals("Base this is Base", new Base().f()); |
| 36 assertEquals("Derived", new Derived().f()); | 38 assertEquals("Derived", new Derived().f()); |
| 37 }()); | 39 }()); |
| 38 | 40 |
| 39 | 41 |
| 40 (function TestSuperKeyedLoads() { | 42 (function TestSuperKeyedLoads() { |
| 41 var x = 'x'; | 43 var x = 'x'; |
| 42 var derivedDataProperty = 'derivedDataProperty'; | 44 var derivedDataProperty = 'derivedDataProperty'; |
| 43 var f = 'f'; | 45 var f = 'f'; |
| 46 |
| 44 function Base() { } | 47 function Base() { } |
| 45 function Derived() { | |
| 46 this[derivedDataProperty] = 'xxx'; | |
| 47 } | |
| 48 Derived.prototype = Object.create(Base.prototype); | |
| 49 | |
| 50 function fBase() { return "Base " + this.toString(); } | 48 function fBase() { return "Base " + this.toString(); } |
| 51 | |
| 52 Base.prototype[f] = fBase.toMethod(Base.prototype); | 49 Base.prototype[f] = fBase.toMethod(Base.prototype); |
| 53 | |
| 54 function fDerived() { | |
| 55 assertEquals("Base this is Derived", super[f]()); | |
| 56 var a = super[x]; | |
| 57 assertEquals(15, a); | |
| 58 assertEquals(15, super[x]); | |
| 59 assertEquals(27, this[x]); | |
| 60 | |
| 61 return "Derived" | |
| 62 } | |
| 63 | |
| 64 Base.prototype[x] = 15; | 50 Base.prototype[x] = 15; |
| 65 Base.prototype.toString = function() { return "this is Base"; }; | 51 Base.prototype.toString = function() { return "this is Base"; }; |
| 66 Derived.prototype.toString = function() { return "this is Derived"; }; | 52 |
| 67 Derived.prototype[x] = 27; | 53 function Derived() { |
| 68 Derived.prototype[f] = fDerived.toMethod(Derived.prototype); | 54 this[derivedDataProperty] = "xxx"; |
| 55 } |
| 56 Derived.prototype = { |
| 57 __proto__: Base.prototype, |
| 58 toString() { return "this is Derived"; }, |
| 59 x: 27, |
| 60 f() { |
| 61 assertEquals("Base this is Derived", super[f]()); |
| 62 var a = super[x]; |
| 63 assertEquals(15, a); |
| 64 assertEquals(15, super[x]); |
| 65 assertEquals(27, this[x]); |
| 66 return "Derived"; |
| 67 } |
| 68 }; |
| 69 | 69 |
| 70 assertEquals("Base this is Base", new Base().f()); | 70 assertEquals("Base this is Base", new Base().f()); |
| 71 assertEquals("Derived", new Derived().f()); | 71 assertEquals("Derived", new Derived().f()); |
| 72 }()); | 72 }()); |
| 73 | 73 |
| 74 | 74 |
| 75 (function TestSuperNumericKeyedLoads() { | 75 (function TestSuperNumericKeyedLoads() { |
| 76 var x = 1; | 76 var x = 1; |
| 77 var derivedDataProperty = 2; | 77 var derivedDataProperty = 2; |
| 78 var f = 3; | 78 var f = 3; |
| 79 |
| 79 function Base() { } | 80 function Base() { } |
| 80 function Derived() { | |
| 81 this[derivedDataProperty] = 'xxx'; | |
| 82 } | |
| 83 Derived.prototype = Object.create(Base.prototype); | |
| 84 | |
| 85 function fBase() { return "Base " + this.toString(); } | 81 function fBase() { return "Base " + this.toString(); } |
| 86 | |
| 87 Base.prototype[f] = fBase.toMethod(Base.prototype); | 82 Base.prototype[f] = fBase.toMethod(Base.prototype); |
| 88 | |
| 89 function fDerived() { | |
| 90 assertEquals("Base this is Derived", super[f]()); | |
| 91 var a = super[x]; | |
| 92 assertEquals(15, a); | |
| 93 assertEquals(15, super[x]); | |
| 94 assertEquals(27, this[x]); | |
| 95 | |
| 96 return "Derived" | |
| 97 } | |
| 98 | |
| 99 Base.prototype[x] = 15; | 83 Base.prototype[x] = 15; |
| 100 Base.prototype.toString = function() { return "this is Base"; }; | 84 Base.prototype.toString = function() { return "this is Base"; }; |
| 101 Derived.prototype.toString = function() { return "this is Derived"; }; | 85 |
| 102 Derived.prototype[x] = 27; | 86 function Derived() { |
| 103 Derived.prototype[f] = fDerived.toMethod(Derived.prototype); | 87 this[derivedDataProperty] = "xxx"; |
| 88 } |
| 89 Derived.prototype = { |
| 90 __proto__: Base.prototype, |
| 91 toString() { return "this is Derived"; }, |
| 92 1: 27, |
| 93 3() { |
| 94 assertEquals("Base this is Derived", super[f]()); |
| 95 var a = super[x]; |
| 96 assertEquals(15, a); |
| 97 assertEquals(15, super[x]); |
| 98 assertEquals(27, this[x]); |
| 99 return "Derived"; |
| 100 } |
| 101 }; |
| 104 | 102 |
| 105 assertEquals("Base this is Base", new Base()[f]()); | 103 assertEquals("Base this is Base", new Base()[f]()); |
| 106 assertEquals("Derived", new Derived()[f]()); | 104 assertEquals("Derived", new Derived()[f]()); |
| 107 }()); | 105 }()); |
| 108 | 106 |
| 109 | 107 |
| 110 (function TestSuperKeywordNonMethod() { | 108 (function TestSuperKeywordNonMethod() { |
| 111 function f() { | 109 'use strict'; |
| 112 super.unknown(); | 110 |
| 111 class C { |
| 112 f() { |
| 113 super.unknown(); |
| 114 } |
| 113 } | 115 } |
| 114 | 116 |
| 115 assertThrows(f, ReferenceError); | 117 assertThrows(function() { |
| 118 new C().f(); |
| 119 }, TypeError); |
| 116 }()); | 120 }()); |
| 117 | 121 |
| 118 | 122 |
| 119 (function TestGetter() { | 123 (function TestGetter() { |
| 120 function Base() {} | 124 function Base() {} |
| 121 var derived; | 125 var derived; |
| 122 Base.prototype = { | 126 Base.prototype = { |
| 123 constructor: Base, | 127 constructor: Base, |
| 124 get x() { | 128 get x() { |
| 125 assertSame(this, derived); | 129 assertSame(this, derived); |
| 126 return this._x; | 130 return this._x; |
| 127 }, | 131 }, |
| 128 _x: 'base' | 132 _x: 'base' |
| 129 }; | 133 }; |
| 130 | 134 |
| 131 function Derived() {} | 135 function Derived() {} |
| 132 Derived.__proto__ = Base; | 136 Derived.__proto__ = Base; |
| 133 Derived.prototype = { | 137 Derived.prototype = { |
| 134 __proto__: Base.prototype, | 138 __proto__: Base.prototype, |
| 135 constructor: Derived, | 139 constructor: Derived, |
| 136 _x: 'derived' | 140 _x: 'derived', |
| 141 testGetter() { |
| 142 return super.x; |
| 143 }, |
| 144 testGetterStrict() { |
| 145 'use strict'; |
| 146 return super.x; |
| 147 } |
| 137 }; | 148 }; |
| 138 Derived.prototype.testGetter = function() { | 149 |
| 139 return super.x; | |
| 140 }.toMethod(Derived.prototype); | |
| 141 Derived.prototype.testGetterStrict = function() { | |
| 142 'use strict'; | |
| 143 return super.x; | |
| 144 }.toMethod(Derived.prototype); | |
| 145 derived = new Derived(); | 150 derived = new Derived(); |
| 146 assertEquals('derived', derived.testGetter()); | 151 assertEquals('derived', derived.testGetter()); |
| 147 derived = new Derived(); | 152 derived = new Derived(); |
| 148 assertEquals('derived', derived.testGetterStrict()); | 153 assertEquals('derived', derived.testGetterStrict()); |
| 149 }()); | 154 }()); |
| 150 | 155 |
| 151 | 156 |
| 152 (function TestGetterKeyed() { | 157 (function TestGetterKeyed() { |
| 153 var x = 'x'; | 158 var x = 'x'; |
| 154 function Base() {} | 159 function Base() {} |
| 155 var derived; | 160 var derived; |
| 156 Base.prototype = { | 161 Base.prototype = { |
| 157 constructor: Base, | 162 constructor: Base, |
| 158 get x() { | 163 get x() { |
| 159 assertSame(this, derived); | 164 assertSame(this, derived); |
| 160 return this._x; | 165 return this._x; |
| 161 }, | 166 }, |
| 162 _x: 'base' | 167 _x: 'base' |
| 163 }; | 168 }; |
| 164 | 169 |
| 165 function Derived() {} | 170 function Derived() {} |
| 166 Derived.__proto__ = Base; | 171 Derived.__proto__ = Base; |
| 167 Derived.prototype = { | 172 Derived.prototype = { |
| 168 __proto__: Base.prototype, | 173 __proto__: Base.prototype, |
| 169 constructor: Derived, | 174 constructor: Derived, |
| 170 _x: 'derived' | 175 _x: 'derived', |
| 176 testGetter() { |
| 177 return super[x]; |
| 178 }, |
| 179 testGetterStrict() { |
| 180 'use strict'; |
| 181 return super[x]; |
| 182 }, |
| 183 testGetterWithToString() { |
| 184 var toStringCalled; |
| 185 var o = { toString: function() { |
| 186 toStringCalled++; |
| 187 return 'x'; |
| 188 } }; |
| 189 |
| 190 toStringCalled = 0; |
| 191 assertEquals('derived', super[o]); |
| 192 assertEquals(1, toStringCalled); |
| 193 |
| 194 var eToThrow = new Error(); |
| 195 var oThrowsInToString = { toString: function() { |
| 196 throw eToThrow; |
| 197 } }; |
| 198 |
| 199 var ex = null; |
| 200 try { |
| 201 super[oThrowsInToString]; |
| 202 } catch(e) { ex = e } |
| 203 assertEquals(eToThrow, ex); |
| 204 |
| 205 var oReturnsNumericString = { toString: function() { |
| 206 return "1"; |
| 207 } }; |
| 208 |
| 209 assertEquals(undefined, super[oReturnsNumericString]); |
| 210 assertEquals(undefined, super[1]); |
| 211 } |
| 171 }; | 212 }; |
| 172 Derived.prototype.testGetter = function() { | |
| 173 return super[x]; | |
| 174 }.toMethod(Derived.prototype); | |
| 175 Derived.prototype.testGetterStrict = function() { | |
| 176 'use strict'; | |
| 177 return super[x]; | |
| 178 }.toMethod(Derived.prototype); | |
| 179 Derived.prototype.testGetterWithToString = function() { | |
| 180 var toStringCalled; | |
| 181 var o = { toString: function() { | |
| 182 toStringCalled++; | |
| 183 return 'x'; | |
| 184 } }; | |
| 185 | 213 |
| 186 toStringCalled = 0; | |
| 187 assertEquals('derived', super[o]); | |
| 188 assertEquals(1, toStringCalled); | |
| 189 | |
| 190 var eToThrow = new Error(); | |
| 191 var oThrowsInToString = { toString: function() { | |
| 192 throw eToThrow; | |
| 193 } }; | |
| 194 | |
| 195 var ex = null; | |
| 196 try { | |
| 197 super[oThrowsInToString]; | |
| 198 } catch(e) { ex = e } | |
| 199 assertEquals(eToThrow, ex); | |
| 200 | |
| 201 var oReturnsNumericString = { toString: function() { | |
| 202 return "1"; | |
| 203 } }; | |
| 204 | |
| 205 assertEquals(undefined, super[oReturnsNumericString]); | |
| 206 assertEquals(undefined, super[1]); | |
| 207 }.toMethod(Derived.prototype); | |
| 208 derived = new Derived(); | 214 derived = new Derived(); |
| 209 assertEquals('derived', derived.testGetter()); | 215 assertEquals('derived', derived.testGetter()); |
| 210 derived = new Derived(); | 216 derived = new Derived(); |
| 211 assertEquals('derived', derived.testGetterStrict()); | 217 assertEquals('derived', derived.testGetterStrict()); |
| 212 derived = new Derived(); | 218 derived = new Derived(); |
| 213 derived.testGetterWithToString(); | 219 derived.testGetterWithToString(); |
| 214 }()); | 220 }()); |
| 215 | 221 |
| 216 | 222 |
| 217 (function TestGetterNumericKeyed() { | 223 (function TestGetterNumericKeyed() { |
| 218 var x = 42; | 224 var x = 42; |
| 219 function Base() {} | 225 function Base() {} |
| 220 var derived; | 226 var derived; |
| 221 Base.prototype = { | 227 Base.prototype = { |
| 222 constructor: Base, | 228 constructor: Base, |
| 223 _x: 'base' | 229 _x: 'base' |
| 224 }; | 230 }; |
| 225 | 231 |
| 226 Object.defineProperty(Base.prototype, x, { get: function() { | 232 Object.defineProperty(Base.prototype, x, { get: function() { |
| 227 assertSame(this, derived); | 233 assertSame(this, derived); |
| 228 return this._x; | 234 return this._x; |
| 229 }}); | 235 }}); |
| 230 | 236 |
| 231 function Derived() {} | 237 function Derived() {} |
| 232 Derived.__proto__ = Base; | 238 Derived.__proto__ = Base; |
| 233 Derived.prototype = { | 239 Derived.prototype = { |
| 234 __proto__: Base.prototype, | 240 __proto__: Base.prototype, |
| 235 constructor: Derived, | 241 constructor: Derived, |
| 236 _x: 'derived' | 242 _x: 'derived', |
| 243 testGetter() { |
| 244 return super[x]; |
| 245 }, |
| 246 testGetterStrict() { |
| 247 'use strict'; |
| 248 return super[x]; |
| 249 }, |
| 250 testGetterWithToString() { |
| 251 var toStringCalled; |
| 252 var o = { |
| 253 toString: function() { |
| 254 toStringCalled++; |
| 255 return '42'; |
| 256 } |
| 257 }; |
| 258 |
| 259 toStringCalled = 0; |
| 260 assertEquals('derived', super[o]); |
| 261 assertEquals(1, toStringCalled); |
| 262 |
| 263 var eToThrow = new Error(); |
| 264 var oThrowsInToString = { |
| 265 toString: function() { |
| 266 throw eToThrow; |
| 267 } |
| 268 }; |
| 269 |
| 270 var ex = null; |
| 271 try { |
| 272 super[oThrowsInToString]; |
| 273 } catch(e) { ex = e } |
| 274 assertEquals(eToThrow, ex); |
| 275 |
| 276 var oReturnsNumericString = { |
| 277 toString: function() { |
| 278 return "42"; |
| 279 } |
| 280 }; |
| 281 |
| 282 assertEquals('derived', super[oReturnsNumericString]); |
| 283 assertEquals('derived', super[42]); |
| 284 } |
| 237 }; | 285 }; |
| 238 Derived.prototype.testGetter = function() { | |
| 239 return super[x]; | |
| 240 }.toMethod(Derived.prototype); | |
| 241 Derived.prototype.testGetterStrict = function() { | |
| 242 'use strict'; | |
| 243 return super[x]; | |
| 244 }.toMethod(Derived.prototype); | |
| 245 | 286 |
| 246 Derived.prototype.testGetterWithToString = function() { | |
| 247 var toStringCalled; | |
| 248 var o = { toString: function() { | |
| 249 toStringCalled++; | |
| 250 return '42'; | |
| 251 } }; | |
| 252 | |
| 253 toStringCalled = 0; | |
| 254 assertEquals('derived', super[o]); | |
| 255 assertEquals(1, toStringCalled); | |
| 256 | |
| 257 var eToThrow = new Error(); | |
| 258 var oThrowsInToString = { toString: function() { | |
| 259 throw eToThrow; | |
| 260 } }; | |
| 261 | |
| 262 var ex = null; | |
| 263 try { | |
| 264 super[oThrowsInToString]; | |
| 265 } catch(e) { ex = e } | |
| 266 assertEquals(eToThrow, ex); | |
| 267 | |
| 268 var oReturnsNumericString = { toString: function() { | |
| 269 return "42"; | |
| 270 } }; | |
| 271 | |
| 272 assertEquals('derived', super[oReturnsNumericString]); | |
| 273 assertEquals('derived', super[42]); | |
| 274 }.toMethod(Derived.prototype); | |
| 275 derived = new Derived(); | 287 derived = new Derived(); |
| 276 assertEquals('derived', derived.testGetter()); | 288 assertEquals('derived', derived.testGetter()); |
| 277 derived = new Derived(); | 289 derived = new Derived(); |
| 278 assertEquals('derived', derived.testGetterStrict()); | 290 assertEquals('derived', derived.testGetterStrict()); |
| 279 derived = new Derived(); | 291 derived = new Derived(); |
| 280 derived.testGetterWithToString(); | 292 derived.testGetterWithToString(); |
| 281 }()); | 293 }()); |
| 282 | 294 |
| 283 | 295 |
| 284 (function TestSetter() { | 296 (function TestSetter() { |
| 285 function Base() {} | 297 function Base() {} |
| 286 Base.prototype = { | 298 Base.prototype = { |
| 287 constructor: Base, | 299 constructor: Base, |
| 288 get x() { | 300 get x() { |
| 289 return this._x; | 301 return this._x; |
| 290 }, | 302 }, |
| 291 set x(v) { | 303 set x(v) { |
| 292 this._x = v; | 304 this._x = v; |
| 293 }, | 305 }, |
| 294 _x: 'base' | 306 _x: 'base' |
| 295 }; | 307 }; |
| 296 | 308 |
| 297 function Derived() {} | 309 function Derived() {} |
| 298 Derived.__proto__ = Base; | 310 Derived.__proto__ = Base; |
| 299 Derived.prototype = { | 311 Derived.prototype = { |
| 300 __proto__: Base.prototype, | 312 __proto__: Base.prototype, |
| 301 constructor: Derived, | 313 constructor: Derived, |
| 302 _x: 'derived' | 314 _x: 'derived', |
| 315 testSetter() { |
| 316 assertEquals('foobar', super.x = 'foobar'); |
| 317 assertEquals('foobarabc', super.x += 'abc'); |
| 318 }, |
| 319 testSetterStrict() { |
| 320 'use strict'; |
| 321 assertEquals('foobar', super.x = 'foobar'); |
| 322 assertEquals('foobarabc', super.x += 'abc'); |
| 323 } |
| 303 }; | 324 }; |
| 304 Derived.prototype.testSetter = function() { | 325 |
| 305 assertEquals('foobar', super.x = 'foobar'); | |
| 306 assertEquals('foobarabc', super.x += 'abc'); | |
| 307 }.toMethod(Derived.prototype); | |
| 308 var d = new Derived(); | 326 var d = new Derived(); |
| 309 d.testSetter(); | 327 d.testSetter(); |
| 310 assertEquals('base', Base.prototype._x); | 328 assertEquals('base', Base.prototype._x); |
| 311 assertEquals('foobarabc', d._x); | 329 assertEquals('foobarabc', d._x); |
| 312 d._x = ''; | 330 d._x = ''; |
| 313 Derived.prototype.testSetterStrict = function() { | 331 |
| 314 'use strict'; | |
| 315 assertEquals('foobar', super.x = 'foobar'); | |
| 316 assertEquals('foobarabc', super.x += 'abc'); | |
| 317 }.toMethod(Derived.prototype); | |
| 318 d.testSetterStrict(); | 332 d.testSetterStrict(); |
| 319 assertEquals('base', Base.prototype._x); | 333 assertEquals('base', Base.prototype._x); |
| 320 assertEquals('foobarabc', d._x); | 334 assertEquals('foobarabc', d._x); |
| 321 }()); | 335 }()); |
| 322 | 336 |
| 323 | 337 |
| 324 (function TestSetterNumericKeyed() { | 338 (function TestSetterNumericKeyed() { |
| 325 var x = 42; | 339 var x = 42; |
| 326 function Base() {} | 340 function Base() {} |
| 327 Base.prototype = { | 341 Base.prototype = { |
| 328 constructor: Base, | 342 constructor: Base, |
| 329 _x: 'base' | 343 _x: 'base' |
| 330 }; | 344 }; |
| 331 | 345 |
| 332 Object.defineProperty(Base.prototype, x, | 346 Object.defineProperty(Base.prototype, x, |
| 333 { get: function() { return this._x; }, | 347 { get: function() { return this._x; }, |
| 334 set: function(v) { this._x = v; } | 348 set: function(v) { this._x = v; } |
| 335 }); | 349 }); |
| 336 | 350 |
| 337 function Derived() {} | 351 function Derived() {} |
| 338 Derived.__proto__ = Base; | 352 Derived.__proto__ = Base; |
| 339 Derived.prototype = { | 353 Derived.prototype = { |
| 340 __proto__: Base.prototype, | 354 __proto__: Base.prototype, |
| 341 constructor: Derived, | 355 constructor: Derived, |
| 342 _x: 'derived' | 356 _x: 'derived', |
| 357 testSetter() { |
| 358 assertEquals('foobar', super[x] = 'foobar'); |
| 359 assertEquals('foobarabc', super[x] += 'abc'); |
| 360 }, |
| 361 testSetterStrict() { |
| 362 'use strict'; |
| 363 assertEquals('foobar', super[x] = 'foobar'); |
| 364 assertEquals('foobarabc', super[x] += 'abc'); |
| 365 }, |
| 366 testSetterWithToString() { |
| 367 var toStringCalled; |
| 368 var o = { |
| 369 toString: function() { |
| 370 toStringCalled++; |
| 371 return x; |
| 372 } |
| 373 }; |
| 374 |
| 375 toStringCalled = 0; |
| 376 super[o] = 'set'; |
| 377 assertEquals(1, toStringCalled); |
| 378 assertEquals('set', this._x); |
| 379 |
| 380 var eToThrow = new Error(); |
| 381 var oThrowsInToString = { |
| 382 toString: function() { |
| 383 throw eToThrow; |
| 384 } |
| 385 }; |
| 386 |
| 387 var ex = null; |
| 388 try { |
| 389 super[oThrowsInToString] = 'xyz'; |
| 390 } catch(e) { ex = e } |
| 391 assertEquals(eToThrow, ex); |
| 392 assertEquals('set', this._x); |
| 393 } |
| 343 }; | 394 }; |
| 344 Derived.prototype.testSetter = function() { | 395 |
| 345 assertEquals('foobar', super[x] = 'foobar'); | |
| 346 assertEquals('foobarabc', super[x] += 'abc'); | |
| 347 }.toMethod(Derived.prototype); | |
| 348 var d = new Derived(); | 396 var d = new Derived(); |
| 349 d.testSetter(); | 397 d.testSetter(); |
| 350 assertEquals('base', Base.prototype._x); | 398 assertEquals('base', Base.prototype._x); |
| 351 assertEquals('foobarabc', d._x); | 399 assertEquals('foobarabc', d._x); |
| 352 d._x = ''; | 400 d._x = ''; |
| 353 Derived.prototype.testSetterStrict = function() { | 401 |
| 354 'use strict'; | |
| 355 assertEquals('foobar', super[x] = 'foobar'); | |
| 356 assertEquals('foobarabc', super[x] += 'abc'); | |
| 357 }.toMethod(Derived.prototype); | |
| 358 d.testSetterStrict(); | 402 d.testSetterStrict(); |
| 359 assertEquals('base', Base.prototype._x); | 403 assertEquals('base', Base.prototype._x); |
| 360 assertEquals('foobarabc', d._x); | 404 assertEquals('foobarabc', d._x); |
| 361 | 405 |
| 362 | |
| 363 Derived.prototype.testSetterWithToString = function() { | |
| 364 var toStringCalled; | |
| 365 var o = { toString: function() { | |
| 366 toStringCalled++; | |
| 367 return x; | |
| 368 } }; | |
| 369 | |
| 370 toStringCalled = 0; | |
| 371 super[o] = 'set'; | |
| 372 assertEquals(1, toStringCalled); | |
| 373 assertEquals('set', this._x); | |
| 374 | |
| 375 var eToThrow = new Error(); | |
| 376 var oThrowsInToString = { toString: function() { | |
| 377 throw eToThrow; | |
| 378 } }; | |
| 379 | |
| 380 var ex = null; | |
| 381 try { | |
| 382 super[oThrowsInToString] = 'xyz'; | |
| 383 } catch(e) { ex = e } | |
| 384 assertEquals(eToThrow, ex); | |
| 385 assertEquals('set', this._x); | |
| 386 }.toMethod(Derived.prototype); | |
| 387 d = new Derived(); | 406 d = new Derived(); |
| 388 d.testSetterWithToString(); | 407 d.testSetterWithToString(); |
| 389 }()); | 408 }()); |
| 390 | 409 |
| 391 | 410 |
| 392 (function TestSetterKeyed() { | 411 (function TestSetterKeyed() { |
| 393 var x = 'x'; | 412 var x = 'x'; |
| 394 function Base() {} | 413 function Base() {} |
| 395 Base.prototype = { | 414 Base.prototype = { |
| 396 constructor: Base, | 415 constructor: Base, |
| 397 get x() { | 416 get x() { |
| 398 return this._x; | 417 return this._x; |
| 399 }, | 418 }, |
| 400 set x(v) { | 419 set x(v) { |
| 401 this._x = v; | 420 this._x = v; |
| 402 }, | 421 }, |
| 403 _x: 'base' | 422 _x: 'base' |
| 404 }; | 423 }; |
| 405 | 424 |
| 406 function Derived() {} | 425 function Derived() {} |
| 407 Derived.__proto__ = Base; | 426 Derived.__proto__ = Base; |
| 408 Derived.prototype = { | 427 Derived.prototype = { |
| 409 __proto__: Base.prototype, | 428 __proto__: Base.prototype, |
| 410 constructor: Derived, | 429 constructor: Derived, |
| 411 _x: 'derived' | 430 _x: 'derived', |
| 431 testSetter() { |
| 432 assertEquals('foobar', super[x] = 'foobar'); |
| 433 assertEquals('foobarabc', super[x] += 'abc'); |
| 434 }, |
| 435 testSetterStrict() { |
| 436 'use strict'; |
| 437 assertEquals('foobar', super[x] = 'foobar'); |
| 438 assertEquals('foobarabc', super[x] += 'abc'); |
| 439 }, |
| 440 testSetterWithToString() { |
| 441 var toStringCalled; |
| 442 var o = { |
| 443 toString: function() { |
| 444 toStringCalled++; |
| 445 return 'x'; |
| 446 } |
| 447 }; |
| 448 |
| 449 toStringCalled = 0; |
| 450 super[o] = 'set'; |
| 451 assertEquals(1, toStringCalled); |
| 452 assertEquals('set', this._x); |
| 453 |
| 454 var eToThrow = new Error(); |
| 455 var oThrowsInToString = { |
| 456 toString: function() { |
| 457 throw eToThrow; |
| 458 } |
| 459 }; |
| 460 |
| 461 var ex = null; |
| 462 try { |
| 463 super[oThrowsInToString] = 'xyz'; |
| 464 } catch(e) { ex = e } |
| 465 assertEquals(eToThrow, ex); |
| 466 assertEquals('set', this._x); |
| 467 |
| 468 var oReturnsNumericString = { |
| 469 toString: function() { |
| 470 return "1"; |
| 471 } |
| 472 }; |
| 473 |
| 474 assertEquals('abc', super[oReturnsNumericString] = 'abc'); |
| 475 |
| 476 assertEquals('set', this._x); |
| 477 |
| 478 assertEquals(10, super[1] = 10); |
| 479 } |
| 412 }; | 480 }; |
| 413 Derived.prototype.testSetter = function() { | 481 |
| 414 assertEquals('foobar', super[x] = 'foobar'); | |
| 415 assertEquals('foobarabc', super[x] += 'abc'); | |
| 416 }.toMethod(Derived.prototype); | |
| 417 var d = new Derived(); | 482 var d = new Derived(); |
| 418 d.testSetter(); | 483 d.testSetter(); |
| 419 assertEquals('base', Base.prototype._x); | 484 assertEquals('base', Base.prototype._x); |
| 420 assertEquals('foobarabc', d._x); | 485 assertEquals('foobarabc', d._x); |
| 421 d._x = ''; | 486 d._x = ''; |
| 422 Derived.prototype.testSetterStrict = function() { | |
| 423 'use strict'; | |
| 424 assertEquals('foobar', super[x] = 'foobar'); | |
| 425 assertEquals('foobarabc', super[x] += 'abc'); | |
| 426 }.toMethod(Derived.prototype); | |
| 427 d.testSetterStrict(); | 487 d.testSetterStrict(); |
| 428 assertEquals('base', Base.prototype._x); | 488 assertEquals('base', Base.prototype._x); |
| 429 assertEquals('foobarabc', d._x); | 489 assertEquals('foobarabc', d._x); |
| 430 | 490 |
| 431 | |
| 432 Derived.prototype.testSetterWithToString = function() { | |
| 433 var toStringCalled; | |
| 434 var o = { toString: function() { | |
| 435 toStringCalled++; | |
| 436 return 'x'; | |
| 437 } }; | |
| 438 | |
| 439 toStringCalled = 0; | |
| 440 super[o] = 'set'; | |
| 441 assertEquals(1, toStringCalled); | |
| 442 assertEquals('set', this._x); | |
| 443 | |
| 444 var eToThrow = new Error(); | |
| 445 var oThrowsInToString = { toString: function() { | |
| 446 throw eToThrow; | |
| 447 } }; | |
| 448 | |
| 449 var ex = null; | |
| 450 try { | |
| 451 super[oThrowsInToString] = 'xyz'; | |
| 452 } catch(e) { ex = e } | |
| 453 assertEquals(eToThrow, ex); | |
| 454 assertEquals('set', this._x); | |
| 455 | |
| 456 var oReturnsNumericString = { toString: function() { | |
| 457 return "1"; | |
| 458 } }; | |
| 459 | |
| 460 assertEquals('abc', super[oReturnsNumericString] = 'abc'); | |
| 461 | |
| 462 assertEquals('set', this._x); | |
| 463 | |
| 464 assertEquals(10, super[1] = 10); | |
| 465 }.toMethod(Derived.prototype); | |
| 466 d = new Derived(); | 491 d = new Derived(); |
| 467 d.testSetterWithToString(); | 492 d.testSetterWithToString(); |
| 468 }()); | 493 }()); |
| 469 | 494 |
| 470 | 495 |
| 471 (function TestSetterDataProperties() { | 496 (function TestSetterDataProperties() { |
| 472 function Base() {} | 497 function Base() {} |
| 473 Base.prototype = { | 498 Base.prototype = { |
| 474 constructor: Base, | 499 constructor: Base, |
| 475 x: 'x from Base' | 500 x: 'x from Base' |
| 476 }; | 501 }; |
| 477 | 502 |
| 478 function Derived() {} | 503 function Derived() {} |
| 479 Derived.prototype = { | 504 Derived.prototype = { |
| 480 __proto__: Base.prototype, | 505 __proto__: Base.prototype, |
| 481 constructor: Derived, | 506 constructor: Derived, |
| 507 testSetter() { |
| 508 assertEquals('x from Base', super.x); |
| 509 super.x = 'data property'; |
| 510 assertEquals('x from Base', super.x); |
| 511 assertEquals('data property', this.x); |
| 512 } |
| 482 }; | 513 }; |
| 483 | 514 |
| 484 Derived.prototype.testSetter = function() { | |
| 485 assertEquals('x from Base', super.x); | |
| 486 super.x = 'data property'; | |
| 487 assertEquals('x from Base', super.x); | |
| 488 assertEquals('data property', this.x); | |
| 489 }.toMethod(Derived.prototype); | |
| 490 | |
| 491 new Derived().testSetter(); | 515 new Derived().testSetter(); |
| 492 }()); | 516 }()); |
| 493 | 517 |
| 494 | 518 |
| 495 (function TestKeyedSetterDataProperties() { | 519 (function TestKeyedSetterDataProperties() { |
| 496 var x = 'x'; | 520 var x = 'x'; |
| 497 function Base() {} | 521 function Base() {} |
| 498 Base.prototype = { | 522 Base.prototype = { |
| 499 constructor: Base, | 523 constructor: Base, |
| 500 x: 'x from Base' | 524 x: 'x from Base' |
| 501 }; | 525 }; |
| 502 | 526 |
| 503 function Derived() {} | 527 function Derived() {} |
| 504 Derived.prototype = { | 528 Derived.prototype = { |
| 505 __proto__: Base.prototype, | 529 __proto__: Base.prototype, |
| 506 constructor: Derived, | 530 constructor: Derived, |
| 531 testSetter() { |
| 532 assertEquals('x from Base', super[x]); |
| 533 super[x] = 'data property'; |
| 534 assertEquals('x from Base', super[x]); |
| 535 assertEquals('data property', this[x]); |
| 536 } |
| 507 }; | 537 }; |
| 508 | 538 |
| 509 Derived.prototype.testSetter = function() { | |
| 510 assertEquals('x from Base', super[x]); | |
| 511 super[x] = 'data property'; | |
| 512 assertEquals('x from Base', super[x]); | |
| 513 assertEquals('data property', this[x]); | |
| 514 }.toMethod(Derived.prototype); | |
| 515 | |
| 516 new Derived().testSetter(); | 539 new Derived().testSetter(); |
| 517 }()); | 540 }()); |
| 518 | 541 |
| 519 | 542 |
| 520 (function TestKeyedNumericSetterDataProperties() { | 543 (function TestKeyedNumericSetterDataProperties() { |
| 521 var x = 42; | 544 var x = 42; |
| 522 function Base() {} | 545 function Base() {} |
| 523 Base.prototype = { | 546 Base.prototype = { |
| 524 constructor: Base, | 547 constructor: Base, |
| 525 42: 'x from Base' | 548 42: 'x from Base' |
| 526 }; | 549 }; |
| 527 | 550 |
| 528 function Derived() {} | 551 function Derived() {} |
| 529 Derived.prototype = { | 552 Derived.prototype = { |
| 530 __proto__: Base.prototype, | 553 __proto__: Base.prototype, |
| 531 constructor: Derived, | 554 constructor: Derived, |
| 555 testSetter() { |
| 556 assertEquals('x from Base', super[x]); |
| 557 super[x] = 'data property'; |
| 558 assertEquals('x from Base', super[x]); |
| 559 assertEquals('data property', this[x]); |
| 560 } |
| 532 }; | 561 }; |
| 533 | 562 |
| 534 Derived.prototype.testSetter = function() { | |
| 535 assertEquals('x from Base', super[x]); | |
| 536 super[x] = 'data property'; | |
| 537 assertEquals('x from Base', super[x]); | |
| 538 assertEquals('data property', this[x]); | |
| 539 }.toMethod(Derived.prototype); | |
| 540 | |
| 541 new Derived().testSetter(); | 563 new Derived().testSetter(); |
| 542 }()); | 564 }()); |
| 543 | 565 |
| 544 | 566 |
| 545 (function TestAccessorsOnPrimitives() { | 567 (function TestAccessorsOnPrimitives() { |
| 546 var getCalled = 0; | 568 var getCalled = 0; |
| 547 var setCalled = 0; | 569 var setCalled = 0; |
| 548 function Base() {} | 570 function Base() {} |
| 549 Base.prototype = { | 571 Base.prototype = { |
| 550 constructor: Base, | 572 constructor: Base, |
| 551 get x() { | 573 get x() { |
| 552 getCalled++; | 574 getCalled++; |
| 553 return 1; | 575 return 1; |
| 554 }, | 576 }, |
| 555 set x(v) { | 577 set x(v) { |
| 556 setCalled++; | 578 setCalled++; |
| 557 return v; | 579 return v; |
| 558 }, | 580 }, |
| 559 }; | 581 }; |
| 560 | 582 |
| 561 function Derived() {} | 583 function Derived() {} |
| 562 Derived.prototype = { | 584 Derived.prototype = { |
| 563 __proto__: Base.prototype, | 585 __proto__: Base.prototype, |
| 564 constructor: Derived, | 586 constructor: Derived, |
| 565 }; | 587 testSetter() { |
| 566 Derived.prototype.testSetter = function() { | 588 setCalled = 0; |
| 567 setCalled = 0; | 589 getCalled = 0; |
| 568 getCalled = 0; | 590 assertEquals('object', typeof this); |
| 569 assertEquals('object', typeof this); | 591 assertTrue(this instanceof Number) |
| 570 assertTrue(this instanceof Number) | 592 assertEquals(42, this.valueOf()); |
| 571 assertEquals(42, this.valueOf()); | 593 assertEquals(1, super.x); |
| 572 assertEquals(1, super.x); | 594 assertEquals(1, getCalled); |
| 573 assertEquals(1, getCalled); | 595 assertEquals(0, setCalled); |
| 574 assertEquals(0, setCalled); | |
| 575 | 596 |
| 576 assertEquals(5, super.x = 5); | 597 assertEquals(5, super.x = 5); |
| 577 assertEquals(1, getCalled); | 598 assertEquals(1, getCalled); |
| 578 assertEquals(1, setCalled); | 599 assertEquals(1, setCalled); |
| 579 | 600 |
| 580 assertEquals(6, super.x += 5); | 601 assertEquals(6, super.x += 5); |
| 581 assertEquals(2, getCalled); | 602 assertEquals(2, getCalled); |
| 582 assertEquals(2, setCalled); | 603 assertEquals(2, setCalled); |
| 583 | 604 |
| 584 super.newProperty = 15; | 605 super.newProperty = 15; |
| 585 assertEquals(15, this.newProperty); | 606 assertEquals(15, this.newProperty); |
| 586 assertEquals(undefined, super.newProperty); | 607 assertEquals(undefined, super.newProperty); |
| 587 }.toMethod(Derived.prototype); | 608 }, |
| 609 testSetterStrict() { |
| 610 'use strict'; |
| 611 getCalled = 0; |
| 612 setCalled = 0; |
| 613 assertTrue(42 === this); |
| 588 | 614 |
| 589 Derived.prototype.testSetterStrict = function() { | 615 assertEquals(1, super.x); |
| 590 'use strict'; | 616 assertEquals(1, getCalled); |
| 591 getCalled = 0; | 617 assertEquals(0, setCalled); |
| 592 setCalled = 0; | |
| 593 assertTrue(42 === this); | |
| 594 | 618 |
| 595 assertEquals(1, super.x); | 619 assertEquals(5, super.x = 5); |
| 596 assertEquals(1, getCalled); | 620 assertEquals(1, getCalled); |
| 597 assertEquals(0, setCalled); | 621 assertEquals(1, setCalled); |
| 598 | 622 |
| 599 assertEquals(5, super.x = 5); | 623 assertEquals(6, super.x += 5); |
| 600 assertEquals(1, getCalled); | 624 assertEquals(2, getCalled); |
| 601 assertEquals(1, setCalled); | 625 assertEquals(2, setCalled); |
| 602 | 626 |
| 603 assertEquals(6, super.x += 5); | 627 var ex; |
| 604 assertEquals(2, getCalled); | 628 try { |
| 605 assertEquals(2, setCalled); | 629 super.newProperty = 15; |
| 606 | 630 } catch (e) { ex = e; } |
| 607 var ex; | 631 assertTrue(ex instanceof TypeError); |
| 608 try { | 632 } |
| 609 super.newProperty = 15; | 633 } |
| 610 } catch (e) { ex = e; } | |
| 611 assertTrue(ex instanceof TypeError); | |
| 612 }.toMethod(Derived.prototype); | |
| 613 | 634 |
| 614 Derived.prototype.testSetter.call(42); | 635 Derived.prototype.testSetter.call(42); |
| 615 Derived.prototype.testSetterStrict.call(42); | 636 Derived.prototype.testSetterStrict.call(42); |
| 616 | 637 |
| 617 function DerivedFromString() {} | 638 function DerivedFromString() {} |
| 618 DerivedFromString.prototype = Object.create(String.prototype); | 639 DerivedFromString.prototype = { |
| 640 __proto__: String.prototype, |
| 641 f() { |
| 642 'use strict'; |
| 643 assertTrue(42 === this); |
| 644 assertEquals(String.prototype.toString, super.toString); |
| 645 var ex; |
| 646 try { |
| 647 super.toString(); |
| 648 } catch(e) { ex = e; } |
| 619 | 649 |
| 620 function f() { | 650 assertTrue(ex instanceof TypeError); |
| 621 'use strict'; | 651 } |
| 622 assertTrue(42 === this); | 652 }; |
| 623 assertEquals(String.prototype.toString, super.toString); | |
| 624 var ex; | |
| 625 try { | |
| 626 super.toString(); | |
| 627 } catch(e) { ex = e; } | |
| 628 | 653 |
| 629 assertTrue(ex instanceof TypeError); | 654 DerivedFromString.prototype.f.call(42); |
| 630 } | |
| 631 f.toMethod(DerivedFromString.prototype).call(42); | |
| 632 }()); | 655 }()); |
| 633 | 656 |
| 634 | 657 |
| 635 (function TestKeyedAccessorsOnPrimitives() { | 658 (function TestKeyedAccessorsOnPrimitives() { |
| 636 var x = 'x'; | 659 var x = 'x'; |
| 637 var newProperty = 'newProperty'; | 660 var newProperty = 'newProperty'; |
| 638 var toString = 'toString'; | 661 var toString = 'toString'; |
| 639 var getCalled = 0; | 662 var getCalled = 0; |
| 640 var setCalled = 0; | 663 var setCalled = 0; |
| 641 function Base() {} | 664 function Base() {} |
| 642 Base.prototype = { | 665 Base.prototype = { |
| 643 constructor: Base, | 666 constructor: Base, |
| 644 get x() { | 667 get x() { |
| 645 getCalled++; | 668 getCalled++; |
| 646 return 1; | 669 return 1; |
| 647 }, | 670 }, |
| 648 set x(v) { | 671 set x(v) { |
| 649 setCalled++; | 672 setCalled++; |
| 650 return v; | 673 return v; |
| 651 }, | 674 }, |
| 652 }; | 675 }; |
| 653 | 676 |
| 654 function Derived() {} | 677 function Derived() {} |
| 655 Derived.prototype = { | 678 Derived.prototype = { |
| 656 __proto__: Base.prototype, | 679 __proto__: Base.prototype, |
| 657 constructor: Derived, | 680 constructor: Derived, |
| 681 testSetter() { |
| 682 setCalled = 0; |
| 683 getCalled = 0; |
| 684 assertEquals('object', typeof this); |
| 685 assertTrue(this instanceof Number) |
| 686 assertEquals(42, this.valueOf()); |
| 687 assertEquals(1, super[x]); |
| 688 assertEquals(1, getCalled); |
| 689 assertEquals(0, setCalled); |
| 690 |
| 691 assertEquals(5, super[x] = 5); |
| 692 assertEquals(1, getCalled); |
| 693 assertEquals(1, setCalled); |
| 694 |
| 695 assertEquals(6, super[x] += 5); |
| 696 assertEquals(2, getCalled); |
| 697 assertEquals(2, setCalled); |
| 698 |
| 699 super[newProperty] = 15; |
| 700 assertEquals(15, this[newProperty]); |
| 701 assertEquals(undefined, super[newProperty]); |
| 702 }, |
| 703 testSetterStrict() { |
| 704 'use strict'; |
| 705 getCalled = 0; |
| 706 setCalled = 0; |
| 707 assertTrue(42 === this); |
| 708 |
| 709 assertEquals(1, super[x]); |
| 710 assertEquals(1, getCalled); |
| 711 assertEquals(0, setCalled); |
| 712 |
| 713 assertEquals(5, super[x] = 5); |
| 714 assertEquals(1, getCalled); |
| 715 assertEquals(1, setCalled); |
| 716 |
| 717 assertEquals(6, super[x] += 5); |
| 718 assertEquals(2, getCalled); |
| 719 assertEquals(2, setCalled); |
| 720 |
| 721 var ex; |
| 722 try { |
| 723 super[newProperty] = 15; |
| 724 } catch (e) { ex = e; } |
| 725 assertTrue(ex instanceof TypeError); |
| 726 } |
| 658 }; | 727 }; |
| 659 Derived.prototype.testSetter = function() { | |
| 660 setCalled = 0; | |
| 661 getCalled = 0; | |
| 662 assertEquals('object', typeof this); | |
| 663 assertTrue(this instanceof Number) | |
| 664 assertEquals(42, this.valueOf()); | |
| 665 assertEquals(1, super[x]); | |
| 666 assertEquals(1, getCalled); | |
| 667 assertEquals(0, setCalled); | |
| 668 | |
| 669 assertEquals(5, super[x] = 5); | |
| 670 assertEquals(1, getCalled); | |
| 671 assertEquals(1, setCalled); | |
| 672 | |
| 673 assertEquals(6, super[x] += 5); | |
| 674 assertEquals(2, getCalled); | |
| 675 assertEquals(2, setCalled); | |
| 676 | |
| 677 super[newProperty] = 15; | |
| 678 assertEquals(15, this[newProperty]); | |
| 679 assertEquals(undefined, super[newProperty]); | |
| 680 }.toMethod(Derived.prototype); | |
| 681 | |
| 682 Derived.prototype.testSetterStrict = function() { | |
| 683 'use strict'; | |
| 684 getCalled = 0; | |
| 685 setCalled = 0; | |
| 686 assertTrue(42 === this); | |
| 687 | |
| 688 assertEquals(1, super[x]); | |
| 689 assertEquals(1, getCalled); | |
| 690 assertEquals(0, setCalled); | |
| 691 | |
| 692 assertEquals(5, super[x] = 5); | |
| 693 assertEquals(1, getCalled); | |
| 694 assertEquals(1, setCalled); | |
| 695 | |
| 696 assertEquals(6, super[x] += 5); | |
| 697 assertEquals(2, getCalled); | |
| 698 assertEquals(2, setCalled); | |
| 699 | |
| 700 var ex; | |
| 701 try { | |
| 702 super[newProperty] = 15; | |
| 703 } catch (e) { ex = e; } | |
| 704 assertTrue(ex instanceof TypeError); | |
| 705 }.toMethod(Derived.prototype); | |
| 706 | 728 |
| 707 Derived.prototype.testSetter.call(42); | 729 Derived.prototype.testSetter.call(42); |
| 708 Derived.prototype.testSetterStrict.call(42); | 730 Derived.prototype.testSetterStrict.call(42); |
| 709 | 731 |
| 710 function DerivedFromString() {} | 732 function DerivedFromString() {} |
| 711 DerivedFromString.prototype = Object.create(String.prototype); | 733 DerivedFromString.prototype = { |
| 734 __proto__: String.prototype, |
| 735 f() { |
| 736 'use strict'; |
| 737 assertTrue(42 === this); |
| 738 assertEquals(String.prototype.toString, super[toString]); |
| 739 var ex; |
| 740 try { |
| 741 super[toString](); |
| 742 } catch(e) { ex = e; } |
| 712 | 743 |
| 713 function f() { | 744 assertTrue(ex instanceof TypeError); |
| 714 'use strict'; | 745 } |
| 715 assertTrue(42 === this); | 746 }; |
| 716 assertEquals(String.prototype.toString, super[toString]); | 747 DerivedFromString.prototype.f.call(42); |
| 717 var ex; | |
| 718 try { | |
| 719 super[toString](); | |
| 720 } catch(e) { ex = e; } | |
| 721 | |
| 722 assertTrue(ex instanceof TypeError); | |
| 723 } | |
| 724 f.toMethod(DerivedFromString.prototype).call(42); | |
| 725 }()); | 748 }()); |
| 726 | 749 |
| 727 | 750 |
| 728 (function TestNumericKeyedAccessorsOnPrimitives() { | 751 (function TestNumericKeyedAccessorsOnPrimitives() { |
| 729 var x = 42; | 752 var x = 42; |
| 730 var newProperty = 43; | 753 var newProperty = 43; |
| 731 var getCalled = 0; | 754 var getCalled = 0; |
| 732 var setCalled = 0; | 755 var setCalled = 0; |
| 733 function Base() {} | 756 function Base() {} |
| 734 Base.prototype = { | 757 Base.prototype = { |
| 735 constructor: Base, | 758 constructor: Base, |
| 736 }; | 759 }; |
| 737 | 760 |
| 738 Object.defineProperty(Base.prototype, x, { | 761 Object.defineProperty(Base.prototype, x, { |
| 739 get: function() { | 762 get: function() { |
| 740 getCalled++; | 763 getCalled++; |
| 741 return 1; | 764 return 1; |
| 742 }, | 765 }, |
| 743 set: function(v) { | 766 set: function(v) { |
| 744 setCalled++; | 767 setCalled++; |
| 745 return v; | 768 return v; |
| 746 } | 769 } |
| 747 }); | 770 }); |
| 748 | 771 |
| 749 function Derived() {} | 772 function Derived() {} |
| 750 Derived.prototype = { | 773 Derived.prototype = { |
| 751 __proto__: Base.prototype, | 774 __proto__: Base.prototype, |
| 752 constructor: Derived, | 775 constructor: Derived, |
| 776 testSetter() { |
| 777 setCalled = 0; |
| 778 getCalled = 0; |
| 779 assertEquals('object', typeof this); |
| 780 assertTrue(this instanceof Number) |
| 781 assertEquals(42, this.valueOf()); |
| 782 assertEquals(1, super[x]); |
| 783 assertEquals(1, getCalled); |
| 784 assertEquals(0, setCalled); |
| 785 |
| 786 assertEquals(5, super[x] = 5); |
| 787 assertEquals(1, getCalled); |
| 788 assertEquals(1, setCalled); |
| 789 |
| 790 assertEquals(6, super[x] += 5); |
| 791 assertEquals(2, getCalled); |
| 792 assertEquals(2, setCalled); |
| 793 |
| 794 super[newProperty] = 15; |
| 795 assertEquals(15, this[newProperty]); |
| 796 assertEquals(undefined, super[newProperty]); |
| 797 }, |
| 798 testSetterStrict() { |
| 799 'use strict'; |
| 800 getCalled = 0; |
| 801 setCalled = 0; |
| 802 assertTrue(42 === this); |
| 803 |
| 804 assertEquals(1, super[x]); |
| 805 assertEquals(1, getCalled); |
| 806 assertEquals(0, setCalled); |
| 807 |
| 808 assertEquals(5, super[x] = 5); |
| 809 assertEquals(1, getCalled); |
| 810 assertEquals(1, setCalled); |
| 811 |
| 812 assertEquals(6, super[x] += 5); |
| 813 assertEquals(2, getCalled); |
| 814 assertEquals(2, setCalled); |
| 815 |
| 816 var ex; |
| 817 try { |
| 818 super[newProperty] = 15; |
| 819 } catch (e) { ex = e; } |
| 820 assertTrue(ex instanceof TypeError); |
| 821 } |
| 753 }; | 822 }; |
| 754 Derived.prototype.testSetter = function() { | |
| 755 setCalled = 0; | |
| 756 getCalled = 0; | |
| 757 assertEquals('object', typeof this); | |
| 758 assertTrue(this instanceof Number) | |
| 759 assertEquals(42, this.valueOf()); | |
| 760 assertEquals(1, super[x]); | |
| 761 assertEquals(1, getCalled); | |
| 762 assertEquals(0, setCalled); | |
| 763 | |
| 764 assertEquals(5, super[x] = 5); | |
| 765 assertEquals(1, getCalled); | |
| 766 assertEquals(1, setCalled); | |
| 767 | |
| 768 assertEquals(6, super[x] += 5); | |
| 769 assertEquals(2, getCalled); | |
| 770 assertEquals(2, setCalled); | |
| 771 | |
| 772 super[newProperty] = 15; | |
| 773 assertEquals(15, this[newProperty]); | |
| 774 assertEquals(undefined, super[newProperty]); | |
| 775 }.toMethod(Derived.prototype); | |
| 776 | |
| 777 Derived.prototype.testSetterStrict = function() { | |
| 778 'use strict'; | |
| 779 getCalled = 0; | |
| 780 setCalled = 0; | |
| 781 assertTrue(42 === this); | |
| 782 | |
| 783 assertEquals(1, super[x]); | |
| 784 assertEquals(1, getCalled); | |
| 785 assertEquals(0, setCalled); | |
| 786 | |
| 787 assertEquals(5, super[x] = 5); | |
| 788 assertEquals(1, getCalled); | |
| 789 assertEquals(1, setCalled); | |
| 790 | |
| 791 assertEquals(6, super[x] += 5); | |
| 792 assertEquals(2, getCalled); | |
| 793 assertEquals(2, setCalled); | |
| 794 | |
| 795 var ex; | |
| 796 try { | |
| 797 super[newProperty] = 15; | |
| 798 } catch (e) { ex = e; } | |
| 799 assertTrue(ex instanceof TypeError); | |
| 800 }.toMethod(Derived.prototype); | |
| 801 | 823 |
| 802 Derived.prototype.testSetter.call(42); | 824 Derived.prototype.testSetter.call(42); |
| 803 Derived.prototype.testSetterStrict.call(42); | 825 Derived.prototype.testSetterStrict.call(42); |
| 804 }()); | 826 }()); |
| 805 | 827 |
| 806 | 828 |
| 807 (function TestKeyedNumericSetterOnExotics() { | 829 (function TestKeyedNumericSetterOnExotics() { |
| 808 function Base() {} | 830 function Base() {} |
| 809 function Derived() {} | 831 function Derived() {} |
| 810 Derived.prototype = { __proto__: Base.prototype }; | 832 Derived.prototype = { |
| 833 __proto__: Base.prototype, |
| 834 callSetterOnArray() { |
| 835 super[42] = 1; |
| 836 }, |
| 837 callStrictSetterOnString() { |
| 838 'use strict'; |
| 839 assertEquals('string', typeof this); |
| 840 assertTrue('abcdef' === this); |
| 841 var ex = null; |
| 842 try { |
| 843 super[5] = 'q'; |
| 844 } catch(e) { ex = e; } |
| 845 assertTrue(ex instanceof TypeError); |
| 811 | 846 |
| 812 Derived.prototype.callSetterOnArray = function() { | 847 ex = null; |
| 813 super[42] = 1; | 848 try { |
| 814 }.toMethod(Derived.prototype); | 849 super[1024] = 'q'; |
| 815 | 850 } catch(e) { ex = e; } |
| 816 Derived.prototype.callStrictSetterOnString = function() { | 851 assertTrue(ex instanceof TypeError); |
| 817 'use strict'; | 852 } |
| 818 assertEquals('string', typeof this); | 853 }; |
| 819 assertTrue('abcdef' === this); | |
| 820 var ex = null; | |
| 821 try { | |
| 822 super[5] = 'q'; | |
| 823 } catch(e) { ex = e; } | |
| 824 assertTrue(ex instanceof TypeError); | |
| 825 | |
| 826 ex = null; | |
| 827 try { | |
| 828 super[1024] = 'q'; | |
| 829 } catch(e) { ex = e; } | |
| 830 assertTrue(ex instanceof TypeError); | |
| 831 }.toMethod(Derived.prototype); | |
| 832 | 854 |
| 833 var x = []; | 855 var x = []; |
| 834 assertEquals(0, x.length); | 856 assertEquals(0, x.length); |
| 835 Derived.prototype.callSetterOnArray.call(x); | 857 Derived.prototype.callSetterOnArray.call(x); |
| 836 assertEquals(43, x.length); | 858 assertEquals(43, x.length); |
| 837 assertEquals(1, x[42]); | 859 assertEquals(1, x[42]); |
| 838 | 860 |
| 839 var s = 'abcdef'; | 861 var s = 'abcdef'; |
| 840 Derived.prototype.callStrictSetterOnString.call(s) | 862 Derived.prototype.callStrictSetterOnString.call(s) |
| 841 }()); | 863 }()); |
| 842 | 864 |
| 843 | 865 |
| 844 (function TestSetterUndefinedProperties() { | 866 (function TestSetterUndefinedProperties() { |
| 845 function Base() {} | 867 function Base() {} |
| 846 function Derived() {} | 868 function Derived() {} |
| 847 Derived.prototype = { __proto__ : Base.prototype }; | 869 Derived.prototype = { |
| 848 Derived.prototype.mSloppy = function () { | 870 __proto__: Base.prototype, |
| 849 assertEquals(undefined, super.x); | 871 mSloppy() { |
| 850 assertEquals(undefined, this.x); | 872 assertEquals(undefined, super.x); |
| 851 super.x = 10; | 873 assertEquals(undefined, this.x); |
| 852 assertEquals(10, this.x); | 874 super.x = 10; |
| 853 assertEquals(undefined, super.x); | 875 assertEquals(10, this.x); |
| 854 }.toMethod(Derived.prototype); | 876 assertEquals(undefined, super.x); |
| 877 }, |
| 878 mStrict() { |
| 879 'use strict'; |
| 880 assertEquals(undefined, super.x); |
| 881 assertEquals(undefined, this.x); |
| 882 super.x = 10; |
| 883 assertEquals(10, this.x); |
| 884 assertEquals(undefined, super.x); |
| 885 } |
| 886 }; |
| 855 | 887 |
| 856 Derived.prototype.mStrict = function () { | |
| 857 'use strict'; | |
| 858 assertEquals(undefined, super.x); | |
| 859 assertEquals(undefined, this.x); | |
| 860 super.x = 10; | |
| 861 assertEquals(10, this.x); | |
| 862 assertEquals(undefined, super.x); | |
| 863 }.toMethod(Derived.prototype); | |
| 864 var d = new Derived(); | 888 var d = new Derived(); |
| 865 d.mSloppy(); | 889 d.mSloppy(); |
| 866 assertEquals(10, d.x); | 890 assertEquals(10, d.x); |
| 867 var d1 = new Derived(); | 891 var d1 = new Derived(); |
| 868 d1.mStrict(); | 892 d1.mStrict(); |
| 869 assertEquals(10, d.x); | 893 assertEquals(10, d.x); |
| 870 }()); | 894 }()); |
| 871 | 895 |
| 872 | 896 |
| 873 (function TestKeyedSetterUndefinedProperties() { | 897 (function TestKeyedSetterUndefinedProperties() { |
| 874 var x = 'x'; | 898 var x = 'x'; |
| 875 function Base() {} | 899 function Base() {} |
| 876 function Derived() {} | 900 function Derived() {} |
| 877 Derived.prototype = { __proto__ : Base.prototype }; | 901 Derived.prototype = { |
| 878 Derived.prototype.mSloppy = function () { | 902 __proto__: Base.prototype, |
| 879 assertEquals(undefined, super[x]); | 903 mSloppy() { |
| 880 assertEquals(undefined, this[x]); | 904 assertEquals(undefined, super[x]); |
| 881 super[x] = 10; | 905 assertEquals(undefined, this[x]); |
| 882 assertEquals(10, this[x]); | 906 super[x] = 10; |
| 883 assertEquals(undefined, super[x]); | 907 assertEquals(10, this[x]); |
| 884 }.toMethod(Derived.prototype); | 908 assertEquals(undefined, super[x]); |
| 885 | 909 }, |
| 886 Derived.prototype.mStrict = function () { | 910 mStrict() { |
| 887 'use strict'; | 911 'use strict'; |
| 888 assertEquals(undefined, super[x]); | 912 assertEquals(undefined, super[x]); |
| 889 assertEquals(undefined, this[x]); | 913 assertEquals(undefined, this[x]); |
| 890 super[x] = 10; | 914 super[x] = 10; |
| 891 assertEquals(10, this[x]); | 915 assertEquals(10, this[x]); |
| 892 assertEquals(undefined, super[x]); | 916 assertEquals(undefined, super[x]); |
| 893 }.toMethod(Derived.prototype); | 917 } |
| 918 }; |
| 894 var d = new Derived(); | 919 var d = new Derived(); |
| 895 d.mSloppy(); | 920 d.mSloppy(); |
| 896 assertEquals(10, d.x); | 921 assertEquals(10, d.x); |
| 897 var d1 = new Derived(); | 922 var d1 = new Derived(); |
| 898 d1.mStrict(); | 923 d1.mStrict(); |
| 899 assertEquals(10, d.x); | 924 assertEquals(10, d.x); |
| 900 }()); | 925 }()); |
| 901 | 926 |
| 902 | 927 |
| 903 (function TestKeyedNumericSetterUndefinedProperties() { | 928 (function TestKeyedNumericSetterUndefinedProperties() { |
| 904 var x = 42; | 929 var x = 42; |
| 905 function Base() {} | 930 function Base() {} |
| 906 function Derived() {} | 931 function Derived() {} |
| 907 Derived.prototype = { __proto__ : Base.prototype }; | 932 Derived.prototype = { |
| 908 Derived.prototype.mSloppy = function () { | 933 __proto__: Base.prototype, |
| 909 assertEquals(undefined, super[x]); | 934 mSloppy() { |
| 910 assertEquals(undefined, this[x]); | 935 assertEquals(undefined, super[x]); |
| 911 super[x] = 10; | 936 assertEquals(undefined, this[x]); |
| 912 assertEquals(10, this[x]); | 937 super[x] = 10; |
| 913 assertEquals(undefined, super[x]); | 938 assertEquals(10, this[x]); |
| 914 }.toMethod(Derived.prototype); | 939 assertEquals(undefined, super[x]); |
| 915 | 940 }, |
| 916 Derived.prototype.mStrict = function () { | 941 mStrict() { |
| 917 'use strict'; | 942 'use strict'; |
| 918 assertEquals(undefined, super[x]); | 943 assertEquals(undefined, super[x]); |
| 919 assertEquals(undefined, this[x]); | 944 assertEquals(undefined, this[x]); |
| 920 super[x] = 10; | 945 super[x] = 10; |
| 921 assertEquals(10, this[x]); | 946 assertEquals(10, this[x]); |
| 922 assertEquals(undefined, super[x]); | 947 assertEquals(undefined, super[x]); |
| 923 }.toMethod(Derived.prototype); | 948 } |
| 949 }; |
| 924 var d = new Derived(); | 950 var d = new Derived(); |
| 925 d.mSloppy(); | 951 d.mSloppy(); |
| 926 assertEquals(10, d[x]); | 952 assertEquals(10, d[x]); |
| 927 var d1 = new Derived(); | 953 var d1 = new Derived(); |
| 928 d1.mStrict(); | 954 d1.mStrict(); |
| 929 assertEquals(10, d[x]); | 955 assertEquals(10, d[x]); |
| 930 }()); | 956 }()); |
| 931 | 957 |
| 932 | 958 |
| 933 (function TestSetterCreatingOwnProperties() { | 959 (function TestSetterCreatingOwnProperties() { |
| 960 var setterCalled; |
| 934 function Base() {} | 961 function Base() {} |
| 935 function Derived() {} | 962 function Derived() {} |
| 936 Derived.prototype = { __proto__ : Base.prototype }; | 963 Derived.prototype = { |
| 937 var setterCalled; | 964 __proto__: Base.prototype, |
| 965 mSloppy() { |
| 966 assertEquals(42, this.ownReadOnly); |
| 967 super.ownReadOnly = 55; |
| 968 assertEquals(42, this.ownReadOnly); |
| 938 | 969 |
| 939 Derived.prototype.mSloppy = function() { | 970 assertEquals(15, this.ownReadonlyAccessor); |
| 940 assertEquals(42, this.ownReadOnly); | 971 super.ownReadonlyAccessor = 55; |
| 941 super.ownReadOnly = 55; | 972 assertEquals(15, this.ownReadonlyAccessor); |
| 942 assertEquals(42, this.ownReadOnly); | |
| 943 | 973 |
| 944 assertEquals(15, this.ownReadonlyAccessor); | 974 setterCalled = 0; |
| 945 super.ownReadonlyAccessor = 55; | 975 super.ownSetter = 42; |
| 946 assertEquals(15, this.ownReadonlyAccessor); | 976 assertEquals(1, setterCalled); |
| 977 }, |
| 978 mStrict() { |
| 979 'use strict'; |
| 980 assertEquals(42, this.ownReadOnly); |
| 981 var ex; |
| 982 try { |
| 983 super.ownReadOnly = 55; |
| 984 } catch(e) { ex = e; } |
| 985 assertTrue(ex instanceof TypeError); |
| 986 assertEquals(42, this.ownReadOnly); |
| 947 | 987 |
| 948 setterCalled = 0; | 988 assertEquals(15, this.ownReadonlyAccessor); |
| 949 super.ownSetter = 42; | 989 ex = null; |
| 950 assertEquals(1, setterCalled); | 990 try { |
| 951 }.toMethod(Derived.prototype); | 991 super.ownReadonlyAccessor = 55; |
| 992 } catch(e) { ex = e; } |
| 993 assertTrue(ex instanceof TypeError); |
| 994 assertEquals(15, this.ownReadonlyAccessor); |
| 952 | 995 |
| 953 Derived.prototype.mStrict = function() { | 996 setterCalled = 0; |
| 954 'use strict'; | 997 super.ownSetter = 42; |
| 955 assertEquals(42, this.ownReadOnly); | 998 assertEquals(1, setterCalled); |
| 956 var ex; | 999 } |
| 957 try { | 1000 }; |
| 958 super.ownReadOnly = 55; | |
| 959 } catch(e) { ex = e; } | |
| 960 assertTrue(ex instanceof TypeError); | |
| 961 assertEquals(42, this.ownReadOnly); | |
| 962 | |
| 963 assertEquals(15, this.ownReadonlyAccessor); | |
| 964 ex = null; | |
| 965 try { | |
| 966 super.ownReadonlyAccessor = 55; | |
| 967 } catch(e) { ex = e; } | |
| 968 assertTrue(ex instanceof TypeError); | |
| 969 assertEquals(15, this.ownReadonlyAccessor); | |
| 970 | |
| 971 setterCalled = 0; | |
| 972 super.ownSetter = 42; | |
| 973 assertEquals(1, setterCalled); | |
| 974 }.toMethod(Derived.prototype); | |
| 975 | 1001 |
| 976 var d = new Derived(); | 1002 var d = new Derived(); |
| 977 Object.defineProperty(d, 'ownReadOnly', { value : 42, writable : false }); | 1003 Object.defineProperty(d, 'ownReadOnly', { value : 42, writable : false }); |
| 978 Object.defineProperty(d, 'ownSetter', | 1004 Object.defineProperty(d, 'ownSetter', |
| 979 { set : function() { setterCalled++; } }); | 1005 { set : function() { setterCalled++; } }); |
| 980 Object.defineProperty(d, 'ownReadonlyAccessor', | 1006 Object.defineProperty(d, 'ownReadonlyAccessor', |
| 981 { get : function() { return 15; }}); | 1007 { get : function() { return 15; }}); |
| 982 d.mSloppy(); | 1008 d.mSloppy(); |
| 983 d.mStrict(); | 1009 d.mStrict(); |
| 984 }()); | 1010 }()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 999 this.x_.push(v); | 1025 this.x_.push(v); |
| 1000 }, | 1026 }, |
| 1001 }; | 1027 }; |
| 1002 | 1028 |
| 1003 function Derived() { | 1029 function Derived() { |
| 1004 this.x_ = []; | 1030 this.x_ = []; |
| 1005 } | 1031 } |
| 1006 Derived.prototype = { | 1032 Derived.prototype = { |
| 1007 __proto__: Base.prototype, | 1033 __proto__: Base.prototype, |
| 1008 constructor: Derived, | 1034 constructor: Derived, |
| 1035 testIter() { |
| 1036 setCalled = 0; |
| 1037 getCalled = 0; |
| 1038 for (super.x in [1,2,3]) {} |
| 1039 assertEquals(0, getCalled); |
| 1040 assertEquals(3, setCalled); |
| 1041 assertEquals(["0", "1", "2"], this.x_); |
| 1042 }, |
| 1043 testIterKeyed() { |
| 1044 setCalled = 0; |
| 1045 getCalled = 0; |
| 1046 for (super[x] in [1,2,3]) {} |
| 1047 assertEquals(0, getCalled); |
| 1048 assertEquals(3, setCalled); |
| 1049 assertEquals(["0","1","2"], this.x_); |
| 1050 |
| 1051 this.x_ = []; |
| 1052 setCalled = 0; |
| 1053 getCalled = 0; |
| 1054 var toStringCalled = 0; |
| 1055 var o = {toString: function () { toStringCalled++; return x }}; |
| 1056 for (super[o] in [1,2,3]) {} |
| 1057 assertEquals(0, getCalled); |
| 1058 assertEquals(3, setCalled); |
| 1059 assertEquals(3, toStringCalled); |
| 1060 assertEquals(["0","1","2"], this.x_); |
| 1061 } |
| 1009 }; | 1062 }; |
| 1010 | 1063 |
| 1011 Derived.prototype.testIter = function() { | |
| 1012 setCalled = 0; | |
| 1013 getCalled = 0; | |
| 1014 for (super.x in [1,2,3]) {} | |
| 1015 assertEquals(0, getCalled); | |
| 1016 assertEquals(3, setCalled); | |
| 1017 assertEquals(["0","1","2"], this.x_); | |
| 1018 }.toMethod(Derived.prototype); | |
| 1019 | |
| 1020 new Derived().testIter(); | 1064 new Derived().testIter(); |
| 1021 | 1065 |
| 1022 var x = 'x'; | 1066 var x = 'x'; |
| 1023 Derived.prototype.testIterKeyed = function() { | |
| 1024 setCalled = 0; | |
| 1025 getCalled = 0; | |
| 1026 for (super[x] in [1,2,3]) {} | |
| 1027 assertEquals(0, getCalled); | |
| 1028 assertEquals(3, setCalled); | |
| 1029 assertEquals(["0","1","2"], this.x_); | |
| 1030 | |
| 1031 this.x_ = []; | |
| 1032 setCalled = 0; | |
| 1033 getCalled = 0; | |
| 1034 var toStringCalled = 0; | |
| 1035 var o = {toString: function () { toStringCalled++; return x }}; | |
| 1036 for (super[o] in [1,2,3]) {} | |
| 1037 assertEquals(0, getCalled); | |
| 1038 assertEquals(3, setCalled); | |
| 1039 assertEquals(3, toStringCalled); | |
| 1040 assertEquals(["0","1","2"], this.x_); | |
| 1041 }.toMethod(Derived.prototype); | |
| 1042 | 1067 |
| 1043 new Derived().testIterKeyed(); | 1068 new Derived().testIterKeyed(); |
| 1044 }()); | 1069 }()); |
| 1045 | 1070 |
| 1046 | 1071 |
| 1047 (function TestKeyedSetterCreatingOwnProperties() { | 1072 (function TestKeyedSetterCreatingOwnProperties() { |
| 1048 var ownReadOnly = 'ownReadOnly'; | 1073 var ownReadOnly = 'ownReadOnly'; |
| 1049 var ownReadonlyAccessor = 'ownReadonlyAccessor'; | 1074 var ownReadonlyAccessor = 'ownReadonlyAccessor'; |
| 1050 var ownSetter = 'ownSetter'; | 1075 var ownSetter = 'ownSetter'; |
| 1076 var setterCalled; |
| 1051 function Base() {} | 1077 function Base() {} |
| 1052 function Derived() {} | 1078 function Derived() {} |
| 1053 Derived.prototype = { __proto__ : Base.prototype }; | 1079 Derived.prototype = { |
| 1054 var setterCalled; | 1080 __proto__: Base.prototype, |
| 1081 mSloppy() { |
| 1082 assertEquals(42, this[ownReadOnly]); |
| 1083 super[ownReadOnly] = 55; |
| 1084 assertEquals(42, this[ownReadOnly]); |
| 1055 | 1085 |
| 1056 Derived.prototype.mSloppy = function() { | 1086 assertEquals(15, this[ownReadonlyAccessor]); |
| 1057 assertEquals(42, this[ownReadOnly]); | 1087 super[ownReadonlyAccessor] = 55; |
| 1058 super[ownReadOnly] = 55; | 1088 assertEquals(15, this[ownReadonlyAccessor]); |
| 1059 assertEquals(42, this[ownReadOnly]); | |
| 1060 | 1089 |
| 1061 assertEquals(15, this[ownReadonlyAccessor]); | 1090 setterCalled = 0; |
| 1062 super[ownReadonlyAccessor] = 55; | 1091 super[ownSetter] = 42; |
| 1063 assertEquals(15, this[ownReadonlyAccessor]); | 1092 assertEquals(1, setterCalled); |
| 1093 }, |
| 1094 mStrict() { |
| 1095 'use strict'; |
| 1096 assertEquals(42, this[ownReadOnly]); |
| 1097 var ex; |
| 1098 try { |
| 1099 super[ownReadOnly] = 55; |
| 1100 } catch(e) { ex = e; } |
| 1101 assertTrue(ex instanceof TypeError); |
| 1102 assertEquals(42, this[ownReadOnly]); |
| 1064 | 1103 |
| 1065 setterCalled = 0; | 1104 assertEquals(15, this[ownReadonlyAccessor]); |
| 1066 super[ownSetter] = 42; | 1105 ex = null; |
| 1067 assertEquals(1, setterCalled); | 1106 try { |
| 1068 }.toMethod(Derived.prototype); | 1107 super[ownReadonlyAccessor] = 55; |
| 1108 } catch(e) { ex = e; } |
| 1109 assertTrue(ex instanceof TypeError); |
| 1110 assertEquals(15, this[ownReadonlyAccessor]); |
| 1069 | 1111 |
| 1070 Derived.prototype.mStrict = function() { | 1112 setterCalled = 0; |
| 1071 'use strict'; | 1113 super[ownSetter] = 42; |
| 1072 assertEquals(42, this[ownReadOnly]); | 1114 assertEquals(1, setterCalled); |
| 1073 var ex; | 1115 } |
| 1074 try { | 1116 }; |
| 1075 super[ownReadOnly] = 55; | |
| 1076 } catch(e) { ex = e; } | |
| 1077 assertTrue(ex instanceof TypeError); | |
| 1078 assertEquals(42, this[ownReadOnly]); | |
| 1079 | |
| 1080 assertEquals(15, this[ownReadonlyAccessor]); | |
| 1081 ex = null; | |
| 1082 try { | |
| 1083 super[ownReadonlyAccessor] = 55; | |
| 1084 } catch(e) { ex = e; } | |
| 1085 assertTrue(ex instanceof TypeError); | |
| 1086 assertEquals(15, this[ownReadonlyAccessor]); | |
| 1087 | |
| 1088 setterCalled = 0; | |
| 1089 super[ownSetter] = 42; | |
| 1090 assertEquals(1, setterCalled); | |
| 1091 }.toMethod(Derived.prototype); | |
| 1092 | 1117 |
| 1093 var d = new Derived(); | 1118 var d = new Derived(); |
| 1094 Object.defineProperty(d, 'ownReadOnly', { value : 42, writable : false }); | 1119 Object.defineProperty(d, 'ownReadOnly', { value : 42, writable : false }); |
| 1095 Object.defineProperty(d, 'ownSetter', | 1120 Object.defineProperty(d, 'ownSetter', |
| 1096 { set : function() { setterCalled++; } }); | 1121 { set : function() { setterCalled++; } }); |
| 1097 Object.defineProperty(d, 'ownReadonlyAccessor', | 1122 Object.defineProperty(d, 'ownReadonlyAccessor', |
| 1098 { get : function() { return 15; }}); | 1123 { get : function() { return 15; }}); |
| 1099 d.mSloppy(); | 1124 d.mSloppy(); |
| 1100 d.mStrict(); | 1125 d.mStrict(); |
| 1101 }()); | 1126 }()); |
| 1102 | 1127 |
| 1103 | 1128 |
| 1104 (function TestKeyedNumericSetterCreatingOwnProperties() { | 1129 (function TestKeyedNumericSetterCreatingOwnProperties() { |
| 1105 var ownReadOnly = 42; | 1130 var ownReadOnly = 42; |
| 1106 var ownReadonlyAccessor = 43; | 1131 var ownReadonlyAccessor = 43; |
| 1107 var ownSetter = 44; | 1132 var ownSetter = 44; |
| 1133 var setterCalled; |
| 1108 function Base() {} | 1134 function Base() {} |
| 1109 function Derived() {} | 1135 function Derived() {} |
| 1110 Derived.prototype = { __proto__ : Base.prototype }; | 1136 Derived.prototype = { |
| 1111 var setterCalled; | 1137 __proto__: Base.prototype, |
| 1138 mSloppy() { |
| 1139 assertEquals(42, this[ownReadOnly]); |
| 1140 super[ownReadOnly] = 55; |
| 1141 assertEquals(42, this[ownReadOnly]); |
| 1112 | 1142 |
| 1113 Derived.prototype.mSloppy = function() { | 1143 assertEquals(15, this[ownReadonlyAccessor]); |
| 1114 assertEquals(42, this[ownReadOnly]); | 1144 super[ownReadonlyAccessor] = 55; |
| 1115 super[ownReadOnly] = 55; | 1145 assertEquals(15, this[ownReadonlyAccessor]); |
| 1116 assertEquals(42, this[ownReadOnly]); | |
| 1117 | 1146 |
| 1118 assertEquals(15, this[ownReadonlyAccessor]); | 1147 setterCalled = 0; |
| 1119 super[ownReadonlyAccessor] = 55; | 1148 super[ownSetter] = 42; |
| 1120 assertEquals(15, this[ownReadonlyAccessor]); | 1149 assertEquals(1, setterCalled); |
| 1150 }, |
| 1151 mStrict() { |
| 1152 'use strict'; |
| 1153 assertEquals(42, this[ownReadOnly]); |
| 1154 var ex; |
| 1155 try { |
| 1156 super[ownReadOnly] = 55; |
| 1157 } catch(e) { ex = e; } |
| 1158 assertTrue(ex instanceof TypeError); |
| 1159 assertEquals(42, this[ownReadOnly]); |
| 1121 | 1160 |
| 1122 setterCalled = 0; | 1161 assertEquals(15, this[ownReadonlyAccessor]); |
| 1123 super[ownSetter] = 42; | 1162 ex = null; |
| 1124 assertEquals(1, setterCalled); | 1163 try { |
| 1125 }.toMethod(Derived.prototype); | 1164 super[ownReadonlyAccessor] = 55; |
| 1165 } catch(e) { ex = e; } |
| 1166 assertTrue(ex instanceof TypeError); |
| 1167 assertEquals(15, this[ownReadonlyAccessor]); |
| 1126 | 1168 |
| 1127 Derived.prototype.mStrict = function() { | 1169 setterCalled = 0; |
| 1128 'use strict'; | 1170 super[ownSetter] = 42; |
| 1129 assertEquals(42, this[ownReadOnly]); | 1171 assertEquals(1, setterCalled); |
| 1130 var ex; | 1172 } |
| 1131 try { | 1173 } |
| 1132 super[ownReadOnly] = 55; | |
| 1133 } catch(e) { ex = e; } | |
| 1134 assertTrue(ex instanceof TypeError); | |
| 1135 assertEquals(42, this[ownReadOnly]); | |
| 1136 | |
| 1137 assertEquals(15, this[ownReadonlyAccessor]); | |
| 1138 ex = null; | |
| 1139 try { | |
| 1140 super[ownReadonlyAccessor] = 55; | |
| 1141 } catch(e) { ex = e; } | |
| 1142 assertTrue(ex instanceof TypeError); | |
| 1143 assertEquals(15, this[ownReadonlyAccessor]); | |
| 1144 | |
| 1145 setterCalled = 0; | |
| 1146 super[ownSetter] = 42; | |
| 1147 assertEquals(1, setterCalled); | |
| 1148 }.toMethod(Derived.prototype); | |
| 1149 | 1174 |
| 1150 var d = new Derived(); | 1175 var d = new Derived(); |
| 1151 Object.defineProperty(d, ownReadOnly, { value : 42, writable : false }); | 1176 Object.defineProperty(d, ownReadOnly, { value : 42, writable : false }); |
| 1152 Object.defineProperty(d, ownSetter, | 1177 Object.defineProperty(d, ownSetter, |
| 1153 { set : function() { setterCalled++; } }); | 1178 { set : function() { setterCalled++; } }); |
| 1154 Object.defineProperty(d, ownReadonlyAccessor, | 1179 Object.defineProperty(d, ownReadonlyAccessor, |
| 1155 { get : function() { return 15; }}); | 1180 { get : function() { return 15; }}); |
| 1156 d.mSloppy(); | 1181 d.mSloppy(); |
| 1157 d.mStrict(); | 1182 d.mStrict(); |
| 1158 }()); | 1183 }()); |
| 1159 | 1184 |
| 1160 | 1185 |
| 1161 (function TestSetterNoProtoWalk() { | 1186 (function TestSetterNoProtoWalk() { |
| 1162 function Base() {} | 1187 function Base() {} |
| 1163 function Derived() {} | 1188 function Derived() {} |
| 1164 var getCalled; | 1189 var getCalled; |
| 1165 var setCalled; | 1190 var setCalled; |
| 1166 Derived.prototype = { | 1191 Derived.prototype = { |
| 1167 __proto__ : Base.prototype, | 1192 __proto__: Base.prototype, |
| 1168 get x() { getCalled++; return 42; }, | 1193 get x() { getCalled++; return 42; }, |
| 1169 set x(v) { setCalled++; } | 1194 set x(v) { setCalled++; }, |
| 1195 mSloppy() { |
| 1196 setCalled = 0; |
| 1197 getCalled = 0; |
| 1198 assertEquals(42, this.x); |
| 1199 assertEquals(1, getCalled); |
| 1200 assertEquals(0, setCalled); |
| 1201 |
| 1202 getCalled = 0; |
| 1203 setCalled = 0; |
| 1204 this.x = 43; |
| 1205 assertEquals(0, getCalled); |
| 1206 assertEquals(1, setCalled); |
| 1207 |
| 1208 getCalled = 0; |
| 1209 setCalled = 0; |
| 1210 super.x = 15; |
| 1211 assertEquals(0, setCalled); |
| 1212 assertEquals(0, getCalled); |
| 1213 |
| 1214 assertEquals(15, this.x); |
| 1215 assertEquals(0, getCalled); |
| 1216 assertEquals(0, setCalled); |
| 1217 }, |
| 1218 mStrict() { |
| 1219 'use strict'; |
| 1220 setCalled = 0; |
| 1221 getCalled = 0; |
| 1222 assertEquals(42, this.x); |
| 1223 assertEquals(1, getCalled); |
| 1224 assertEquals(0, setCalled); |
| 1225 |
| 1226 getCalled = 0; |
| 1227 setCalled = 0; |
| 1228 this.x = 43; |
| 1229 assertEquals(0, getCalled); |
| 1230 assertEquals(1, setCalled); |
| 1231 |
| 1232 getCalled = 0; |
| 1233 setCalled = 0; |
| 1234 super.x = 15; |
| 1235 assertEquals(0, setCalled); |
| 1236 assertEquals(0, getCalled); |
| 1237 |
| 1238 assertEquals(15, this.x); |
| 1239 assertEquals(0, getCalled); |
| 1240 assertEquals(0, setCalled); |
| 1241 } |
| 1170 }; | 1242 }; |
| 1171 | 1243 |
| 1172 Derived.prototype.mSloppy = function() { | |
| 1173 setCalled = 0; | |
| 1174 getCalled = 0; | |
| 1175 assertEquals(42, this.x); | |
| 1176 assertEquals(1, getCalled); | |
| 1177 assertEquals(0, setCalled); | |
| 1178 | |
| 1179 getCalled = 0; | |
| 1180 setCalled = 0; | |
| 1181 this.x = 43; | |
| 1182 assertEquals(0, getCalled); | |
| 1183 assertEquals(1, setCalled); | |
| 1184 | |
| 1185 getCalled = 0; | |
| 1186 setCalled = 0; | |
| 1187 super.x = 15; | |
| 1188 assertEquals(0, setCalled); | |
| 1189 assertEquals(0, getCalled); | |
| 1190 | |
| 1191 assertEquals(15, this.x); | |
| 1192 assertEquals(0, getCalled); | |
| 1193 assertEquals(0, setCalled); | |
| 1194 | |
| 1195 }.toMethod(Derived.prototype); | |
| 1196 | |
| 1197 Derived.prototype.mStrict = function() { | |
| 1198 'use strict'; | |
| 1199 setCalled = 0; | |
| 1200 getCalled = 0; | |
| 1201 assertEquals(42, this.x); | |
| 1202 assertEquals(1, getCalled); | |
| 1203 assertEquals(0, setCalled); | |
| 1204 | |
| 1205 getCalled = 0; | |
| 1206 setCalled = 0; | |
| 1207 this.x = 43; | |
| 1208 assertEquals(0, getCalled); | |
| 1209 assertEquals(1, setCalled); | |
| 1210 | |
| 1211 getCalled = 0; | |
| 1212 setCalled = 0; | |
| 1213 super.x = 15; | |
| 1214 assertEquals(0, setCalled); | |
| 1215 assertEquals(0, getCalled); | |
| 1216 | |
| 1217 assertEquals(15, this.x); | |
| 1218 assertEquals(0, getCalled); | |
| 1219 assertEquals(0, setCalled); | |
| 1220 | |
| 1221 }.toMethod(Derived.prototype); | |
| 1222 | |
| 1223 new Derived().mSloppy(); | 1244 new Derived().mSloppy(); |
| 1224 new Derived().mStrict(); | 1245 new Derived().mStrict(); |
| 1225 }()); | 1246 }()); |
| 1226 | 1247 |
| 1227 | 1248 |
| 1228 (function TestKeyedSetterNoProtoWalk() { | 1249 (function TestKeyedSetterNoProtoWalk() { |
| 1229 var x = 'x'; | 1250 var x = 'x'; |
| 1230 function Base() {} | 1251 function Base() {} |
| 1231 function Derived() {} | 1252 function Derived() {} |
| 1232 var getCalled; | 1253 var getCalled; |
| 1233 var setCalled; | 1254 var setCalled; |
| 1234 Derived.prototype = { | 1255 Derived.prototype = { |
| 1235 __proto__ : Base.prototype, | 1256 __proto__: Base.prototype, |
| 1236 get x() { getCalled++; return 42; }, | 1257 get x() { getCalled++; return 42; }, |
| 1237 set x(v) { setCalled++; } | 1258 set x(v) { setCalled++; }, |
| 1259 mSloppy() { |
| 1260 setCalled = 0; |
| 1261 getCalled = 0; |
| 1262 assertEquals(42, this[x]); |
| 1263 assertEquals(1, getCalled); |
| 1264 assertEquals(0, setCalled); |
| 1265 |
| 1266 getCalled = 0; |
| 1267 setCalled = 0; |
| 1268 this[x] = 43; |
| 1269 assertEquals(0, getCalled); |
| 1270 assertEquals(1, setCalled); |
| 1271 |
| 1272 getCalled = 0; |
| 1273 setCalled = 0; |
| 1274 super[x] = 15; |
| 1275 assertEquals(0, setCalled); |
| 1276 assertEquals(0, getCalled); |
| 1277 |
| 1278 assertEquals(15, this[x]); |
| 1279 assertEquals(0, getCalled); |
| 1280 assertEquals(0, setCalled); |
| 1281 }, |
| 1282 mStrict() { |
| 1283 'use strict'; |
| 1284 setCalled = 0; |
| 1285 getCalled = 0; |
| 1286 assertEquals(42, this[x]); |
| 1287 assertEquals(1, getCalled); |
| 1288 assertEquals(0, setCalled); |
| 1289 |
| 1290 getCalled = 0; |
| 1291 setCalled = 0; |
| 1292 this[x] = 43; |
| 1293 assertEquals(0, getCalled); |
| 1294 assertEquals(1, setCalled); |
| 1295 |
| 1296 getCalled = 0; |
| 1297 setCalled = 0; |
| 1298 super[x] = 15; |
| 1299 assertEquals(0, setCalled); |
| 1300 assertEquals(0, getCalled); |
| 1301 |
| 1302 assertEquals(15, this[x]); |
| 1303 assertEquals(0, getCalled); |
| 1304 assertEquals(0, setCalled); |
| 1305 } |
| 1238 }; | 1306 }; |
| 1239 | 1307 |
| 1240 Derived.prototype.mSloppy = function() { | |
| 1241 setCalled = 0; | |
| 1242 getCalled = 0; | |
| 1243 assertEquals(42, this[x]); | |
| 1244 assertEquals(1, getCalled); | |
| 1245 assertEquals(0, setCalled); | |
| 1246 | |
| 1247 getCalled = 0; | |
| 1248 setCalled = 0; | |
| 1249 this[x] = 43; | |
| 1250 assertEquals(0, getCalled); | |
| 1251 assertEquals(1, setCalled); | |
| 1252 | |
| 1253 getCalled = 0; | |
| 1254 setCalled = 0; | |
| 1255 super[x] = 15; | |
| 1256 assertEquals(0, setCalled); | |
| 1257 assertEquals(0, getCalled); | |
| 1258 | |
| 1259 assertEquals(15, this[x]); | |
| 1260 assertEquals(0, getCalled); | |
| 1261 assertEquals(0, setCalled); | |
| 1262 | |
| 1263 }.toMethod(Derived.prototype); | |
| 1264 | |
| 1265 Derived.prototype.mStrict = function() { | |
| 1266 'use strict'; | |
| 1267 setCalled = 0; | |
| 1268 getCalled = 0; | |
| 1269 assertEquals(42, this[x]); | |
| 1270 assertEquals(1, getCalled); | |
| 1271 assertEquals(0, setCalled); | |
| 1272 | |
| 1273 getCalled = 0; | |
| 1274 setCalled = 0; | |
| 1275 this[x] = 43; | |
| 1276 assertEquals(0, getCalled); | |
| 1277 assertEquals(1, setCalled); | |
| 1278 | |
| 1279 getCalled = 0; | |
| 1280 setCalled = 0; | |
| 1281 super[x] = 15; | |
| 1282 assertEquals(0, setCalled); | |
| 1283 assertEquals(0, getCalled); | |
| 1284 | |
| 1285 assertEquals(15, this[x]); | |
| 1286 assertEquals(0, getCalled); | |
| 1287 assertEquals(0, setCalled); | |
| 1288 | |
| 1289 }.toMethod(Derived.prototype); | |
| 1290 | |
| 1291 new Derived().mSloppy(); | 1308 new Derived().mSloppy(); |
| 1292 new Derived().mStrict(); | 1309 new Derived().mStrict(); |
| 1293 }()); | 1310 }()); |
| 1294 | 1311 |
| 1295 | 1312 |
| 1296 (function TestKeyedNumericSetterNoProtoWalk() { | 1313 (function TestKeyedNumericSetterNoProtoWalk() { |
| 1297 var x = 42; | 1314 var x = 42; |
| 1298 function Base() {} | 1315 function Base() {} |
| 1299 function Derived() {} | 1316 function Derived() {} |
| 1300 var getCalled; | 1317 var getCalled; |
| 1301 var setCalled; | 1318 var setCalled; |
| 1302 Derived.prototype = { | 1319 Derived.prototype = { |
| 1303 __proto__ : Base.prototype, | 1320 __proto__: Base.prototype, |
| 1321 mSloppy() { |
| 1322 setCalled = 0; |
| 1323 getCalled = 0; |
| 1324 assertEquals(42, this[x]); |
| 1325 assertEquals(1, getCalled); |
| 1326 assertEquals(0, setCalled); |
| 1327 |
| 1328 getCalled = 0; |
| 1329 setCalled = 0; |
| 1330 this[x] = 43; |
| 1331 assertEquals(0, getCalled); |
| 1332 assertEquals(1, setCalled); |
| 1333 |
| 1334 getCalled = 0; |
| 1335 setCalled = 0; |
| 1336 super[x] = 15; |
| 1337 assertEquals(0, setCalled); |
| 1338 assertEquals(0, getCalled); |
| 1339 |
| 1340 assertEquals(15, this[x]); |
| 1341 assertEquals(0, getCalled); |
| 1342 assertEquals(0, setCalled); |
| 1343 }, |
| 1344 mStrict() { |
| 1345 'use strict'; |
| 1346 setCalled = 0; |
| 1347 getCalled = 0; |
| 1348 assertEquals(42, this[x]); |
| 1349 assertEquals(1, getCalled); |
| 1350 assertEquals(0, setCalled); |
| 1351 |
| 1352 getCalled = 0; |
| 1353 setCalled = 0; |
| 1354 this[x] = 43; |
| 1355 assertEquals(0, getCalled); |
| 1356 assertEquals(1, setCalled); |
| 1357 |
| 1358 getCalled = 0; |
| 1359 setCalled = 0; |
| 1360 super[x] = 15; |
| 1361 assertEquals(0, setCalled); |
| 1362 assertEquals(0, getCalled); |
| 1363 |
| 1364 assertEquals(15, this[x]); |
| 1365 assertEquals(0, getCalled); |
| 1366 assertEquals(0, setCalled); |
| 1367 } |
| 1304 }; | 1368 }; |
| 1305 | 1369 |
| 1306 Object.defineProperty(Derived.prototype, x, { | 1370 Object.defineProperty(Derived.prototype, x, { |
| 1307 get: function() { getCalled++; return 42; }, | 1371 get: function() { getCalled++; return 42; }, |
| 1308 set: function(v) { setCalled++; } | 1372 set: function(v) { setCalled++; } |
| 1309 }); | 1373 }); |
| 1310 | 1374 |
| 1311 Derived.prototype.mSloppy = function() { | |
| 1312 setCalled = 0; | |
| 1313 getCalled = 0; | |
| 1314 assertEquals(42, this[x]); | |
| 1315 assertEquals(1, getCalled); | |
| 1316 assertEquals(0, setCalled); | |
| 1317 | |
| 1318 getCalled = 0; | |
| 1319 setCalled = 0; | |
| 1320 this[x] = 43; | |
| 1321 assertEquals(0, getCalled); | |
| 1322 assertEquals(1, setCalled); | |
| 1323 | |
| 1324 getCalled = 0; | |
| 1325 setCalled = 0; | |
| 1326 super[x] = 15; | |
| 1327 assertEquals(0, setCalled); | |
| 1328 assertEquals(0, getCalled); | |
| 1329 | |
| 1330 assertEquals(15, this[x]); | |
| 1331 assertEquals(0, getCalled); | |
| 1332 assertEquals(0, setCalled); | |
| 1333 | |
| 1334 }.toMethod(Derived.prototype); | |
| 1335 | |
| 1336 Derived.prototype.mStrict = function() { | |
| 1337 'use strict'; | |
| 1338 setCalled = 0; | |
| 1339 getCalled = 0; | |
| 1340 assertEquals(42, this[x]); | |
| 1341 assertEquals(1, getCalled); | |
| 1342 assertEquals(0, setCalled); | |
| 1343 | |
| 1344 getCalled = 0; | |
| 1345 setCalled = 0; | |
| 1346 this[x] = 43; | |
| 1347 assertEquals(0, getCalled); | |
| 1348 assertEquals(1, setCalled); | |
| 1349 | |
| 1350 getCalled = 0; | |
| 1351 setCalled = 0; | |
| 1352 super[x] = 15; | |
| 1353 assertEquals(0, setCalled); | |
| 1354 assertEquals(0, getCalled); | |
| 1355 | |
| 1356 assertEquals(15, this[x]); | |
| 1357 assertEquals(0, getCalled); | |
| 1358 assertEquals(0, setCalled); | |
| 1359 | |
| 1360 }.toMethod(Derived.prototype); | |
| 1361 | |
| 1362 new Derived().mSloppy(); | 1375 new Derived().mSloppy(); |
| 1363 new Derived().mStrict(); | 1376 new Derived().mStrict(); |
| 1364 }()); | 1377 }()); |
| 1365 | 1378 |
| 1366 | 1379 |
| 1367 (function TestSetterDoesNotReconfigure() { | 1380 (function TestSetterDoesNotReconfigure() { |
| 1368 function Base() {} | 1381 function Base() {} |
| 1369 function Derived() {} | 1382 function Derived() {} |
| 1383 Derived.prototype = { |
| 1384 __proto__: Derived.prototype, |
| 1385 mStrict(){ |
| 1386 'use strict'; |
| 1387 super.nonEnumConfig = 5; |
| 1388 var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumConfig'); |
| 1389 assertEquals(5, d1.value); |
| 1390 assertTrue(d1.configurable); |
| 1391 assertFalse(d1.enumerable); |
| 1370 | 1392 |
| 1371 Derived.prototype.mStrict = function (){ | 1393 super.nonEnumNonConfig = 5; |
| 1372 'use strict'; | 1394 var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumNonConfig'); |
| 1373 super.nonEnumConfig = 5; | 1395 assertEquals(5, d1.value); |
| 1374 var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumConfig'); | 1396 assertFalse(d1.configurable); |
| 1375 assertEquals(5, d1.value); | 1397 assertFalse(d1.enumerable); |
| 1376 assertTrue(d1.configurable); | 1398 }, |
| 1377 assertFalse(d1.enumerable); | 1399 mSloppy(){ |
| 1400 super.nonEnumConfig = 42; |
| 1401 var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumConfig'); |
| 1402 assertEquals(42, d1.value); |
| 1403 assertTrue(d1.configurable); |
| 1404 assertFalse(d1.enumerable); |
| 1378 | 1405 |
| 1379 super.nonEnumNonConfig = 5; | 1406 super.nonEnumNonConfig = 42; |
| 1380 var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumNonConfig'); | 1407 var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumNonConfig'); |
| 1381 assertEquals(5, d1.value); | 1408 assertEquals(42, d1.value); |
| 1382 assertFalse(d1.configurable); | 1409 assertFalse(d1.configurable); |
| 1383 assertFalse(d1.enumerable); | 1410 assertFalse(d1.enumerable); |
| 1384 }.toMethod(Derived.prototype); | 1411 } |
| 1385 | 1412 }; |
| 1386 Derived.prototype.mSloppy = function (){ | |
| 1387 super.nonEnumConfig = 42; | |
| 1388 var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumConfig'); | |
| 1389 assertEquals(42, d1.value); | |
| 1390 assertTrue(d1.configurable); | |
| 1391 assertFalse(d1.enumerable); | |
| 1392 | |
| 1393 super.nonEnumNonConfig = 42; | |
| 1394 var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumNonConfig'); | |
| 1395 assertEquals(42, d1.value); | |
| 1396 assertFalse(d1.configurable); | |
| 1397 assertFalse(d1.enumerable); | |
| 1398 }.toMethod(Derived.prototype); | |
| 1399 | 1413 |
| 1400 var d = new Derived(); | 1414 var d = new Derived(); |
| 1401 Object.defineProperty(d, 'nonEnumConfig', | 1415 Object.defineProperty(d, 'nonEnumConfig', |
| 1402 { value : 0, enumerable : false, configurable : true, writable : true }); | 1416 { value : 0, enumerable : false, configurable : true, writable : true }); |
| 1403 Object.defineProperty(d, 'nonEnumNonConfig', | 1417 Object.defineProperty(d, 'nonEnumNonConfig', |
| 1404 { value : 0, enumerable : false, configurable : false, writable : true }); | 1418 { value : 0, enumerable : false, configurable : false, writable : true }); |
| 1405 d.mStrict(); | 1419 d.mStrict(); |
| 1406 d.mSloppy(); | 1420 d.mSloppy(); |
| 1407 }()); | 1421 }()); |
| 1408 | 1422 |
| 1409 | 1423 |
| 1410 (function TestKeyedSetterDoesNotReconfigure() { | 1424 (function TestKeyedSetterDoesNotReconfigure() { |
| 1411 var nonEnumConfig = 'nonEnumConfig'; | 1425 var nonEnumConfig = 'nonEnumConfig'; |
| 1412 var nonEnumNonConfig = 'nonEnumNonConfig'; | 1426 var nonEnumNonConfig = 'nonEnumNonConfig'; |
| 1413 function Base() {} | 1427 function Base() {} |
| 1414 function Derived() {} | 1428 function Derived() {} |
| 1415 | 1429 |
| 1416 Derived.prototype = { __proto__: Base.prototype }; | 1430 Derived.prototype = { |
| 1431 __proto__: Base.prototype, |
| 1432 mStrict(){ |
| 1433 'use strict'; |
| 1434 super[nonEnumConfig] = 5; |
| 1435 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumConfig); |
| 1436 assertEquals(5, d1.value); |
| 1437 assertTrue(d1.configurable); |
| 1438 assertFalse(d1.enumerable); |
| 1417 | 1439 |
| 1418 Derived.prototype.mStrict = function (){ | 1440 super[nonEnumNonConfig] = 5; |
| 1419 'use strict'; | 1441 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumNonConfig); |
| 1420 super[nonEnumConfig] = 5; | 1442 assertEquals(5, d1.value); |
| 1421 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumConfig); | 1443 assertFalse(d1.configurable); |
| 1422 assertEquals(5, d1.value); | 1444 assertFalse(d1.enumerable); |
| 1423 assertTrue(d1.configurable); | 1445 }, |
| 1424 assertFalse(d1.enumerable); | 1446 mSloppy(){ |
| 1447 super[nonEnumConfig] = 42; |
| 1448 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumConfig); |
| 1449 assertEquals(42, d1.value); |
| 1450 assertTrue(d1.configurable); |
| 1451 assertFalse(d1.enumerable); |
| 1425 | 1452 |
| 1426 super[nonEnumNonConfig] = 5; | 1453 super[nonEnumNonConfig] = 42; |
| 1427 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumNonConfig); | 1454 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumNonConfig); |
| 1428 assertEquals(5, d1.value); | 1455 assertEquals(42, d1.value); |
| 1429 assertFalse(d1.configurable); | 1456 assertFalse(d1.configurable); |
| 1430 assertFalse(d1.enumerable); | 1457 assertFalse(d1.enumerable); |
| 1431 }.toMethod(Derived.prototype); | 1458 } |
| 1432 | 1459 }; |
| 1433 Derived.prototype.mSloppy = function (){ | |
| 1434 super[nonEnumConfig] = 42; | |
| 1435 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumConfig); | |
| 1436 assertEquals(42, d1.value); | |
| 1437 assertTrue(d1.configurable); | |
| 1438 assertFalse(d1.enumerable); | |
| 1439 | |
| 1440 super[nonEnumNonConfig] = 42; | |
| 1441 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumNonConfig); | |
| 1442 assertEquals(42, d1.value); | |
| 1443 assertFalse(d1.configurable); | |
| 1444 assertFalse(d1.enumerable); | |
| 1445 }.toMethod(Derived.prototype); | |
| 1446 | 1460 |
| 1447 var d = new Derived(); | 1461 var d = new Derived(); |
| 1448 Object.defineProperty(d, nonEnumConfig, | 1462 Object.defineProperty(d, nonEnumConfig, |
| 1449 { value : 0, enumerable : false, configurable : true, writable : true }); | 1463 { value : 0, enumerable : false, configurable : true, writable : true }); |
| 1450 Object.defineProperty(d, nonEnumNonConfig, | 1464 Object.defineProperty(d, nonEnumNonConfig, |
| 1451 { value : 0, enumerable : false, configurable : false, writable : true }); | 1465 { value : 0, enumerable : false, configurable : false, writable : true }); |
| 1452 d.mStrict(); | 1466 d.mStrict(); |
| 1453 d.mSloppy(); | 1467 d.mSloppy(); |
| 1454 }()); | 1468 }()); |
| 1455 | 1469 |
| 1456 | 1470 |
| 1457 (function TestKeyedNumericSetterDoesNotReconfigure() { | 1471 (function TestKeyedNumericSetterDoesNotReconfigure() { |
| 1458 var nonEnumConfig = 42; | 1472 var nonEnumConfig = 42; |
| 1459 var nonEnumNonConfig = 43; | 1473 var nonEnumNonConfig = 43; |
| 1460 function Base() {} | 1474 function Base() {} |
| 1461 function Derived() {} | 1475 function Derived() {} |
| 1462 | 1476 |
| 1463 Derived.prototype = { __proto__: Base.prototype }; | 1477 Derived.prototype = { |
| 1478 __proto__: Base.prototype, |
| 1479 mStrict(){ |
| 1480 'use strict'; |
| 1481 super[nonEnumConfig] = 5; |
| 1482 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumConfig); |
| 1483 assertEquals(5, d1.value); |
| 1484 assertTrue(d1.configurable); |
| 1485 assertFalse(d1.enumerable); |
| 1464 | 1486 |
| 1465 Derived.prototype.mStrict = function (){ | 1487 super[nonEnumNonConfig] = 5; |
| 1466 'use strict'; | 1488 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumNonConfig); |
| 1467 super[nonEnumConfig] = 5; | 1489 assertEquals(5, d1.value); |
| 1468 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumConfig); | 1490 assertFalse(d1.configurable); |
| 1469 assertEquals(5, d1.value); | 1491 assertFalse(d1.enumerable); |
| 1470 assertTrue(d1.configurable); | 1492 }, |
| 1471 assertFalse(d1.enumerable); | 1493 mSloppy(){ |
| 1494 super[nonEnumConfig] = 42; |
| 1495 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumConfig); |
| 1496 assertEquals(42, d1.value); |
| 1497 assertTrue(d1.configurable); |
| 1498 assertFalse(d1.enumerable); |
| 1472 | 1499 |
| 1473 super[nonEnumNonConfig] = 5; | 1500 super[nonEnumNonConfig] = 42; |
| 1474 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumNonConfig); | 1501 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumNonConfig); |
| 1475 assertEquals(5, d1.value); | 1502 assertEquals(42, d1.value); |
| 1476 assertFalse(d1.configurable); | 1503 assertFalse(d1.configurable); |
| 1477 assertFalse(d1.enumerable); | 1504 assertFalse(d1.enumerable); |
| 1478 }.toMethod(Derived.prototype); | 1505 } |
| 1479 | 1506 }; |
| 1480 Derived.prototype.mSloppy = function (){ | |
| 1481 super[nonEnumConfig] = 42; | |
| 1482 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumConfig); | |
| 1483 assertEquals(42, d1.value); | |
| 1484 assertTrue(d1.configurable); | |
| 1485 assertFalse(d1.enumerable); | |
| 1486 | |
| 1487 super[nonEnumNonConfig] = 42; | |
| 1488 var d1 = Object.getOwnPropertyDescriptor(this, nonEnumNonConfig); | |
| 1489 assertEquals(42, d1.value); | |
| 1490 assertFalse(d1.configurable); | |
| 1491 assertFalse(d1.enumerable); | |
| 1492 }.toMethod(Derived.prototype); | |
| 1493 | 1507 |
| 1494 var d = new Derived(); | 1508 var d = new Derived(); |
| 1495 Object.defineProperty(d, nonEnumConfig, | 1509 Object.defineProperty(d, nonEnumConfig, |
| 1496 { value : 0, enumerable : false, configurable : true, writable : true }); | 1510 { value : 0, enumerable : false, configurable : true, writable : true }); |
| 1497 Object.defineProperty(d, nonEnumNonConfig, | 1511 Object.defineProperty(d, nonEnumNonConfig, |
| 1498 { value : 0, enumerable : false, configurable : false, writable : true }); | 1512 { value : 0, enumerable : false, configurable : false, writable : true }); |
| 1499 d.mStrict(); | 1513 d.mStrict(); |
| 1500 d.mSloppy(); | 1514 d.mSloppy(); |
| 1501 }()); | 1515 }()); |
| 1502 | 1516 |
| 1503 | 1517 |
| 1504 (function TestCountOperations() { | 1518 (function TestCountOperations() { |
| 1505 function Base() {} | 1519 function Base() {} |
| 1506 Base.prototype = { | 1520 Base.prototype = { |
| 1507 constructor: Base, | 1521 constructor: Base, |
| 1508 get x() { | 1522 get x() { |
| 1509 return this._x; | 1523 return this._x; |
| 1510 }, | 1524 }, |
| 1511 set x(v) { | 1525 set x(v) { |
| 1512 this._x = v; | 1526 this._x = v; |
| 1513 }, | 1527 }, |
| 1514 _x: 1 | 1528 _x: 1 |
| 1515 }; | 1529 }; |
| 1516 | 1530 |
| 1517 function Derived() {} | 1531 function Derived() {} |
| 1518 Derived.__proto__ = Base; | 1532 Derived.__proto__ = Base; |
| 1519 Derived.prototype = { | 1533 Derived.prototype = { |
| 1520 __proto__: Base.prototype, | 1534 __proto__: Base.prototype, |
| 1521 constructor: Derived, | 1535 constructor: Derived, |
| 1522 _x: 2 | 1536 _x: 2, |
| 1537 testCounts() { |
| 1538 assertEquals(2, this._x); |
| 1539 assertEquals(2, super.x); |
| 1540 super.x++; |
| 1541 assertEquals(3, super.x); |
| 1542 ++super.x; |
| 1543 assertEquals(4, super.x); |
| 1544 assertEquals(4, super.x++); |
| 1545 assertEquals(5, super.x); |
| 1546 assertEquals(6, ++super.x); |
| 1547 assertEquals(6, super.x); |
| 1548 assertEquals(6, this._x); |
| 1549 |
| 1550 super.x--; |
| 1551 assertEquals(5, super.x); |
| 1552 --super.x; |
| 1553 assertEquals(4, super.x); |
| 1554 assertEquals(4, super.x--); |
| 1555 assertEquals(3, super.x); |
| 1556 assertEquals(2, --super.x); |
| 1557 assertEquals(2, super.x); |
| 1558 assertEquals(2, this._x); |
| 1559 } |
| 1523 }; | 1560 }; |
| 1524 | |
| 1525 Derived.prototype.testCounts = function() { | |
| 1526 assertEquals(2, this._x); | |
| 1527 assertEquals(2, super.x); | |
| 1528 super.x++; | |
| 1529 assertEquals(3, super.x); | |
| 1530 ++super.x; | |
| 1531 assertEquals(4, super.x); | |
| 1532 assertEquals(4, super.x++); | |
| 1533 assertEquals(5, super.x); | |
| 1534 assertEquals(6, ++super.x); | |
| 1535 assertEquals(6, super.x); | |
| 1536 assertEquals(6, this._x); | |
| 1537 | |
| 1538 super.x--; | |
| 1539 assertEquals(5, super.x); | |
| 1540 --super.x; | |
| 1541 assertEquals(4, super.x); | |
| 1542 assertEquals(4, super.x--); | |
| 1543 assertEquals(3, super.x); | |
| 1544 assertEquals(2, --super.x); | |
| 1545 assertEquals(2, super.x); | |
| 1546 assertEquals(2, this._x); | |
| 1547 }.toMethod(Derived.prototype); | |
| 1548 new Derived().testCounts(); | 1561 new Derived().testCounts(); |
| 1549 }()); | 1562 }()); |
| 1550 | 1563 |
| 1551 | 1564 |
| 1552 (function TestKeyedCountOperations() { | 1565 (function TestKeyedCountOperations() { |
| 1553 var x = 'x'; | 1566 var x = 'x'; |
| 1554 function Base() {} | 1567 function Base() {} |
| 1555 Base.prototype = { | 1568 Base.prototype = { |
| 1556 constructor: Base, | 1569 constructor: Base, |
| 1557 get x() { | 1570 get x() { |
| 1558 return this._x; | 1571 return this._x; |
| 1559 }, | 1572 }, |
| 1560 set x(v) { | 1573 set x(v) { |
| 1561 this._x = v; | 1574 this._x = v; |
| 1562 }, | 1575 }, |
| 1563 _x: 1 | 1576 _x: 1 |
| 1564 }; | 1577 }; |
| 1565 | 1578 |
| 1566 function Derived() {} | 1579 function Derived() {} |
| 1567 Derived.__proto__ = Base; | 1580 Derived.__proto__ = Base; |
| 1568 Derived.prototype = { | 1581 Derived.prototype = { |
| 1569 __proto__: Base.prototype, | 1582 __proto__: Base.prototype, |
| 1570 constructor: Derived, | 1583 constructor: Derived, |
| 1571 _x: 2 | 1584 _x: 2, |
| 1585 testCounts() { |
| 1586 assertEquals(2, this._x); |
| 1587 assertEquals(2, super[x]); |
| 1588 super[x]++; |
| 1589 assertEquals(3, super[x]); |
| 1590 ++super[x]; |
| 1591 assertEquals(4, super[x]); |
| 1592 assertEquals(4, super[x]++); |
| 1593 assertEquals(5, super[x]); |
| 1594 assertEquals(6, ++super[x]); |
| 1595 assertEquals(6, super[x]); |
| 1596 assertEquals(6, this._x); |
| 1597 |
| 1598 super[x]--; |
| 1599 assertEquals(5, super[x]); |
| 1600 --super[x]; |
| 1601 assertEquals(4, super[x]); |
| 1602 assertEquals(4, super[x]--); |
| 1603 assertEquals(3, super[x]); |
| 1604 assertEquals(2, --super[x]); |
| 1605 assertEquals(2, super[x]); |
| 1606 assertEquals(2, this._x); |
| 1607 } |
| 1572 }; | 1608 }; |
| 1573 | |
| 1574 Derived.prototype.testCounts = function() { | |
| 1575 assertEquals(2, this._x); | |
| 1576 assertEquals(2, super[x]); | |
| 1577 super[x]++; | |
| 1578 assertEquals(3, super[x]); | |
| 1579 ++super[x]; | |
| 1580 assertEquals(4, super[x]); | |
| 1581 assertEquals(4, super[x]++); | |
| 1582 assertEquals(5, super[x]); | |
| 1583 assertEquals(6, ++super[x]); | |
| 1584 assertEquals(6, super[x]); | |
| 1585 assertEquals(6, this._x); | |
| 1586 | |
| 1587 super[x]--; | |
| 1588 assertEquals(5, super[x]); | |
| 1589 --super[x]; | |
| 1590 assertEquals(4, super[x]); | |
| 1591 assertEquals(4, super[x]--); | |
| 1592 assertEquals(3, super[x]); | |
| 1593 assertEquals(2, --super[x]); | |
| 1594 assertEquals(2, super[x]); | |
| 1595 assertEquals(2, this._x); | |
| 1596 }.toMethod(Derived.prototype); | |
| 1597 new Derived().testCounts(); | 1609 new Derived().testCounts(); |
| 1598 }()); | 1610 }()); |
| 1599 | 1611 |
| 1600 | 1612 |
| 1601 (function TestKeyedNumericCountOperations() { | 1613 (function TestKeyedNumericCountOperations() { |
| 1602 var x = 42; | 1614 var x = 42; |
| 1603 function Base() {} | 1615 function Base() {} |
| 1604 Base.prototype = { | 1616 Base.prototype = { |
| 1605 constructor: Base, | 1617 constructor: Base, |
| 1606 _x: 1 | 1618 _x: 1 |
| 1607 }; | 1619 }; |
| 1608 | 1620 |
| 1609 Object.defineProperty(Base.prototype, x, { | 1621 Object.defineProperty(Base.prototype, x, { |
| 1610 get: function() { return this._x; }, | 1622 get: function() { return this._x; }, |
| 1611 set: function(v) { this._x = v;; } | 1623 set: function(v) { this._x = v;; } |
| 1612 }); | 1624 }); |
| 1613 | 1625 |
| 1614 function Derived() {} | 1626 function Derived() {} |
| 1615 Derived.__proto__ = Base; | 1627 Derived.__proto__ = Base; |
| 1616 Derived.prototype = { | 1628 Derived.prototype = { |
| 1617 __proto__: Base.prototype, | 1629 __proto__: Base.prototype, |
| 1618 constructor: Derived, | 1630 constructor: Derived, |
| 1619 _x: 2 | 1631 _x: 2, |
| 1632 testCounts() { |
| 1633 assertEquals(2, this._x); |
| 1634 assertEquals(2, super[x]); |
| 1635 super[x]++; |
| 1636 assertEquals(3, super[x]); |
| 1637 ++super[x]; |
| 1638 assertEquals(4, super[x]); |
| 1639 assertEquals(4, super[x]++); |
| 1640 assertEquals(5, super[x]); |
| 1641 assertEquals(6, ++super[x]); |
| 1642 assertEquals(6, super[x]); |
| 1643 assertEquals(6, this._x); |
| 1644 |
| 1645 super[x]--; |
| 1646 assertEquals(5, super[x]); |
| 1647 --super[x]; |
| 1648 assertEquals(4, super[x]); |
| 1649 assertEquals(4, super[x]--); |
| 1650 assertEquals(3, super[x]); |
| 1651 assertEquals(2, --super[x]); |
| 1652 assertEquals(2, super[x]); |
| 1653 assertEquals(2, this._x); |
| 1654 } |
| 1620 }; | 1655 }; |
| 1621 | |
| 1622 Derived.prototype.testCounts = function() { | |
| 1623 assertEquals(2, this._x); | |
| 1624 assertEquals(2, super[x]); | |
| 1625 super[x]++; | |
| 1626 assertEquals(3, super[x]); | |
| 1627 ++super[x]; | |
| 1628 assertEquals(4, super[x]); | |
| 1629 assertEquals(4, super[x]++); | |
| 1630 assertEquals(5, super[x]); | |
| 1631 assertEquals(6, ++super[x]); | |
| 1632 assertEquals(6, super[x]); | |
| 1633 assertEquals(6, this._x); | |
| 1634 | |
| 1635 super[x]--; | |
| 1636 assertEquals(5, super[x]); | |
| 1637 --super[x]; | |
| 1638 assertEquals(4, super[x]); | |
| 1639 assertEquals(4, super[x]--); | |
| 1640 assertEquals(3, super[x]); | |
| 1641 assertEquals(2, --super[x]); | |
| 1642 assertEquals(2, super[x]); | |
| 1643 assertEquals(2, this._x); | |
| 1644 }.toMethod(Derived.prototype); | |
| 1645 new Derived().testCounts(); | 1656 new Derived().testCounts(); |
| 1646 }()); | 1657 }()); |
| 1647 | 1658 |
| 1648 | 1659 |
| 1649 (function TestSetterSuperNonWritable() { | 1660 (function TestSetterSuperNonWritable() { |
| 1650 function Base() {} | 1661 function Base() {} |
| 1651 Object.defineProperty(Base.prototype, 'x', { value : 27, writable: false }); | 1662 Object.defineProperty(Base.prototype, 'x', { value : 27, writable: false }); |
| 1652 function Derived() {} | 1663 function Derived() {} |
| 1653 | 1664 Derived.prototype = { |
| 1654 Derived.prototype = { __proto__: Base.prototype, constructor: Derived }; | 1665 __proto__: Base.prototype, |
| 1655 | 1666 constructor: Derived, |
| 1656 Derived.prototype.mSloppy = function() { | 1667 mSloppy() { |
| 1657 assertEquals(27, super.x); | 1668 assertEquals(27, super.x); |
| 1658 assertEquals(27, this.x); | 1669 assertEquals(27, this.x); |
| 1659 super.x = 10; | 1670 super.x = 10; |
| 1660 assertEquals(27, super.x); | 1671 assertEquals(27, super.x); |
| 1661 assertEquals(27, this.x); | 1672 assertEquals(27, this.x); |
| 1662 }.toMethod(Derived.prototype); | 1673 }, |
| 1663 Derived.prototype.mStrict = function() { | 1674 mStrict() { |
| 1664 'use strict'; | 1675 'use strict'; |
| 1665 assertEquals(27, super.x); | 1676 assertEquals(27, super.x); |
| 1666 assertEquals(27, this.x); | 1677 assertEquals(27, this.x); |
| 1667 var ex = null; | 1678 var ex = null; |
| 1668 try { super.x = 10; } catch(e) { ex = e; } | 1679 try { super.x = 10; } catch(e) { ex = e; } |
| 1669 assertTrue(ex instanceof TypeError); | 1680 assertTrue(ex instanceof TypeError); |
| 1670 assertEquals(27, super.x); | 1681 assertEquals(27, super.x); |
| 1671 assertEquals(27, this.x); | 1682 assertEquals(27, this.x); |
| 1672 }.toMethod(Derived.prototype); | 1683 } |
| 1684 }; |
| 1673 new Derived().mSloppy(); | 1685 new Derived().mSloppy(); |
| 1674 new Derived().mStrict(); | 1686 new Derived().mStrict(); |
| 1675 }()); | 1687 }()); |
| 1676 | 1688 |
| 1677 | 1689 |
| 1678 (function TestSetterKeyedSuperNonWritable() { | 1690 (function TestSetterKeyedSuperNonWritable() { |
| 1679 var x = 'xyz'; | 1691 var x = 'xyz'; |
| 1680 function Base() {} | 1692 function Base() {} |
| 1681 Object.defineProperty(Base.prototype, x, { value : 27, writable: false }); | 1693 Object.defineProperty(Base.prototype, x, { value : 27, writable: false }); |
| 1682 function Derived() {} | 1694 function Derived() {} |
| 1683 | 1695 |
| 1684 Derived.prototype = { __proto__: Base.prototype, constructor: Derived }; | 1696 Derived.prototype = { |
| 1685 | 1697 __proto__: Base.prototype, |
| 1686 Derived.prototype.mSloppy = function() { | 1698 constructor: Derived, |
| 1687 assertEquals(27, super[x]); | 1699 mSloppy() { |
| 1688 assertEquals(27, this[x]); | 1700 assertEquals(27, super[x]); |
| 1689 super[x] = 10; | 1701 assertEquals(27, this[x]); |
| 1690 assertEquals(27, super[x]); | 1702 super[x] = 10; |
| 1691 assertEquals(27, this[x]); | 1703 assertEquals(27, super[x]); |
| 1692 }.toMethod(Derived.prototype); | 1704 assertEquals(27, this[x]); |
| 1693 Derived.prototype.mStrict = function() { | 1705 }, |
| 1694 'use strict'; | 1706 mStrict() { |
| 1695 assertEquals(27, super[x]); | 1707 'use strict'; |
| 1696 assertEquals(27, this[x]); | 1708 assertEquals(27, super[x]); |
| 1697 var ex = null; | 1709 assertEquals(27, this[x]); |
| 1698 try { super[x] = 10; } catch(e) { ex = e; } | 1710 var ex = null; |
| 1699 assertTrue(ex instanceof TypeError); | 1711 try { super[x] = 10; } catch(e) { ex = e; } |
| 1700 assertEquals(27, super[x]); | 1712 assertTrue(ex instanceof TypeError); |
| 1701 assertEquals(27, this[x]); | 1713 assertEquals(27, super[x]); |
| 1702 }.toMethod(Derived.prototype); | 1714 assertEquals(27, this[x]); |
| 1715 } |
| 1716 }; |
| 1703 new Derived().mSloppy(); | 1717 new Derived().mSloppy(); |
| 1704 new Derived().mStrict(); | 1718 new Derived().mStrict(); |
| 1705 }()); | 1719 }()); |
| 1706 | 1720 |
| 1707 | 1721 |
| 1708 (function TestSetterKeyedNumericSuperNonWritable() { | 1722 (function TestSetterKeyedNumericSuperNonWritable() { |
| 1709 var x = 42; | 1723 var x = 42; |
| 1710 function Base() {} | 1724 function Base() {} |
| 1711 Object.defineProperty(Base.prototype, x, { value : 27, writable: false }); | 1725 Object.defineProperty(Base.prototype, x, { value : 27, writable: false }); |
| 1712 function Derived() {} | 1726 function Derived() {} |
| 1713 | 1727 |
| 1714 Derived.prototype = { __proto__: Base.prototype, constructor: Derived }; | 1728 Derived.prototype = { |
| 1715 | 1729 __proto__: Base.prototype, |
| 1716 Derived.prototype.mSloppy = function() { | 1730 constructor: Derived, |
| 1717 assertEquals(27, super[x]); | 1731 mSloppy() { |
| 1718 assertEquals(27, this[x]); | 1732 assertEquals(27, super[x]); |
| 1719 super[x] = 10; | 1733 assertEquals(27, this[x]); |
| 1720 assertEquals(27, super[x]); | 1734 super[x] = 10; |
| 1721 assertEquals(27, this[x]); | 1735 assertEquals(27, super[x]); |
| 1722 }.toMethod(Derived.prototype); | 1736 assertEquals(27, this[x]); |
| 1723 Derived.prototype.mStrict = function() { | 1737 }, |
| 1724 'use strict'; | 1738 mStrict() { |
| 1725 assertEquals(27, super[x]); | 1739 'use strict'; |
| 1726 assertEquals(27, this[x]); | 1740 assertEquals(27, super[x]); |
| 1727 var ex = null; | 1741 assertEquals(27, this[x]); |
| 1728 try { super[x] = 10; } catch(e) { ex = e; } | 1742 var ex = null; |
| 1729 assertTrue(ex instanceof TypeError); | 1743 try { super[x] = 10; } catch(e) { ex = e; } |
| 1730 assertEquals(27, super[x]); | 1744 assertTrue(ex instanceof TypeError); |
| 1731 assertEquals(27, this[x]); | 1745 assertEquals(27, super[x]); |
| 1732 }.toMethod(Derived.prototype); | 1746 assertEquals(27, this[x]); |
| 1747 } |
| 1748 }; |
| 1733 new Derived().mSloppy(); | 1749 new Derived().mSloppy(); |
| 1734 new Derived().mStrict(); | 1750 new Derived().mStrict(); |
| 1735 }()); | 1751 }()); |
| 1736 | 1752 |
| 1737 | 1753 |
| 1738 function Subclass(base, constructor) { | 1754 (function TestSuperCall() { |
| 1739 var homeObject = { | 1755 'use strict'; |
| 1740 __proto__: base.prototype, | |
| 1741 constructor: constructor | |
| 1742 }; | |
| 1743 constructor.__proto__ = base; | |
| 1744 constructor.prototype = homeObject; | |
| 1745 // not doing toMethod: home object is not required for | |
| 1746 // super constructor calls. | |
| 1747 return constructor; | |
| 1748 } | |
| 1749 | 1756 |
| 1750 (function TestSuperCall() { | |
| 1751 var baseCalled = 0; | 1757 var baseCalled = 0; |
| 1752 var derivedCalled = 0; | 1758 var derivedCalled = 0; |
| 1753 var derivedDerivedCalled = 0; | 1759 var derivedDerivedCalled = 0; |
| 1754 | 1760 |
| 1755 function Base() { | 1761 class Base { |
| 1756 baseCalled++; | 1762 constructor() { |
| 1763 baseCalled++; |
| 1764 } |
| 1757 } | 1765 } |
| 1758 | 1766 |
| 1759 var Derived = Subclass(Base, function () { | 1767 class Derived extends Base { |
| 1760 super(); | 1768 constructor() { |
| 1761 derivedCalled++; | 1769 super(); |
| 1762 }); | 1770 derivedCalled++; |
| 1771 } |
| 1772 } |
| 1763 | 1773 |
| 1764 assertEquals(Base, Base.prototype.constructor); | 1774 assertEquals(Base, Base.prototype.constructor); |
| 1765 assertEquals(Base.prototype, Derived.prototype.__proto__); | 1775 assertEquals(Base.prototype, Derived.prototype.__proto__); |
| 1766 | 1776 |
| 1767 baseCalled = 0; | 1777 baseCalled = 0; |
| 1768 derivedCalled = 0; | 1778 derivedCalled = 0; |
| 1769 new Derived(); | 1779 new Derived(); |
| 1770 assertEquals(1, baseCalled); | 1780 assertEquals(1, baseCalled); |
| 1771 assertEquals(1, derivedCalled); | 1781 assertEquals(1, derivedCalled); |
| 1772 | 1782 |
| 1773 var DerivedDerived = Subclass(Derived, function () { | 1783 class DerivedDerived extends Derived { |
| 1774 super(); | 1784 constructor() { |
| 1775 derivedDerivedCalled++; | 1785 super(); |
| 1776 }); | 1786 derivedDerivedCalled++; |
| 1787 } |
| 1788 } |
| 1777 | 1789 |
| 1778 baseCalled = 0; | 1790 baseCalled = 0; |
| 1779 derivedCalled = 0; | 1791 derivedCalled = 0; |
| 1780 derivedDerivedCalled = 0; | 1792 derivedDerivedCalled = 0; |
| 1781 new DerivedDerived(); | 1793 new DerivedDerived(); |
| 1782 assertEquals(1, baseCalled); | 1794 assertEquals(1, baseCalled); |
| 1783 assertEquals(1, derivedCalled); | 1795 assertEquals(1, derivedCalled); |
| 1784 assertEquals(1, derivedDerivedCalled); | 1796 assertEquals(1, derivedDerivedCalled); |
| 1785 | 1797 |
| 1786 function Base2(v) { | 1798 class Base2 { |
| 1787 this.fromBase = v; | 1799 constructor(v) { |
| 1800 this.fromBase = v; |
| 1801 } |
| 1788 } | 1802 } |
| 1789 var Derived2 = Subclass(Base2, function (v1, v2) { | 1803 class Derived2 extends Base2 { |
| 1790 super(v1); | 1804 constructor(v1, v2) { |
| 1791 this.fromDerived = v2; | 1805 super(v1); |
| 1792 }); | 1806 this.fromDerived = v2; |
| 1807 } |
| 1808 } |
| 1793 | 1809 |
| 1794 var d = new Derived2("base", "derived"); | 1810 var d = new Derived2("base", "derived"); |
| 1795 assertEquals("base", d.fromBase); | 1811 assertEquals("base", d.fromBase); |
| 1796 assertEquals("derived", d.fromDerived); | 1812 assertEquals("derived", d.fromDerived); |
| 1797 | 1813 |
| 1798 function ImplicitSubclassOfFunction() { | 1814 class ImplicitSubclassOfFunction { |
| 1799 super(); | 1815 constructor() { |
| 1800 this.x = 123; | 1816 super(); |
| 1817 this.x = 123; |
| 1818 } |
| 1801 } | 1819 } |
| 1802 | 1820 |
| 1803 var o = new ImplicitSubclassOfFunction(); | 1821 var o = new ImplicitSubclassOfFunction(); |
| 1804 assertEquals(123, o.x); | 1822 assertEquals(123, o.x); |
| 1805 | 1823 |
| 1806 var calls = 0; | 1824 var calls = 0; |
| 1807 function G() { | 1825 class G { |
| 1808 calls++; | 1826 constructor() { |
| 1827 calls++; |
| 1828 } |
| 1809 } | 1829 } |
| 1810 function F() { | 1830 class F { |
| 1811 super(); | 1831 constructor() { |
| 1832 super(); |
| 1833 } |
| 1812 } | 1834 } |
| 1813 F.__proto__ = G; | 1835 F.__proto__ = G; |
| 1814 new F(); | 1836 new F(); |
| 1815 assertEquals(1, calls); | 1837 assertEquals(1, calls); |
| 1816 F.__proto__ = function() {}; | 1838 F.__proto__ = function() {}; |
| 1817 new F(); | 1839 new F(); |
| 1818 assertEquals(1, calls); | 1840 assertEquals(1, calls); |
| 1819 }()); | 1841 }()); |
| 1820 | 1842 |
| 1821 | 1843 |
| 1822 (function TestNewSuper() { | |
| 1823 var baseCalled = 0; | |
| 1824 var derivedCalled = 0; | |
| 1825 | |
| 1826 function Base() { | |
| 1827 baseCalled++; | |
| 1828 this.x = 15; | |
| 1829 } | |
| 1830 | |
| 1831 | |
| 1832 var Derived = Subclass(Base, function() { | |
| 1833 baseCalled = 0; | |
| 1834 var b = new super(); | |
| 1835 assertEquals(1, baseCalled) | |
| 1836 assertEquals(Base.prototype, b.__proto__); | |
| 1837 assertEquals(15, b.x); | |
| 1838 assertEquals(undefined, this.x); | |
| 1839 derivedCalled++; | |
| 1840 }); | |
| 1841 | |
| 1842 derivedCalled = 0; | |
| 1843 new Derived(); | |
| 1844 assertEquals(1, derivedCalled); | |
| 1845 }()); | |
| 1846 | |
| 1847 | |
| 1848 (function TestSuperCallErrorCases() { | 1844 (function TestSuperCallErrorCases() { |
| 1849 function T() { | 1845 'use strict'; |
| 1850 super(); | 1846 class T { |
| 1847 constructor() { |
| 1848 super(); |
| 1849 } |
| 1851 } | 1850 } |
| 1851 |
| 1852 T.__proto__ = null; | 1852 T.__proto__ = null; |
| 1853 // Spec says ReferenceError here, but for other IsCallable failures | |
| 1854 // we throw TypeError. | |
| 1855 // Filed https://bugs.ecmascript.org/show_bug.cgi?id=3282 | |
| 1856 assertThrows(function() { new T(); }, TypeError); | 1853 assertThrows(function() { new T(); }, TypeError); |
| 1857 | |
| 1858 function T1() { | |
| 1859 var b = new super(); | |
| 1860 } | |
| 1861 T1.__proto = null; | |
| 1862 assertThrows(function() { new T1(); }, TypeError); | |
| 1863 }()); | 1854 }()); |
| 1864 | 1855 |
| 1865 | 1856 |
| 1866 (function TestSuperCallSyntacticRestriction() { | 1857 (function TestSuperCallSyntacticRestriction() { |
| 1858 'use strict'; |
| 1867 assertThrows(function() { | 1859 assertThrows(function() { |
| 1868 function C() { | 1860 class C { |
| 1869 var y; | 1861 constructor() { |
| 1870 super(); | 1862 super(this.x); |
| 1863 } |
| 1871 } | 1864 } |
| 1872 new C(); | 1865 new C(); |
| 1873 }, TypeError); | 1866 }, TypeError); |
| 1874 assertThrows(function() { | 1867 assertThrows(function() { |
| 1875 function C() { | 1868 class C { |
| 1876 super(this.x); | 1869 constructor() { |
| 1870 super(this); |
| 1871 } |
| 1877 } | 1872 } |
| 1878 new C(); | 1873 new C(); |
| 1879 }, TypeError); | 1874 }, TypeError); |
| 1880 assertThrows(function() { | 1875 assertThrows(function() { |
| 1881 function C() { | 1876 class C { |
| 1882 super(this); | 1877 constructor() { |
| 1878 super(1, 2, Object.getPrototypeOf(this)); |
| 1879 } |
| 1883 } | 1880 } |
| 1884 new C(); | 1881 new C(); |
| 1885 }, TypeError); | 1882 }, TypeError); |
| 1886 assertThrows(function() { | 1883 assertThrows(function() { |
| 1887 function C() { | 1884 class C { |
| 1888 super(1, 2, Object.getPrototypeOf(this)); | 1885 constructor() { |
| 1886 { super(1, 2); } |
| 1887 } |
| 1889 } | 1888 } |
| 1890 new C(); | 1889 new C(); |
| 1891 }, TypeError); | 1890 }, TypeError); |
| 1892 assertThrows(function() { | 1891 assertThrows(function() { |
| 1893 function C() { | 1892 class C { |
| 1894 { super(1, 2); } | 1893 constructor() { |
| 1895 }; new C(); | 1894 if (1) super(); |
| 1896 }, TypeError); | 1895 } |
| 1897 assertThrows(function() { | 1896 } |
| 1898 function C() { | 1897 new C(); |
| 1899 if (1) super(); | |
| 1900 }; new C(); | |
| 1901 }, TypeError); | 1898 }, TypeError); |
| 1902 | 1899 |
| 1903 function C1() { | 1900 class C1 { |
| 1904 'use strict'; | 1901 constructor() { |
| 1905 super(); | 1902 'use strict'; |
| 1906 }; | 1903 super(); |
| 1904 } |
| 1905 } |
| 1907 new C1(); | 1906 new C1(); |
| 1908 | 1907 |
| 1909 function C2() { | 1908 class C2 { |
| 1910 ; 'use strict';;;;; | 1909 constructor() { |
| 1911 super(); | 1910 ; 'use strict';;;;; |
| 1912 }; | 1911 super(); |
| 1912 } |
| 1913 } |
| 1913 new C2(); | 1914 new C2(); |
| 1914 | 1915 |
| 1915 function C3() { | 1916 class C3 { |
| 1916 ; 'use strict';;;;; | 1917 constructor() { |
| 1917 // This is a comment. | 1918 ; 'use strict';;;;; |
| 1918 super(); | 1919 // This is a comment. |
| 1920 super(); |
| 1921 } |
| 1919 } | 1922 } |
| 1920 new C3(); | 1923 new C3(); |
| 1921 }()); | 1924 }()); |
| OLD | NEW |