From b07c8c5609ff63e7c83796e8ce0602cbeaae0d8a Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Sat, 22 Aug 2020 14:02:03 -0500 Subject: [PATCH] ast: Rewrite analysis Analysis now also flattens the dependedProcedures list --- src/compiler/astgen.js | 43 +++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/compiler/astgen.js b/src/compiler/astgen.js index ae756a17..45e63333 100644 --- a/src/compiler/astgen.js +++ b/src/compiler/astgen.js @@ -14,7 +14,7 @@ const compatBlocks = require('./compat-blocks'); * @property {boolean} hasArguments * @property {boolean} isWarp * @property {boolean} yields - * @property {Array} dependedProcedures The list of procedure codes that this tree directly depends on. These procedures may have additional dependencies, and so on. + * @property {Array} dependedProcedures The full list of procedure codes that this tree directly depends on. * @property {*} cachedCompileResult */ @@ -1310,7 +1310,7 @@ class ASTGenerator { /** @type {Object.} */ this.procedures = {}; - this.procedureAnalysisStack = []; + this.procedureStack = []; } addProcedureDependencies (dependencies) { @@ -1340,31 +1340,31 @@ class ASTGenerator { return result; } - analyzeProcedures () { - for (const procedureCode of Object.keys(this.procedures)) { - const procedureData = this.procedures[procedureCode]; - - if (procedureData.yields) { + /** + * Recursively analyze a script tree and its dependencies. + * @param {Tree} tree Root script tree. + */ + analyzeScript (tree) { + for (const procedureCode of tree.dependedProcedures) { + if (this.procedureStack.includes(procedureCode)) { continue; } + this.procedureStack.push(procedureCode); - const visited = []; + const procedureData = this.procedures[procedureCode]; + this.analyzeScript(procedureData); for (const dependedProcedureCode of procedureData.dependedProcedures) { - if (visited.includes(dependedProcedureCode)) { - continue; - } - - // TODO: also have to check dependencies of dependencies - - const dependedProcedureData = this.procedures[dependedProcedureCode]; - visited.push(dependedProcedureCode); - - if (dependedProcedureData.yields) { - procedureData.yields = true; - break; + if (!tree.dependedProcedures.includes(dependedProcedureCode)) { + tree.dependedProcedures.push(dependedProcedureCode); } } + + if (procedureData.yields) { + tree.yields = true; + } + + this.procedureStack.pop(); } } @@ -1412,7 +1412,8 @@ class ASTGenerator { } } - this.analyzeProcedures(); + // This will recursively analyze procedures as well. + this.analyzeScript(entry); return { entry: entry,