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