X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=mjc2wsl.git;a=blobdiff_plain;f=src%2Fmjc2wsl.java;h=11462f4b1acc706c12a3227615635a851f778fa7;hp=113bfef0c197ae7d515ee65c9ada0209f9d20486;hb=1cc5f85fbe5dfa364fe37a3a3cc0d18a0899ca41;hpb=5e03219e880a35b20ba9c2276f24c1f174264b6c diff --git a/src/mjc2wsl.java b/src/mjc2wsl.java index 113bfef..11462f4 100644 --- a/src/mjc2wsl.java +++ b/src/mjc2wsl.java @@ -28,7 +28,7 @@ import java.util.*; * @author Doni Pracner, http://perun.dmi.rs/pracner http://quemaster.com */ public class mjc2wsl{ - public static String versionN = "0.1.6"; + public static String versionN = "0.1.7"; private TransMessages messages = new TransMessages(); @@ -201,6 +201,7 @@ public class mjc2wsl{ ret.append("mjvm_locals := ARRAY(1,0),"); ret.append("\n\tmjvm_statics := ARRAY("+numWords+",0),"); ret.append("\n\tmjvm_arrays := < >,"); + ret.append("\n\tmjvm_flag_jump := 0,"); ret.append("\n\tmjvm_objects := < >,"); ret.append("\n\tmjvm_estack := < >, mjvm_mstack := < > > :"); @@ -522,19 +523,23 @@ public class mjc2wsl{ } case shl: { + prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); prl("VAR :"); prl("\tFOR i:=1 TO tempa STEP 1 DO tempres := tempres * 2 OD;"); prl(createToEStack("tempres")); prl("ENDVAR;"); + prl(createEndVar()); break; } case shr: { + prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); prl("VAR :"); prl("\tFOR i:=1 TO tempa STEP 1 DO tempres := tempres DIV 2 OD;"); prl(createToEStack("tempres")); prl("ENDVAR;"); + prl(createEndVar()); break; } @@ -555,47 +560,56 @@ public class mjc2wsl{ case newarray: { get();// 0 - bytes, 1 - words; ignore for now // TODO take into consideration 0/1 + prl(createStartVar("tempa")); prl(createTopEStack()); prl("mjvm_arrays := mjvm_arrays ++ < ARRAY(tempa,0) >;"); prl(createToEStack("LENGTH(mjvm_arrays)")); + prl(createEndVar()); break; } case aload: case baload: { + prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); prl(createToEStack(createArray("tempb") + "[tempa+1]")); + prl(createEndVar()); break; } case astore: case bastore: { + prl(createStartVar("tempa", "tempb", "tempres")); prl(createFromEStack("tempres")); prl(createTopTwoEStack()); - // we need to use a temparray as a pointer, WSL - // otherwise tries to access it as a list of lists and fails - prl("VAR < tempArray := " + createArray("tempb") + " > :"); - prl("tempArray[tempa+1]:=tempres ENDVAR;"); + prl("mjvm_arrays[tempb][tempa+1]:=tempres;"); + prl(createEndVar()); break; } case arraylength: { + prl(createStartVar("tempa", "tempb")); prl(createTopEStack()); prl("tempb := LENGTH("+ createArray("tempa") + ");"); prl(createToEStack("tempb")); + prl(createEndVar()); break; } case dup: { + prl(createStartVar("tempa", "tempb")); prl(createTopEStack()); prl(createToEStack("tempa")); prl(createToEStack("tempa")); + prl(createEndVar()); break; } case dup2: { + prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); prl(createToEStack("tempb")); prl(createToEStack("tempa")); prl(createToEStack("tempb")); prl(createToEStack("tempa")); + prl(createEndVar()); break; } @@ -617,10 +631,15 @@ public class mjc2wsl{ case jge: { prl(createStartVar("tempa", "tempb")); prl(createTopTwoEStack()); - prl("IF tempb " + getRelationFor(op) + " tempa THEN CALL a" - + (counter + get2()) + " ELSE CALL a" + (counter + 1) + prl("IF tempb " + getRelationFor(op) + + " tempa THEN mjvm_flag_jump := 1" + + " ELSE mjvm_flag_jump := 0" + " FI;"); prl(createEndVar()); + prl("IF mjvm_flag_jump = 1 THEN CALL a" + + (counter + get2()) + + " ELSE CALL a" + (counter + 1) + + " FI;"); break; }