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() {
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");
log("\nGenerating main method code");

View File

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