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