1// Copyright 2015 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5function getStrictF() { 6 'use strict'; 7 return function f() {}; 8} 9 10 11function getSloppyF() { 12 return function f() {}; 13} 14 15 16function test(testFunction) { 17 testFunction(getStrictF()); 18 testFunction(getSloppyF()); 19} 20 21 22function testDescriptor(f) { 23 var descr = Object.getOwnPropertyDescriptor(f, 'name'); 24 assertTrue(descr.configurable); 25 assertFalse(descr.enumerable); 26 assertEquals('f', descr.value); 27 assertFalse(descr.writable); 28} 29test(testDescriptor); 30 31 32function testSet(f) { 33 f.name = 'g'; 34 assertEquals('f', f.name); 35} 36test(testSet); 37 38 39function testSetStrict(f) { 40 'use strict'; 41 assertThrows(function() { 42 f.name = 'g'; 43 }, TypeError); 44} 45test(testSetStrict); 46 47 48function testReconfigureAsDataProperty(f) { 49 Object.defineProperty(f, 'name', { 50 value: 'g', 51 }); 52 assertEquals('g', f.name); 53 Object.defineProperty(f, 'name', { 54 writable: true 55 }); 56 f.name = 'h'; 57 assertEquals('h', f.name); 58 59 f.name = 42; 60 assertEquals(42, f.name); 61} 62test(testReconfigureAsDataProperty); 63 64 65function testReconfigureAsAccessorProperty(f) { 66 var name = 'g'; 67 Object.defineProperty(f, 'name', { 68 get: function() { return name; }, 69 set: function(v) { name = v; } 70 }); 71 assertEquals('g', f.name); 72 f.name = 'h'; 73 assertEquals('h', f.name); 74} 75test(testReconfigureAsAccessorProperty); 76 77 78function testFunctionToString(f) { 79 Object.defineProperty(f, 'name', { 80 value: {toString: function() { assertUnreachable(); }}, 81 }); 82 assertEquals('function f() {}', f.toString()); 83} 84test(testFunctionToString); 85 86 87(function testSetOnInstance() { 88 // This needs to come before testDelete below 89 assertTrue(Function.prototype.hasOwnProperty('name')); 90 91 function f() {} 92 delete f.name; 93 assertEquals('', f.name); 94 95 f.name = 42; 96 assertEquals('', f.name); // non writable prototype property. 97 assertFalse(f.hasOwnProperty('name')); 98 99 Object.defineProperty(Function.prototype, 'name', {writable: true}); 100 101 f.name = 123; 102 assertTrue(f.hasOwnProperty('name')); 103 assertEquals(123, f.name); 104})(); 105 106 107(function testDelete() { 108 function f() {} 109 assertTrue(delete f.name); 110 assertFalse(f.hasOwnProperty('name')); 111 assertEquals('', f.name); 112 113 assertTrue(delete Function.prototype.name); 114 assertEquals(undefined, f.name); 115})(); 116