| 'use strict'; | 
|   | 
| var supportsDescriptors = require('define-properties').supportsDescriptors; | 
| var functionsHaveNames = require('functions-have-names')(); | 
| var getPolyfill = require('./polyfill'); | 
| var defineProperty = Object.defineProperty; | 
| var TypeErr = TypeError; | 
|   | 
| module.exports = function shimName() { | 
|     var polyfill = getPolyfill(); | 
|     if (functionsHaveNames) { | 
|         return polyfill; | 
|     } | 
|     if (!supportsDescriptors) { | 
|         throw new TypeErr('Shimming Function.prototype.name support requires ES5 property descriptor support.'); | 
|     } | 
|     var functionProto = Function.prototype; | 
|     defineProperty(functionProto, 'name', { | 
|         configurable: true, | 
|         enumerable: false, | 
|         get: function () { | 
|             var name = polyfill.call(this); | 
|             if (this !== functionProto) { | 
|                 defineProperty(this, 'name', { | 
|                     configurable: true, | 
|                     enumerable: false, | 
|                     value: name, | 
|                     writable: false | 
|                 }); | 
|             } | 
|             return name; | 
|         } | 
|     }); | 
|     return polyfill; | 
| }; |