| // 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); |
| })(); |