1 | var global = require('../internals/global');
|
2 | var shared = require('../internals/shared');
|
3 | var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
|
4 | var has = require('../internals/has');
|
5 | var setGlobal = require('../internals/set-global');
|
6 | var nativeFunctionToString = require('../internals/function-to-string');
|
7 | var InternalStateModule = require('../internals/internal-state');
|
8 |
|
9 | var getInternalState = InternalStateModule.get;
|
10 | var enforceInternalState = InternalStateModule.enforce;
|
11 | var TEMPLATE = String(nativeFunctionToString).split('toString');
|
12 |
|
13 | shared('inspectSource', function (it) {
|
14 | return nativeFunctionToString.call(it);
|
15 | });
|
16 |
|
17 | (module.exports = function (O, key, value, options) {
|
18 | var unsafe = options ? !!options.unsafe : false;
|
19 | var simple = options ? !!options.enumerable : false;
|
20 | var noTargetGet = options ? !!options.noTargetGet : false;
|
21 | if (typeof value == 'function') {
|
22 | if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key);
|
23 | enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');
|
24 | }
|
25 | if (O === global) {
|
26 | if (simple) O[key] = value;
|
27 | else setGlobal(key, value);
|
28 | return;
|
29 | } else if (!unsafe) {
|
30 | delete O[key];
|
31 | } else if (!noTargetGet && O[key]) {
|
32 | simple = true;
|
33 | }
|
34 | if (simple) O[key] = value;
|
35 | else createNonEnumerableProperty(O, key, value);
|
36 |
|
37 | })(Function.prototype, 'toString', function toString() {
|
38 | return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this);
|
39 | });
|