fix unary operator bug in stacksize determination

This commit is contained in:
ChUrl
2021-01-23 20:56:44 +01:00
parent fab8881947
commit a027e449cf
2 changed files with 13 additions and 11 deletions

View File

@ -135,7 +135,7 @@ public final class CodeGenerator {
private void generateMain() { private void generateMain() {
this.jasmin.append(".method public static main([Ljava/lang/String;)V\n") this.jasmin.append(".method public static main([Ljava/lang/String;)V\n")
.append("\t.limit stack ").append(StackSizeAnalyzer.model(this.tree)).append("\n") .append("\t.limit stack ").append(StackSizeAnalyzer.runStackModel(this.tree)).append("\n")
.append("\t.limit locals ").append(this.varMap.size() + 1).append("\n"); .append("\t.limit locals ").append(this.varMap.size() + 1).append("\n");
log("\nGenerating main method code"); log("\nGenerating main method code");

View File

@ -19,16 +19,16 @@ public final class StackSizeAnalyzer {
private StackSizeAnalyzer() {} private StackSizeAnalyzer() {}
public static int model(AST tree) { public static int runStackModel(AST tree) {
log("\nDetermining required stack depth:"); log("\nDetermining required stack depth:");
final StackModel stack = new StackModel(); final StackModel stack = new StackModel();
model(tree.getRoot().getChildren().get(3).getChildren().get(11), stack); runStackModel(tree.getRoot().getChildren().get(3).getChildren().get(11), stack);
return stack.getMax(); return stack.getMax();
} }
private static void model(ASTNode root, StackModel stack) { private static void runStackModel(ASTNode root, StackModel stack) {
if (mod.contains(root.getName())) { if (mod.contains(root.getName())) {
switch (root.getName()) { switch (root.getName()) {
case "assignment" -> assignment(root, stack); case "assignment" -> assignment(root, stack);
@ -39,7 +39,7 @@ public final class StackSizeAnalyzer {
} }
} else { } else {
for (ASTNode child : root.getChildren()) { for (ASTNode child : root.getChildren()) {
model(child, stack); runStackModel(child, stack);
} }
} }
} }
@ -50,7 +50,7 @@ public final class StackSizeAnalyzer {
} }
private static void assignment(ASTNode root, StackModel stack) { private static void assignment(ASTNode root, StackModel stack) {
model(root.getChildren().get(0), stack); runStackModel(root.getChildren().get(0), stack);
log("assignment():"); log("assignment():");
stack.pop(); stack.pop();
@ -59,7 +59,7 @@ public final class StackSizeAnalyzer {
private static void println(ASTNode root, StackModel stack) { private static void println(ASTNode root, StackModel stack) {
stack.push(root); // Getstatic stack.push(root); // Getstatic
model(root.getChildren().get(1).getChildren().get(1), stack); runStackModel(root.getChildren().get(1).getChildren().get(1), stack);
log("println():"); log("println():");
stack.pop(); // Objectref stack.pop(); // Objectref
@ -68,21 +68,23 @@ public final class StackSizeAnalyzer {
private static void expr(ASTNode root, StackModel stack) { private static void expr(ASTNode root, StackModel stack) {
if (root.getChildren().size() == 2 && bin.contains(root.getValue())) { if (root.getChildren().size() == 2 && bin.contains(root.getValue())) {
model(root.getChildren().get(0), stack); runStackModel(root.getChildren().get(0), stack);
model(root.getChildren().get(1), stack); runStackModel(root.getChildren().get(1), stack);
log("expr():"); log("expr():");
stack.pop(); // Argument stack.pop(); // Argument
stack.pop(); // Argument stack.pop(); // Argument
stack.push(root); // Result stack.push(root); // Result
} else if (root.getChildren().size() == 1 && "NOT".equals(root.getValue())) { } else if (root.getChildren().size() == 1 && "NOT".equals(root.getValue())) {
model(root.getChildren().get(0), stack); runStackModel(root.getChildren().get(0), stack);
log("expr():"); log("expr():");
stack.push(root); // 1 for xor stack.push(new ASTNode("1 (XOR)", 0)); // 1 for xor
stack.pop(); // xor stack.pop(); // xor
stack.pop(); // xor stack.pop(); // xor
stack.push(root); // result stack.push(root); // result
} else if (root.getChildren().size() == 1) {
runStackModel(root.getChildren().get(0), stack);
} }
} }
} }