gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control system
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (from parent 1: 376108f)
raw | patch | inline | side by side (from parent 1: 376108f)
author | Doni Pracner <quinnuendo@gmail.com> | |
Wed, 20 Apr 2016 18:02:29 +0000 (20:02 +0200) | ||
committer | Doni Pracner <quinnuendo@gmail.com> | |
Wed, 20 Apr 2016 18:02:29 +0000 (20:02 +0200) |
this introduces the code to generate local variables in procedures
to be separate and separatly be put on the stack (though not
exactly in the same way as in the original VM), instead of
using one array to store all of the local varaiables which simulated
the "stack frame".
to be separate and separatly be put on the stack (though not
exactly in the same way as in the original VM), instead of
using one array to store all of the local varaiables which simulated
the "stack frame".
src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java | patch | blob | history |
diff --git a/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java b/src/com/quemaster/transformations/mjc2wsl/mjc2wsl.java
private boolean genLocalVars = true;
private boolean genLocalVars = true;
+ // make an array for all local variables OTHERWISE make them separate
+ private boolean genLocalsAsArray = true;
+
/** Constant used for marking a regular comment from the original file */
public static final char C_REG = ' ';
/**
/** Constant used for marking a regular comment from the original file */
public static final char C_REG = ' ';
/**
ret.append("\n\ttempa := 0, tempb :=0, tempres := 0,");
} else
ret.append("\n\tmjvm_flag_jump := 0,");
ret.append("\n\ttempa := 0, tempb :=0, tempres := 0,");
} else
ret.append("\n\tmjvm_flag_jump := 0,");
- ret.append("mjvm_locals := ARRAY(1,0),");
+
+ if (genLocalsAsArray)
+ ret.append("mjvm_locals := ARRAY(1,0),");
+
ret.append("\n\tmjvm_statics := ARRAY("+numWords+",0),");
ret.append("\n\tmjvm_arrays := < >,");
ret.append("\n\tmjvm_objects := < >,");
ret.append("\n\tmjvm_statics := ARRAY("+numWords+",0),");
ret.append("\n\tmjvm_arrays := < >,");
ret.append("\n\tmjvm_objects := < >,");
private String createLocal(int i) {
// arrays start at 1 in WSL, so we need an offset
private String createLocal(int i) {
// arrays start at 1 in WSL, so we need an offset
- return "mjvm_locals[" + (i + 1) + "]";
+ if (genLocalsAsArray)
+ return "mjvm_locals[" + (i + 1) + "]";
+ else
+ return "mjvm_locals_" + i;
}
private String createStatic(int i) {
}
private String createStatic(int i) {
prl(createStandardStart(mjInput.getNumberOfWords(this)));
prl("SKIP;\n ACTIONS a" + (14 + mjInput.getMainAdr(this)) + " :");
prl(createStandardStart(mjInput.getNumberOfWords(this)));
prl("SKIP;\n ACTIONS a" + (14 + mjInput.getMainAdr(this)) + " :");
+
+ // the number of Locals for procedures; need to remember it for exits
+ int numberOfLocals = 0;
+
int op = mjInput.get();
while (op >= 0) {
prl(" a" + mjInput.getCounter() + " ==");
int op = mjInput.get();
while (op >= 0) {
prl(" a" + mjInput.getCounter() + " ==");
case enter: {
int parameters = mjInput.get();
case enter: {
int parameters = mjInput.get();
- int locals = mjInput.get();
- prl(createToMStack("mjvm_locals"));
- prl("mjvm_locals := ARRAY(" + locals + ",0);");
+ numberOfLocals = mjInput.get();
+ if (genLocalsAsArray) {
+ prl(createToMStack("mjvm_locals"));
+ prl("mjvm_locals := ARRAY(" + numberOfLocals + ",0);");
+ } else {
+ // TODO maybe we should generate VAR block for these somewhere
+ for (int i = 0; i < numberOfLocals; i++) {
+ prl(createToMStack(createLocal(i)));
+ }
+ }
+
for (int i = parameters - 1; i >= 0; i--)
prl(createFromEStack(createLocal(i)));
break;
}
case exit: {
for (int i = parameters - 1; i >= 0; i--)
prl(createFromEStack(createLocal(i)));
break;
}
case exit: {
- prl(createFromMStack("mjvm_locals"));
+ if (genLocalsAsArray) {
+ prl(createFromMStack("mjvm_locals"));
+ } else {
+ // there are as many locals as defined in the last enter
+ for (int i = numberOfLocals -1; i >= 0; i--)
+ prl(createFromMStack(createLocal(i)));
+ }
break;
}
break;
}
System.out.println(" --genLocalVars generate local VAR block for temp variables");
System.out.print(!genLocalVars?'*':' ');
System.out.println(" --genGlobalVars do NOT generate local VAR block for temp variables");
System.out.println(" --genLocalVars generate local VAR block for temp variables");
System.out.print(!genLocalVars?'*':' ');
System.out.println(" --genGlobalVars do NOT generate local VAR block for temp variables");
+ System.out.println();
+ System.out.print(genLocalsAsArray?'*':' ');
+ System.out.println(" --genLocalsAsArray generate local variables as an array");
+ System.out.print(!genLocalsAsArray?'*':' ');
+ System.out.println(" --genLocalsSeparate generate local variables as separate entities");
}
public void printHelpHelp() {
}
public void printHelpHelp() {
genLocalVars = true;
} else if (args[i].compareToIgnoreCase("--genGlobalVars") == 0) {
genLocalVars = false;
genLocalVars = true;
} else if (args[i].compareToIgnoreCase("--genGlobalVars") == 0) {
genLocalVars = false;
+ } else if (args[i].compareToIgnoreCase("--genLocalsAsArray") == 0) {
+ genLocalsAsArray = true;
+ } else if (args[i].compareToIgnoreCase("--genLocalsSeparate") == 0) {
+ genLocalsAsArray = false;
} else {
System.err.println("unknown option: "+args[i]);
}
} else {
System.err.println("unknown option: "+args[i]);
}