You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.6 KiB
39 lines
1.6 KiB
var global = require('../internals/global'); |
|
var shared = require('../internals/shared'); |
|
var hide = require('../internals/hide'); |
|
var has = require('../internals/has'); |
|
var setGlobal = require('../internals/set-global'); |
|
var nativeFunctionToString = require('../internals/function-to-string'); |
|
var InternalStateModule = require('../internals/internal-state'); |
|
|
|
var getInternalState = InternalStateModule.get; |
|
var enforceInternalState = InternalStateModule.enforce; |
|
var TEMPLATE = String(nativeFunctionToString).split('toString'); |
|
|
|
shared('inspectSource', function (it) { |
|
return nativeFunctionToString.call(it); |
|
}); |
|
|
|
(module.exports = function (O, key, value, options) { |
|
var unsafe = options ? !!options.unsafe : false; |
|
var simple = options ? !!options.enumerable : false; |
|
var noTargetGet = options ? !!options.noTargetGet : false; |
|
if (typeof value == 'function') { |
|
if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key); |
|
enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : ''); |
|
} |
|
if (O === global) { |
|
if (simple) O[key] = value; |
|
else setGlobal(key, value); |
|
return; |
|
} else if (!unsafe) { |
|
delete O[key]; |
|
} else if (!noTargetGet && O[key]) { |
|
simple = true; |
|
} |
|
if (simple) O[key] = value; |
|
else hide(O, key, value); |
|
// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative |
|
})(Function.prototype, 'toString', function toString() { |
|
return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this); |
|
});
|
|
|