| // Copyright 2015 the V8 project authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| function getStrictF() { | |
| 'use strict'; | |
| return function f(x) {}; | |
| } | |
| function getSloppyF() { | |
| return function f(x) {}; | |
| } | |
| function getStrictGenerator() { | |
| 'use strict'; | |
| return function* f(x) {}; | |
| } | |
| function getSloppyGenerator() { | |
| return function* f(x) {}; | |
| } | |
| function test(testFunction) { | |
| testFunction(getStrictF()); | |
| testFunction(getSloppyF()); | |
| testFunction(getStrictGenerator()); | |
| testFunction(getSloppyGenerator()); | |
| } | |
| function testDescriptor(f) { | |
| var descr = Object.getOwnPropertyDescriptor(f, 'length'); | |
| assertTrue(descr.configurable); | |
| assertFalse(descr.enumerable); | |
| assertEquals(1, descr.value); | |
| assertFalse(descr.writable); | |
| } | |
| test(testDescriptor); | |
| function testSet(f) { | |
| f.length = 2; | |
| assertEquals(1, f.length); | |
| } | |
| test(testSet); | |
| function testSetStrict(f) { | |
| 'use strict'; | |
| assertThrows(function() { | |
| f.length = 2; | |
| }, TypeError); | |
| } | |
| test(testSetStrict); | |
| function testReconfigureAsDataProperty(f) { | |
| Object.defineProperty(f, 'length', { | |
| value: 2, | |
| }); | |
| assertEquals(2, f.length); | |
| Object.defineProperty(f, 'length', { | |
| writable: true | |
| }); | |
| f.length = 3; | |
| assertEquals(3, f.length); | |
| f.length = 42; | |
| assertEquals(42, f.length); | |
| } | |
| test(testReconfigureAsDataProperty); | |
| function testReconfigureAsAccessorProperty(f) { | |
| var length = 2; | |
| Object.defineProperty(f, 'length', { | |
| get: function() { return length; }, | |
| set: function(v) { length = v; } | |
| }); | |
| assertEquals(2, f.length); | |
| f.length = 3; | |
| assertEquals(3, f.length); | |
| } | |
| test(testReconfigureAsAccessorProperty); | |
| (function testSetOnInstance() { | |
| // This needs to come before testDelete below | |
| assertTrue(Function.prototype.hasOwnProperty('length')); | |
| function f() {} | |
| delete f.length; | |
| assertEquals(0, f.length); | |
| f.length = 42; | |
| assertEquals(0, f.length); // non writable prototype property. | |
| assertFalse(f.hasOwnProperty('length')); | |
| Object.defineProperty(Function.prototype, 'length', {writable: true}); | |
| f.length = 123; | |
| assertTrue(f.hasOwnProperty('length')); | |
| assertEquals(123, f.length); | |
| })(); | |
| (function testDelete() { | |
| function f(x) {} | |
| assertTrue(delete f.length); | |
| assertFalse(f.hasOwnProperty('length')); | |
| assertEquals(0, f.length); | |
| assertTrue(delete Function.prototype.length); | |
| assertEquals(undefined, f.length); | |
| })(); |