From 878059da1312f99c0658a0e038dfca488e6623f5 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Wed, 26 Jul 2017 16:09:47 +0200 Subject: [PATCH] Added more asserts --- src/dk/camelot64/kickc/Compiler.java | 4 +++ .../passes/Pass2AssertNoCallLvalues.java | 33 +++++++++++++++++++ .../passes/Pass2AssertNoCallParameters.java | 32 ++++++++++++++++++ .../kickc/passes/Pass2AssertNoLabels.java | 25 ++++++++++++++ .../kickc/passes/Pass2AssertNoProcs.java | 30 +++++++++++++++++ 5 files changed, 124 insertions(+) create mode 100644 src/dk/camelot64/kickc/passes/Pass2AssertNoCallLvalues.java create mode 100644 src/dk/camelot64/kickc/passes/Pass2AssertNoCallParameters.java create mode 100644 src/dk/camelot64/kickc/passes/Pass2AssertNoLabels.java create mode 100644 src/dk/camelot64/kickc/passes/Pass2AssertNoProcs.java diff --git a/src/dk/camelot64/kickc/Compiler.java b/src/dk/camelot64/kickc/Compiler.java index ff6dbdd6b..d2110243c 100644 --- a/src/dk/camelot64/kickc/Compiler.java +++ b/src/dk/camelot64/kickc/Compiler.java @@ -148,6 +148,10 @@ public class Compiler { List assertions = new ArrayList<>(); assertions.add(new Pass2AssertSymbols(program)); assertions.add(new Pass2AssertBlocks(program)); + assertions.add(new Pass2AssertNoCallParameters(program)); + assertions.add(new Pass2AssertNoCallLvalues(program)); + assertions.add(new Pass2AssertNoProcs(program)); + assertions.add(new Pass2AssertNoLabels(program)); for (Pass2SsaAssertion assertion : assertions) { assertion.check(); } diff --git a/src/dk/camelot64/kickc/passes/Pass2AssertNoCallLvalues.java b/src/dk/camelot64/kickc/passes/Pass2AssertNoCallLvalues.java new file mode 100644 index 000000000..a6edde7bd --- /dev/null +++ b/src/dk/camelot64/kickc/passes/Pass2AssertNoCallLvalues.java @@ -0,0 +1,33 @@ +package dk.camelot64.kickc.passes; + +import dk.camelot64.kickc.icl.ControlFlowGraphBaseVisitor; +import dk.camelot64.kickc.icl.Program; +import dk.camelot64.kickc.icl.RValue; +import dk.camelot64.kickc.icl.StatementCall; + +import java.util.List; + +/** Asserts that the program does not contain calls with lValues */ +public class Pass2AssertNoCallLvalues extends Pass2SsaAssertion { + + public Pass2AssertNoCallLvalues(Program program) { + super(program); + } + + @Override + public void check() throws AssertionFailed { + + ControlFlowGraphBaseVisitor checkCalls = new ControlFlowGraphBaseVisitor() { + + @Override + public Void visitCall(StatementCall callLValue) { + if(callLValue.getlValue()!=null) { + throw new AssertionFailed("No call lValue allowed! "+callLValue); + } + return null; + } + }; + checkCalls.visitGraph(getGraph()); + } + +} diff --git a/src/dk/camelot64/kickc/passes/Pass2AssertNoCallParameters.java b/src/dk/camelot64/kickc/passes/Pass2AssertNoCallParameters.java new file mode 100644 index 000000000..625b19119 --- /dev/null +++ b/src/dk/camelot64/kickc/passes/Pass2AssertNoCallParameters.java @@ -0,0 +1,32 @@ +package dk.camelot64.kickc.passes; + +import dk.camelot64.kickc.icl.*; + +import java.util.HashSet; +import java.util.List; + +/** Asserts that the program does not contain calls with parameters */ +public class Pass2AssertNoCallParameters extends Pass2SsaAssertion { + + public Pass2AssertNoCallParameters(Program program) { + super(program); + } + + @Override + public void check() throws AssertionFailed { + + ControlFlowGraphBaseVisitor checkCalls = new ControlFlowGraphBaseVisitor() { + + @Override + public Void visitCall(StatementCall callLValue) { + List parameters = callLValue.getParameters(); + if(parameters!=null && parameters.size()>0) { + throw new AssertionFailed("No call parameters allowed! "+callLValue); + } + return null; + } + }; + checkCalls.visitGraph(getGraph()); + } + +} diff --git a/src/dk/camelot64/kickc/passes/Pass2AssertNoLabels.java b/src/dk/camelot64/kickc/passes/Pass2AssertNoLabels.java new file mode 100644 index 000000000..a3112186c --- /dev/null +++ b/src/dk/camelot64/kickc/passes/Pass2AssertNoLabels.java @@ -0,0 +1,25 @@ +package dk.camelot64.kickc.passes; + +import dk.camelot64.kickc.icl.*; + +/** Asserts that the graph contains no label statements */ +public class Pass2AssertNoLabels extends Pass2SsaAssertion { + + public Pass2AssertNoLabels(Program program) { + super(program); + } + + @Override + public void check() throws AssertionFailed { + + ControlFlowGraphBaseVisitor checkCalls = new ControlFlowGraphBaseVisitor() { + + @Override + public Void visitJumpTarget(StatementLabel jumpTarget) { + throw new AssertionFailed("No label statements allowed! "+jumpTarget); + } + }; + checkCalls.visitGraph(getGraph()); + } + +} diff --git a/src/dk/camelot64/kickc/passes/Pass2AssertNoProcs.java b/src/dk/camelot64/kickc/passes/Pass2AssertNoProcs.java new file mode 100644 index 000000000..907b543e4 --- /dev/null +++ b/src/dk/camelot64/kickc/passes/Pass2AssertNoProcs.java @@ -0,0 +1,30 @@ +package dk.camelot64.kickc.passes; + +import dk.camelot64.kickc.icl.*; + +/** Asserts that the graph contains no proc/endproc statements */ +public class Pass2AssertNoProcs extends Pass2SsaAssertion { + + public Pass2AssertNoProcs(Program program) { + super(program); + } + + @Override + public void check() throws AssertionFailed { + + ControlFlowGraphBaseVisitor checkCalls = new ControlFlowGraphBaseVisitor() { + + @Override + public Void visitProcedureBegin(StatementProcedureBegin statement) { + throw new AssertionFailed("No proc statements allowed! "+statement); + } + + @Override + public Void visitProcedureEnd(StatementProcedureEnd statement) { + throw new AssertionFailed("No proc statements allowed! "+statement); + } + }; + checkCalls.visitGraph(getGraph()); + } + +}