MCPcopy Index your code
hub / github.com/processing/p5.js / buildUnboundedLoop

Method buildUnboundedLoop

src/strands/strands_for.js:178–305  ·  view source on GitHub ↗
(cfg, branchBlock, mergeBlock, initialVar, phiNode, conditionNode, updateResult)

Source from the content-addressed store, hash-verified

176 }
177
178 buildUnboundedLoop(cfg, branchBlock, mergeBlock, initialVar, phiNode, conditionNode, updateResult) {
179 // For unbounded loops, create FOR block with infinite loop and break condition
180 const forBlock = CFG.createBasicBlock(cfg, BlockType.FOR);
181 CFG.addEdge(cfg, branchBlock, forBlock);
182
183 // Create FOR block with three empty statements for for(;;) syntax
184 CFG.pushBlock(cfg, forBlock);
185
186 // 1. Init statement - initialize loop variable or empty
187 if (initialVar) {
188 const initAssignmentNode = DAG.createNodeData({
189 nodeType: NodeType.ASSIGNMENT,
190 dependsOn: [phiNode.id, initialVar.id],
191 phiBlocks: []
192 });
193 const initAssignmentID = DAG.getOrCreateNode(this.strandsContext.dag, initAssignmentNode);
194 CFG.recordInBasicBlock(cfg, forBlock, initAssignmentID);
195 } else {
196 // Create empty statement for init
197 const emptyInitNode = DAG.createNodeData({
198 nodeType: NodeType.STATEMENT,
199 statementType: StatementType.EMPTY,
200 dependsOn: [],
201 phiBlocks: []
202 });
203 const emptyInitID = DAG.getOrCreateNode(this.strandsContext.dag, emptyInitNode);
204 CFG.recordInBasicBlock(cfg, forBlock, emptyInitID);
205 }
206
207 // 2. Condition statement - empty for infinite loop
208 const emptyConditionNode = DAG.createNodeData({
209 nodeType: NodeType.STATEMENT,
210 statementType: StatementType.EMPTY,
211 dependsOn: [],
212 phiBlocks: []
213 });
214 const emptyConditionID = DAG.getOrCreateNode(this.strandsContext.dag, emptyConditionNode);
215 CFG.recordInBasicBlock(cfg, forBlock, emptyConditionID);
216
217 // 3. Update statement - empty for infinite loop
218 const emptyUpdateNode = DAG.createNodeData({
219 nodeType: NodeType.STATEMENT,
220 statementType: StatementType.EMPTY,
221 dependsOn: [],
222 phiBlocks: []
223 });
224 const emptyUpdateID = DAG.getOrCreateNode(this.strandsContext.dag, emptyUpdateNode);
225 CFG.recordInBasicBlock(cfg, forBlock, emptyUpdateID);
226
227 CFG.popBlock(cfg);
228
229 const scopeStartBlock = CFG.createBasicBlock(cfg, BlockType.SCOPE_START);
230 CFG.addEdge(cfg, forBlock, scopeStartBlock);
231
232 // Add break condition check right after scope start
233 const breakCheckBlock = CFG.createBasicBlock(cfg, BlockType.DEFAULT);
234 CFG.addEdge(cfg, scopeStartBlock, breakCheckBlock);
235

Callers 1

buildMethod · 0.95

Calls 2

createLogicalNotNodeMethod · 0.95
executeBodyCallbackMethod · 0.95

Tested by

no test coverage detected