From dc9908674e717ad79112f223e28b8c2f37442b87 Mon Sep 17 00:00:00 2001 From: David Evans Date: Thu, 7 Jan 2021 19:30:11 +0000 Subject: [PATCH] Replace function constructor with defineProperty to preserve arity without eval [#41] --- index.js | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/index.js b/index.js index 1bf2fcf..0742fd9 100644 --- a/index.js +++ b/index.js @@ -64,20 +64,6 @@ function convertDataDescriptorToAccessor (obj, prop, message) { return descriptor } -/** - * Create arguments string to keep arity. - */ - -function createArgumentsString (arity) { - var str = '' - - for (var i = 0; i < arity; i++) { - str += ', arg' + i - } - - return str.substr(2) -} - /** * Create stack string from stack. */ @@ -415,20 +401,17 @@ function wrapfunction (fn, message) { throw new TypeError('argument fn must be a function') } - var args = createArgumentsString(fn.length) + var deprecate = this var stack = getStack() var site = callSiteLocation(stack[1]) site.name = fn.name - // eslint-disable-next-line no-new-func - var deprecatedfn = new Function('fn', 'log', 'deprecate', 'message', 'site', - '"use strict"\n' + - 'return function (' + args + ') {' + - 'log.call(deprecate, message, site)\n' + - 'return fn.apply(this, arguments)\n' + - '}')(fn, log, this, message, site) - + function deprecatedfn () { + log.call(deprecate, message, site) + return fn.apply(this, arguments) + } + Object.defineProperty(deprecatedfn, 'length', { value: fn.length }) return deprecatedfn }