Skip to content

Commit 94276b1

Browse files
authored
fix indefinite calls to analyzeScript when a large amount of procedures interlink (TurboWarp#334)
1 parent 9f2106a commit 94276b1

1 file changed

Lines changed: 7 additions & 5 deletions

File tree

src/compiler/irgen.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,7 +1459,7 @@ class IRGenerator {
14591459
/** @type {Object.<string, IntermediateScript>} */
14601460
this.procedures = {};
14611461

1462-
this.analyzedProcedures = [];
1462+
this.analyzedProcedures = new Set();
14631463
}
14641464

14651465
addProcedureDependencies (dependencies) {
@@ -1500,12 +1500,11 @@ class IRGenerator {
15001500
const procedureData = this.procedures[procedureCode];
15011501

15021502
// Analyze newly found procedures.
1503-
if (!this.analyzedProcedures.includes(procedureCode)) {
1504-
this.analyzedProcedures.push(procedureCode);
1503+
if (!this.analyzedProcedures.has(procedureCode)) {
1504+
this.analyzedProcedures.add(procedureCode);
15051505
if (this.analyzeScript(procedureData)) {
15061506
madeChanges = true;
15071507
}
1508-
this.analyzedProcedures.pop();
15091508
}
15101509

15111510
// If a procedure used by a script may yield, the script itself may yield.
@@ -1548,7 +1547,10 @@ class IRGenerator {
15481547
}
15491548

15501549
// Analyze scripts until no changes are made.
1551-
while (this.analyzeScript(entry));
1550+
while (this.analyzeScript(entry)) {
1551+
// Reset so all procedures get re-examined each pass.
1552+
this.analyzedProcedures = new Set();
1553+
}
15521554

15531555
return new IntermediateRepresentation(entry, this.procedures);
15541556
}

0 commit comments

Comments
 (0)