(cfg, branchBlock, mergeBlock, initialVar, phiNode, conditionNode, updateResult)
| 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 |
no test coverage detected