[jboss-cvs] javassist/src/main/javassist/compiler ...

Shigeru Chiba chiba at is.titech.ac.jp
Sat May 12 10:45:10 EDT 2007


  User: chiba   
  Date: 07/05/12 10:45:10

  Modified:    src/main/javassist/compiler   CodeGen.java
                        MemberCodeGen.java
  Log:
  changed the implementation of try statements so that jsr/ret will not be used anymore.
  
  Revision  Changes    Path
  1.30      +9 -4      javassist/src/main/javassist/compiler/CodeGen.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: CodeGen.java
  ===================================================================
  RCS file: /cvsroot/jboss/javassist/src/main/javassist/compiler/CodeGen.java,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -b -r1.29 -r1.30
  --- CodeGen.java	23 Oct 2006 03:53:06 -0000	1.29
  +++ CodeGen.java	12 May 2007 14:45:10 -0000	1.30
  @@ -1547,6 +1547,15 @@
               cname = MemberResolver.jvmToJavaName(cname);
           }
   
  +        atClassObject2(cname);
  +        exprType = CLASS;
  +        arrayDim = 0;
  +        className = "java/lang/Class";
  +    }
  +
  +    /* MemberCodeGen overrides this method.
  +     */
  +    protected void atClassObject2(String cname) throws CompileError {
           int start = bytecode.currentPc();
           bytecode.addLdc(cname);
           bytecode.addInvokestatic("java.lang.Class", "forName",
  @@ -1581,10 +1590,6 @@
                                    + "Ljava/lang/NoClassDefFoundError;");
           bytecode.addOpcode(ATHROW);
           bytecode.write16bit(pc, bytecode.currentPc() - pc + 1);
  -
  -        exprType = CLASS;
  -        arrayDim = 0;
  -        className = "java/lang/Class";
       }
   
       public void atArrayRead(ASTree array, ASTree index)
  
  
  
  1.27      +56 -30    javassist/src/main/javassist/compiler/MemberCodeGen.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: MemberCodeGen.java
  ===================================================================
  RCS file: /cvsroot/jboss/javassist/src/main/javassist/compiler/MemberCodeGen.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -b -r1.26 -r1.27
  --- MemberCodeGen.java	11 Jan 2006 06:45:55 -0000	1.26
  +++ MemberCodeGen.java	12 May 2007 14:45:10 -0000	1.27
  @@ -24,9 +24,13 @@
   /* Code generator methods depending on javassist.* classes.
    */
   public class MemberCodeGen extends CodeGen {
  +    public static final int JAVA5_VER = 49;
  +    public static final int JAVA6_VER = 50;
  +
       protected MemberResolver resolver;
       protected CtClass   thisClass;
       protected MethodInfo thisMethod;
  +    protected int version;      // the major version of a class file.
   
       protected boolean resultStatic;
   
  @@ -35,6 +39,11 @@
           resolver = new MemberResolver(cp);
           thisClass = cc;
           thisMethod = null;
  +        ClassFile cf = cc.getClassFile2();
  +        if (cf == null)
  +            version = 0;
  +        else
  +            version = cf.getMajorVersion();
       }
   
       /**
  @@ -71,17 +80,27 @@
   
       static class JsrHook extends ReturnHook {
           ArrayList jsrList;
  +        CodeGen cgen;
           int var;
   
           JsrHook(CodeGen gen) {
               super(gen);
               jsrList = new ArrayList();
  -            var = gen.getMaxLocals();
  -            gen.incMaxLocals(1);
  +            cgen = gen;
  +            var = -1;
  +        }
  +
  +        private int getVar(int size) {
  +            if (var < 0) {
  +                var = cgen.getMaxLocals();
  +                cgen.incMaxLocals(size);
  +            }
  +
  +            return var;
           }
   
           private void jsrJmp(Bytecode b) {
  -            b.addOpcode(JSR);
  +            b.addOpcode(Opcode.GOTO);
               jsrList.add(new Integer(b.currentPc()));
               b.addIndex(0);
           }
  @@ -92,27 +111,27 @@
                   jsrJmp(b);
                   break;
               case ARETURN :
  -                b.addAstore(var);
  +                b.addAstore(getVar(1));
                   jsrJmp(b);
                   b.addAload(var);
                   break;
               case IRETURN :
  -                b.addIstore(var);
  +                b.addIstore(getVar(1));
                   jsrJmp(b);
                   b.addIload(var);
                   break;
               case LRETURN :
  -                b.addLstore(var);
  +                b.addLstore(getVar(2));
                   jsrJmp(b);
                   b.addLload(var);
                   break;
               case DRETURN :
  -                b.addDstore(var);
  +                b.addDstore(getVar(2));
                   jsrJmp(b);
                   b.addDload(var);
                   break;
               case FRETURN :
  -                b.addFstore(var);
  +                b.addFstore(getVar(1));
                   jsrJmp(b);
                   b.addFload(var);
                   break;
  @@ -177,7 +196,6 @@
               }
           }
   
  -        int pcFinally = -1;
           if (finallyBlock != null) {
               jsrHook.remove(this);
               // catch (any) clause
  @@ -185,38 +203,42 @@
               bc.addExceptionHandler(start, pcAnyCatch, pcAnyCatch, 0);
               bc.growStack(1);
               bc.addAstore(var);
  -            bc.addOpcode(JSR);
  -            int pcJsrIndex = bc.currentPc();
  -            bc.addIndex(0);       // correct later
  -            bc.addAload(var);
  -            bc.addOpcode(ATHROW);
  -
  -            // finally clause
  -            pcFinally = bc.currentPc();
  -            bc.write16bit(pcJsrIndex, pcFinally - pcJsrIndex + 1);
  -            int retAddr = getMaxLocals();
  -            incMaxLocals(1);
  -            bc.growStack(1);    // return address
  -            bc.addAstore(retAddr);
               hasReturned = false;
               finallyBlock.accept(this);
               if (!hasReturned) {
  -                bc.addOpcode(RET);
  -                bc.add(retAddr);
  +                bc.addAload(var);
  +                bc.addOpcode(ATHROW);
               }
  +
  +            addFinally(jsrHook.jsrList, finallyBlock);
           }
   
           int pcEnd = bc.currentPc();
           patchGoto(gotoList, pcEnd);
  +        hasReturned = !tryNotReturn;
           if (finallyBlock != null) {
  -            patchGoto(jsrHook.jsrList, pcFinally);
  -            if (tryNotReturn) {
  -                bc.addOpcode(JSR);
  -                bc.addIndex(pcFinally - pcEnd);
  +            if (tryNotReturn)
  +                finallyBlock.accept(this);
               }
           }
   
  -        hasReturned = !tryNotReturn;
  +    /**
  +     * Adds a finally clause for earch return statement.
  +     */
  +    private void addFinally(ArrayList returnList, Stmnt finallyBlock)
  +        throws CompileError
  +    {
  +        Bytecode bc = bytecode;
  +        int n = returnList.size();
  +        for (int i = 0; i < n; ++i) {
  +            int pc = ((Integer)returnList.get(i)).intValue();
  +            bc.write16bit(pc, bc.currentPc() - pc + 1);
  +            finallyBlock.accept(this);
  +            if (!hasReturned) {
  +                bc.addOpcode(Opcode.GOTO);
  +                bc.addIndex(pc + 3 - bc.currentPc());
  +            }
  +        }
       }
   
       public void atNewExpr(NewExpr expr) throws CompileError {
  @@ -895,6 +917,10 @@
           return cp.addFieldrefInfo(ci, name, type);
       }
   
  +    protected void atClassObject2(String cname) throws CompileError {
  +        super.atClassObject2(cname);
  +    }
  +
       protected void atFieldPlusPlus(int token, boolean isPost,
                                      ASTree oprand, Expr expr, boolean doDup)
           throws CompileError
  
  
  



More information about the jboss-cvs-commits mailing list