From 6fec59bd0076952346fde616d896aa3f9e2f4c1f Mon Sep 17 00:00:00 2001 From: Haiyang Date: Wed, 2 Oct 2019 16:14:17 +0200 Subject: [PATCH] update forinof analysis to always show the target object --- .../js/analysis/forinof/analysis.js | 14 ++++++++++---- .../analysis/forinof/minitests.forinof.js.expected | 6 +++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/ch.usi.inf.nodeprof/js/analysis/forinof/analysis.js b/src/ch.usi.inf.nodeprof/js/analysis/forinof/analysis.js index 142a16c2..115157a4 100644 --- a/src/ch.usi.inf.nodeprof/js/analysis/forinof/analysis.js +++ b/src/ch.usi.inf.nodeprof/js/analysis/forinof/analysis.js @@ -19,7 +19,10 @@ const assert = require('assert'); function MyAnalysis() { - // last expression before for-in/for-of is the iteration object + // last expression in the current frame before for-in/for-of is the iteration object + let lastExprCurFrame = []; + + // last expression executed anywhere let lastExprResult; // control flow tracking @@ -57,8 +60,9 @@ } logLoc('cfRootEnter', iid, type); if (type === J$.cf.FOR_OF || type === J$.cf.FOR_IN) { - const o = lastExprResult; - console.log('iteration obj:', nextFuncs.has(o.next) ? '' : o); + assert(lastExprCurFrame.length > 0); + const targetObjectExpression = lastExprCurFrame[lastExprCurFrame.length-1]; + console.log('iteration obj:', JSON.stringify(targetObjectExpression), nextFuncs.has(lastExprResult.result.next) ? '' : ''); } cfRoots.set(iid, type); } @@ -86,6 +90,7 @@ } } this.functionEnter = function (iid, f, dis, args) { + lastExprCurFrame.push(null); if (iteratorFuncs.has(f)) { console.log("functionEnter: %s / %s / %d", f.name, J$.iidToLocation(iid), arguments.length); iteratorIIDs.add(iid); @@ -95,6 +100,7 @@ } } this.functionExit = function (iid, returnVal) { + lastExprCurFrame.pop(); if (iteratorIIDs.has(iid)) { nextFuncs.add(returnVal.next); } @@ -106,7 +112,7 @@ } } this.endExpression = function (iid, type, result) { - lastExprResult = result; + lastExprResult = lastExprCurFrame[lastExprCurFrame.length-1] = {result, loc: J$.iidToLocation(iid)}; } } diff --git a/src/ch.usi.inf.nodeprof/js/analysis/forinof/minitests.forinof.js.expected b/src/ch.usi.inf.nodeprof/js/analysis/forinof/minitests.forinof.js.expected index 765175ad..80888580 100644 --- a/src/ch.usi.inf.nodeprof/js/analysis/forinof/minitests.forinof.js.expected +++ b/src/ch.usi.inf.nodeprof/js/analysis/forinof/minitests.forinof.js.expected @@ -1,12 +1,12 @@ cfRootEnter@(src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:22:1:23:2) ForInIteration -iteration obj: { x: 'valueX', y: 'valueY' } +iteration obj: {"result":{"x":"valueX","y":"valueY"},"loc":"(src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:22:17:22:20)"} cfRoot ForInIteration @ (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:22:1:23:2) \-cfBlock @ (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:22:1:23:2) cfRoot ForInIteration @ (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:22:1:23:2) \-cfBlock @ (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:22:1:23:2) cfRootExit@(src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:22:1:23:2) ForInIteration cfRootEnter@(src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:27:1:28:2) ForOfIteration -iteration obj: [ 41, 42, 43 ] +iteration obj: {"result":[41,42,43],"loc":"(src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:27:17:27:20)"} cfRoot ForOfIteration @ (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:27:1:28:2) \-cfBlock @ (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:27:1:28:2) cfRoot ForOfIteration @ (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:27:1:28:2) @@ -16,7 +16,7 @@ cfRoot ForOfIteration @ (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:27 cfRootExit@(src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:27:1:28:2) ForOfIteration functionEnter: [Symbol.iterator] / (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:35:3:48:4) / 4 cfRootEnter@(src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:53:1:54:2) ForOfIteration -iteration obj: +iteration obj: {"result":{"itemB":"bar"},"loc":"(src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:53:11:53:12)"} read@ (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:39:13:39:26) moreToIterate read@ (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:40:32:40:45) moreToIterate read@ (src/ch.usi.inf.nodeprof.test/js/minitests/forinof.js:40:53:40:58) itemA