Skip to content

Commit

Permalink
WIP 3
Browse files Browse the repository at this point in the history
  • Loading branch information
overlookmotel committed Nov 10, 2023
1 parent 6cb8c1a commit d847229
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 13 deletions.
22 changes: 11 additions & 11 deletions lib/init/eval.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,17 @@ const DEBUG = !!process.env.LIVEPACK_DEBUG_INSTRUMENT;
* @param {Function} tracker - Tracker function for file
* @param {string} filename - File path
* @param {Object} blockIdCounter - Block ID counter for file
* @param {number} prefixNum - Internal vars prefix num
* @returns {undefined}
*/
module.exports = function addEvalFunctionsToTracker(tracker, filename, blockIdCounter) {
module.exports = function addEvalFunctionsToTracker(tracker, filename, blockIdCounter, prefixNum) {
const evalIndirectLocal = {
eval(code) {
return evalIndirect(code, tracker, filename, blockIdCounter, evalIndirectLocal);
return evalIndirect(code, tracker, filename, blockIdCounter, prefixNum, evalIndirectLocal);
}
}.eval;
const evalDirectLocal = (...args) => evalDirect(
args, tracker, filename, blockIdCounter, evalDirectLocal
args, tracker, filename, blockIdCounter, prefixNum, evalDirectLocal
);
tracker.evalIndirect = evalIndirectLocal;
tracker.evalDirect = evalDirectLocal;
Expand All @@ -60,17 +61,17 @@ module.exports = function addEvalFunctionsToTracker(tracker, filename, blockIdCo
* @param {Function} tracker - Tracker function for file
* @param {string} filename - File path
* @param {Object} blockIdCounter - Block ID counter for file
* @param {number} externalPrefixNum - Internal vars prefix num outside `eval`
* @param {Function} evalIndirectLocal - Function which was called (used for stack traces if error)
* @returns {*} - Result of `eval()` call
*/
function evalIndirect(code, tracker, filename, blockIdCounter, evalIndirectLocal) {
function evalIndirect(code, tracker, filename, blockIdCounter, externalPrefixNum, evalIndirectLocal) {
// If `code` arg is not a string, eval it unchanged - it won't be evaluated as code
// eslint-disable-next-line no-eval
if (!isString(code)) return execEvalCode(eval, code, false, code, evalIndirectLocal);

// Compile code with no external scope.
// Code returned is for a function which takes arguments `(livepack_tracker, livepack_getScopeId)`.
const externalPrefixNum = tracker.prefixNum;
const {code: fnCode, shouldThrow, internalPrefixNum} = compile(
code, filename, blockIdCounter, externalPrefixNum, true, undefined, false
);
Expand All @@ -95,10 +96,11 @@ function evalIndirect(code, tracker, filename, blockIdCounter, evalIndirectLocal
* @param {Function} tracker - Tracker function for file
* @param {string} filename - File path
* @param {Object} blockIdCounter - Block ID counter for file
* @param {number} externalPrefixNum - Internal vars prefix num outside `eval`
* @param {Function} evalDirectLocal - Function which was called (used for stack traces if error)
* @returns {*} - Result of `eval()` call
*/
function evalDirect(args, tracker, filename, blockIdCounter, evalDirectLocal) {
function evalDirect(args, tracker, filename, blockIdCounter, externalPrefixNum, evalDirectLocal) {
const callArgs = args.slice(0, -5),
code = callArgs[0],
[possibleEval, execEvalSingleArg, execEvalSpread, scopeDefs, isStrict] = args.slice(-5);
Expand Down Expand Up @@ -145,10 +147,8 @@ function evalDirect(args, tracker, filename, blockIdCounter, evalDirectLocal) {

// Compile to executable code with tracking code inserted.
// If var names prefix inside code has to be different from outside,
// code is wrapped in an IIFE which renames the tracker/eval functions:
// `() => foo` ->
// `((livepack1_tracker, livepack1_getScopeId) => () => foo)(livepack_tracker, livepack_getScopeId)`
const externalPrefixNum = tracker.prefixNum;
// code is wrapped in a function which injects tracker and getScopeId functions:
// `() => foo` -> `(livepack1_tracker, livepack1_getScopeId) => () => foo`
const {
code: codeInstrumented, shouldThrow, internalPrefixNum
} = compile(code, filename, blockIdCounter, externalPrefixNum, false, state, isStrict);
Expand Down Expand Up @@ -225,7 +225,7 @@ function compile(code, filename, blockIdCounter, externalPrefixNum, isIndirectEv
code, filename, false, false, !isIndirectEval, false, isStrict, false, undefined
).ast;
} catch (err) {
return {code, shouldThrow: true, prefixNum: externalPrefixNum};
return {code, shouldThrow: true, internalPrefixNum: externalPrefixNum};
}

// Instrument code.
Expand Down
3 changes: 1 addition & 2 deletions lib/init/tracker.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ const addEvalFunctionsToTracker = require('./eval.js'),
*/
function createTracker(filename, blockIdCounter, prefixNum) {
const localTracker = (getFnInfo, getScopes) => tracker(getFnInfo, getScopes);
localTracker.prefixNum = prefixNum;
addEvalFunctionsToTracker(localTracker, filename, blockIdCounter);
addEvalFunctionsToTracker(localTracker, filename, blockIdCounter, prefixNum);
return localTracker;
}

0 comments on commit d847229

Please sign in to comment.