]> source.dussan.org Git - javassist.git/commitdiff
corrected to be able to compile an infinite loop. rel_2_6
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Thu, 28 Aug 2003 10:46:36 +0000 (10:46 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Thu, 28 Aug 2003 10:46:36 +0000 (10:46 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@37 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

Readme.html
src/main/javassist/CtClass.java
src/main/javassist/compiler/CodeGen.java

index 74506f3f26e35935b7d01f9843abe99afc43852c..4aa776167b75a322bf34da761a331da54c247315 100644 (file)
@@ -246,7 +246,8 @@ see javassist.Dump.
   <li>javassist.expr.Expr.indexOfBytecode() has been added.
   <li>javassist.Loader has been modified so that getPackage() returns
       a package object.
-  <li>Now, the compiler can correctly compile a try statement.
+  <li>Now, the compiler can correctly compile a try statement and an
+      infinite while-loop.
 </ul>
 
 <p>- version 2.5.1 in May, 2003.
index bb8c46cbd2fbc1874dd8bd664dc5422a67abb382..3b02a41f361fc47ae4e84088640a8b0074e37eb9 100644 (file)
@@ -390,7 +390,8 @@ public abstract class CtClass {
     }
 
     /**
-     * Changes a super class.
+     * Changes a super class.  The new super class must be compatible
+     * with the old one.
      */
     public void setSuperclass(CtClass clazz) throws CannotCompileException {
         checkModify();
index 9d6f769014e03a13a3a5c2646757c3e6684b6595..54f14477c453528471c9bb3d965602a0c9c36527 100644 (file)
@@ -265,10 +265,13 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId {
 
         hasReturned = false;
         s.accept(this);
-        if (isVoid && !hasReturned) {
-            bytecode.addOpcode(Opcode.RETURN);
-            hasReturned = true;
-        }
+        if (!hasReturned)
+            if (isVoid) {
+                bytecode.addOpcode(Opcode.RETURN);
+                hasReturned = true;
+            }
+            else
+                throw new CompileError("no return statement");
     }
 
     private boolean needsSuperCall(Stmnt body) throws CompileError {
@@ -401,14 +404,14 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId {
         if (notDo)
             bytecode.write16bit(pc, pc3 - pc + 1);
 
-        booleanExpr(true, expr);
+        boolean alwaysBranch = booleanExpr(true, expr);
         bytecode.addIndex(pc2 - bytecode.currentPc() + 1);
 
         patchGoto(breakList, bytecode.currentPc());
         patchGoto(continueList, pc3);
         continueList = prevContList;
         breakList = prevBreakList;
-        hasReturned = false;
+        hasReturned = alwaysBranch;
     }
 
     private void patchGoto(ArrayList list, int targetPc) {
@@ -879,10 +882,9 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId {
     /* Produces the opcode to branch if the condition is true.
      * The oprand is not produced.
      *
-     * If false is returned, the branch occurs if the condition is
-     * false.
+     * @return true if the compiled code is GOTO (always branch).
      */
-    private void booleanExpr(boolean branchIf, ASTree expr)
+    private boolean booleanExpr(boolean branchIf, ASTree expr)
         throws CompileError
     {
         boolean isAndAnd;
@@ -907,6 +909,10 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId {
                 bytecode.addOpcode(Opcode.GOTO);
             }
         }
+        else if (isAlwaysBranch(expr, branchIf)) {
+            bytecode.addOpcode(Opcode.GOTO);
+            return true;       // always branch
+        }
         else {                          // others
             expr.accept(this);
             bytecode.addOpcode(branchIf ? IFNE : IFEQ);
@@ -914,6 +920,17 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId {
 
         exprType = BOOLEAN;
         arrayDim = 0;
+        return false;
+    }
+
+
+    private static boolean isAlwaysBranch(ASTree expr, boolean branchIf) {
+        if (expr instanceof Keyword) {
+            int t = ((Keyword)expr).get();
+            return branchIf ? t == TRUE : t == FALSE;
+        }
+
+        return false;
     }
 
     private static int getCompOperator(ASTree expr) throws CompileError {