v8/test/mjsunit/es6/function-name-configurable.js
arv f6cd009efd ES6: Make function name configurable
Function name property is now standardized in ES6. It was a Mozilla proprietary
extension before. With ES6, the property was made configurable, so that it can
be used instead of another proprietary property, displayName.

This is a revert of revert c791d84112.

Last time this broke a Chrome browser test which has since been updated:

5f75a3be4c

BUG=v8:3333
LOG=N
R=mstarzinger@chromium.org,verwaest@chromium.org
CQ_INCLUDE_TRYBOTS=tryserver.chromium.linux:linux_chromium_rel_ng;tryserver.blink:linux_blink_rel

Review URL: https://codereview.chromium.org/977003004

Cr-Commit-Position: refs/heads/master@{#26996}
2015-03-04 16:57:10 +00:00

116 lines
2.4 KiB
JavaScript

// 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() {};
}
function getSloppyF() {
return function f() {};
}
function test(testFunction) {
testFunction(getStrictF());
testFunction(getSloppyF());
}
function testDescriptor(f) {
var descr = Object.getOwnPropertyDescriptor(f, 'name');
assertTrue(descr.configurable);
assertFalse(descr.enumerable);
assertEquals('f', descr.value);
assertFalse(descr.writable);
}
test(testDescriptor);
function testSet(f) {
f.name = 'g';
assertEquals('f', f.name);
}
test(testSet);
function testSetStrict(f) {
'use strict';
assertThrows(function() {
f.name = 'g';
}, TypeError);
}
test(testSetStrict);
function testReconfigureAsDataProperty(f) {
Object.defineProperty(f, 'name', {
value: 'g',
});
assertEquals('g', f.name);
Object.defineProperty(f, 'name', {
writable: true
});
f.name = 'h';
assertEquals('h', f.name);
f.name = 42;
assertEquals(42, f.name);
}
test(testReconfigureAsDataProperty);
function testReconfigureAsAccessorProperty(f) {
var name = 'g';
Object.defineProperty(f, 'name', {
get: function() { return name; },
set: function(v) { name = v; }
});
assertEquals('g', f.name);
f.name = 'h';
assertEquals('h', f.name);
}
test(testReconfigureAsAccessorProperty);
function testFunctionToString(f) {
Object.defineProperty(f, 'name', {
value: {toString: function() { assertUnreachable(); }},
});
assertEquals('function f() {}', f.toString());
}
test(testFunctionToString);
(function testSetOnInstance() {
// This needs to come before testDelete below
assertTrue(Function.prototype.hasOwnProperty('name'));
function f() {}
delete f.name;
assertEquals('Empty', f.name);
f.name = 42;
assertEquals('Empty', f.name); // non writable prototype property.
assertFalse(f.hasOwnProperty('name'));
Object.defineProperty(Function.prototype, 'name', {writable: true});
f.name = 123;
assertTrue(f.hasOwnProperty('name'));
assertEquals(123, f.name);
})();
(function testDelete() {
function f() {}
assertTrue(delete f.name);
assertFalse(f.hasOwnProperty('name'));
assertEquals('Empty', f.name);
assertTrue(delete Function.prototype.name);
assertEquals(undefined, f.name);
})();