diff options
author | Iru Cai <mytbk920423@gmail.com> | 2014-11-27 14:36:04 +0800 |
---|---|---|
committer | Iru Cai <mytbk920423@gmail.com> | 2014-11-27 14:36:04 +0800 |
commit | 13d99117abb64f97b5636029134ccae8acb89f59 (patch) | |
tree | 6e5f6b88b3bd92c8c167de305b922bc936146f5d | |
parent | 37365fc2749ff24ef5040a8db3462fc2deebd48f (diff) | |
download | minijava-13d99117abb64f97b5636029134ccae8acb89f59.tar.xz |
convert jump target string to real statement
-rw-r--r-- | src/spiglet/spiglet2kanga/SpgProc.java | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/spiglet/spiglet2kanga/SpgProc.java b/src/spiglet/spiglet2kanga/SpgProc.java index c4d6e5f..f1f0f34 100644 --- a/src/spiglet/spiglet2kanga/SpgProc.java +++ b/src/spiglet/spiglet2kanga/SpgProc.java @@ -1,5 +1,6 @@ package spiglet.spiglet2kanga; +import java.util.HashMap; import java.util.Vector; public class SpgProc extends SpgSym { @@ -31,4 +32,40 @@ public class SpgProc extends SpgSym { } System.err.println(); } + + public void setJmpTarget() { + // convert all the jump labels to real statement + + // first scan all the labels + HashMap<String, SpgStmt> s = new HashMap<String, SpgStmt>(); + for (int i=0; i<statements.size(); i++) { + SpgStmt stmt = statements.elementAt(i); + if (stmt.lb!=null) { + s.put(stmt.lb, stmt); + } + } + + for (int i=0; i<statements.size(); i++) { + SpgStmt stmt = statements.elementAt(i); + if (stmt.type==SpgStmt.StmtType.JUMP) { + stmt.succ1 = s.get(stmt.jmptarget); + stmt.succ2 = null; + } else if (stmt.type==SpgStmt.StmtType.CJUMP) { + if (i==statements.size()-1) { + stmt.succ1 = null; + } else { + stmt.succ1 = statements.elementAt(i+1); + } + stmt.succ2 = s.get(stmt.jmptarget); + } else { + if (i==statements.size()-1) { + stmt.succ1 = null; + } + } + } + } + + + + } |