// 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('', f.name); f.name = 42; assertEquals('', 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('', f.name); assertTrue(delete Function.prototype.name); assertEquals(undefined, f.name); })();