diff --git a/smojol-core/src/main/java/org/smojol/common/transpiler/SLIFORangeCriterionTask.java b/smojol-core/src/main/java/org/smojol/common/transpiler/SLIFORangeCriterionTask.java index 2378d553..33cfef9f 100644 --- a/smojol-core/src/main/java/org/smojol/common/transpiler/SLIFORangeCriterionTask.java +++ b/smojol-core/src/main/java/org/smojol/common/transpiler/SLIFORangeCriterionTask.java @@ -19,6 +19,7 @@ public Set rangesTerminatingIn(ProcedureRange range) { Set bodyVertices = range.body().vertexSet(); Set selfExit = bodyVertices.stream().filter(v -> v == range.exit()).collect(Collectors.toUnmodifiableSet()); Set body = Sets.difference(bodyVertices, selfExit); +// Set body = bodyVertices; Set rangesTerminatingInCurrentRangeIncludingSelf = procedureRanges.stream() .filter(bbr -> body.contains(bbr.exit())) .collect(Collectors.toUnmodifiableSet()); diff --git a/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/CallRangesTask.java b/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/CallRangesTask.java index 59aef43a..4e529fbc 100644 --- a/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/CallRangesTask.java +++ b/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/CallRangesTask.java @@ -14,20 +14,27 @@ public class CallRangesTask { private final TranspilerNode tree; private final List instructions; + private final TranspilerNode mainNode; - public CallRangesTask(TranspilerNode tree, List instructions) { + public CallRangesTask(TranspilerNode tree, List instructions, TranspilerNode mainNode) { this.tree = tree; this.instructions = instructions; + this.mainNode = mainNode; + } + + public CallRangesTask(TranspilerCodeBlockNode program, List instructions) { + this(program, instructions, new NullTranspilerNode()); } public Set> run() { Set allCalls = findAllRecursive(tree, n -> n instanceof JumpTranspilerNode l && l.getEnd() != LocationNode.NULL).stream().collect(Collectors.toUnmodifiableSet()); - List allBlocks = findAllRecursiveOrdered(tree, n -> n instanceof LabelledTranspilerCodeBlockNode).stream().toList(); - Pair programLevelRange = ImmutablePair.of( - entryOrExitVertex(allBlocks.getFirst(), CodeSentinelType.ENTER), - entryOrExitVertex(allBlocks.getLast(), CodeSentinelType.EXIT)); + Stream> programLevelRange = mainNode instanceof NullTranspilerNode + ? Stream.empty() + : Stream.of(ImmutablePair.of( + entryOrExitVertex(mainNode, CodeSentinelType.ENTER), + entryOrExitVertex(mainNode, CodeSentinelType.EXIT))); - return Stream.concat(Stream.of(programLevelRange), + return Stream.concat(programLevelRange, allCalls.stream().map(call -> { TranspilerNode entryBlock = labelledBlock(((JumpTranspilerNode) call).getStart()); TranspilerNode exitBlock = labelledBlock(((JumpTranspilerNode) call).getEnd()); diff --git a/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/ProcedureBodyTask.java b/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/ProcedureBodyTask.java index 000bfc90..4b2fe65d 100644 --- a/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/ProcedureBodyTask.java +++ b/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/ProcedureBodyTask.java @@ -14,15 +14,21 @@ public class ProcedureBodyTask { private final TranspilerNode program; private final List instructions; private final Graph instructionFlowgraph; + private final TranspilerNode mainNode; - public ProcedureBodyTask(TranspilerNode program, List instructions, Graph instructionFlowgraph) { + public ProcedureBodyTask(TranspilerNode program, List instructions, Graph instructionFlowgraph, TranspilerNode mainNode) { this.program = program; this.instructions = instructions; this.instructionFlowgraph = instructionFlowgraph; + this.mainNode = mainNode; + } + + public ProcedureBodyTask(TranspilerNode program, List instructions, Graph implicitCFG) { + this(program, instructions, implicitCFG, new NullTranspilerNode()); } public Set>> run() { - Set bodiesWithoutChildren = new CallRangesTask(program, instructions).run().stream().map(range -> new RangeBodyTask(instructionFlowgraph).run(range)).collect(Collectors.toUnmodifiableSet()); + Set bodiesWithoutChildren = new CallRangesTask(program, instructions, mainNode).run().stream().map(range -> new RangeBodyTask(instructionFlowgraph).run(range)).collect(Collectors.toUnmodifiableSet()); return rangesWithChildren(bodiesWithoutChildren); } diff --git a/smojol-toolkit/src/main/java/org/smojol/toolkit/examples/SLIFORangeMain.java b/smojol-toolkit/src/main/java/org/smojol/toolkit/examples/SLIFORangeMain.java index d49a3b99..dd540bfc 100644 --- a/smojol-toolkit/src/main/java/org/smojol/toolkit/examples/SLIFORangeMain.java +++ b/smojol-toolkit/src/main/java/org/smojol/toolkit/examples/SLIFORangeMain.java @@ -8,7 +8,6 @@ import org.smojol.common.flowchart.FlowchartOutputFormat; import org.smojol.common.id.IncrementingIdProvider; import org.smojol.common.id.UUIDProvider; -import org.smojol.common.pseudocode.BasicBlock; import org.smojol.common.resource.LocalFilesystemOperations; import org.smojol.common.transpiler.*; import org.smojol.toolkit.analysis.pipeline.ProgramSearch; @@ -27,7 +26,7 @@ import java.util.Map; import java.util.Set; -import static org.smojol.toolkit.task.CommandLineAnalysisTask.*; +import static org.smojol.toolkit.task.CommandLineAnalysisTask.BUILD_BASE_ANALYSIS; public class SLIFORangeMain { public static void main(String[] args) throws IOException, InterruptedException { diff --git a/smojol-toolkit/src/test/java/org/smojol/toolkit/analysis/task/SLIFORangeTaskTest.java b/smojol-toolkit/src/test/java/org/smojol/toolkit/analysis/task/SLIFORangeTaskTest.java index 08db08ab..9da7735f 100644 --- a/smojol-toolkit/src/test/java/org/smojol/toolkit/analysis/task/SLIFORangeTaskTest.java +++ b/smojol-toolkit/src/test/java/org/smojol/toolkit/analysis/task/SLIFORangeTaskTest.java @@ -11,7 +11,6 @@ import org.smojol.common.transpiler.*; import org.smojol.toolkit.analysis.task.transpiler.BuildTranspilerInstructionsFromIntermediateTreeTask; import org.smojol.toolkit.analysis.task.transpiler.ProcedureBodyTask; -import org.smojol.toolkit.analysis.task.transpiler.RangeBodyTask; import java.util.List; import java.util.Set; @@ -89,9 +88,9 @@ public void canDetermineSLIFORangesInductively() { Graph implicitCFG = new BuildImplicitInstructionControlFlowgraphTask(instructions, ImmutableList.of()).run(); Set>> rangesWithChildren = new ProcedureBodyTask(program, instructions, implicitCFG).run(); SLIFORangeCriterionTask task = new SLIFORangeCriterionTask(rangesWithChildren); - assertEquals(3, rangesWithChildren.size()); + assertEquals(2, rangesWithChildren.size()); Set>> allSLIFORanges = task.allSLIFORanges(rangesWithChildren); - assertEquals(3, allSLIFORanges.size()); + assertEquals(2, allSLIFORanges.size()); } private static PrintTranspilerNode p() {