From d263118920b3036abaddb81f6d953acd8829df61 Mon Sep 17 00:00:00 2001 From: Michael FIG Date: Sat, 13 Jun 2020 14:58:28 -0600 Subject: [PATCH] fix: preserve `eval` identity to support direct eval --- packages/tame-metering/src/tame.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/tame-metering/src/tame.js b/packages/tame-metering/src/tame.js index 5260516fbd5..31f1b69a58b 100644 --- a/packages/tame-metering/src/tame.js +++ b/packages/tame-metering/src/tame.js @@ -5,7 +5,7 @@ let replaceGlobalMeter; // When using this function's text in a SES-1.0 shim, we redefine this // constant to be Error. -const SES1ErrorConstructor = Error; +const SES1ErrorConstructor = null; export function tameMetering() { if (replaceGlobalMeter) { @@ -34,6 +34,9 @@ export function tameMetering() { const setWrapped = (...args) => apply(wmSet, wrapped, args); const getWrapped = (...args) => apply(wmGet, wrapped, args); + // eslint-disable-next-line no-new-func + const globalEval = Function('return eval')(); + // How to test for a constructor: https://stackoverflow.com/a/48036194 const isConstructorHandler = { construct() { @@ -76,7 +79,8 @@ export function tameMetering() { if ( typeof target !== 'function' || target === FunctionPrototype || - target === SES1ErrorConstructor + target === SES1ErrorConstructor || + target === globalEval ) { // Preserve identity and mutate in place. wrapper = target; @@ -142,6 +146,9 @@ export function tameMetering() { ({ [name]: wrapper } = { [name](...args) { // Fast path: + if (name === 'eval') { + console.log('eval escaped', target); + } if (!globalMeter) { return apply(target, this, args); }