diff options
author | chiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3> | 2005-01-09 17:15:25 +0000 |
---|---|---|
committer | chiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3> | 2005-01-09 17:15:25 +0000 |
commit | 91895bb38cf5cf4feaf8dcb3ba76555d67d765db (patch) | |
tree | c107f606ed972dec2956b335cadc84437114c085 /src/main/javassist/expr/Expr.java | |
parent | b28caee37389d844b4d9c537f031a5bc294c89c0 (diff) | |
download | javassist-91895bb38cf5cf4feaf8dcb3ba76555d67d765db.tar.gz javassist-91895bb38cf5cf4feaf8dcb3ba76555d67d765db.zip |
Reformatted the soruce files modified by Bill.
The "created* field in MethodInfo has been commented out
since (maybe) it is not used at all.
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@150 30ef5769-5b8d-40dd-aea6-55b5d6557bb3
Diffstat (limited to 'src/main/javassist/expr/Expr.java')
-rw-r--r-- | src/main/javassist/expr/Expr.java | 469 |
1 files changed, 225 insertions, 244 deletions
diff --git a/src/main/javassist/expr/Expr.java b/src/main/javassist/expr/Expr.java index 8d2b75ab..3f47054a 100644 --- a/src/main/javassist/expr/Expr.java +++ b/src/main/javassist/expr/Expr.java @@ -41,250 +41,231 @@ import java.util.LinkedList; /** * Expression. */ -public abstract class Expr implements Opcode -{ - int currentPos; - CodeIterator iterator; - CtClass thisClass; - MethodInfo thisMethod; - - boolean edited; - int maxLocals, maxStack; - - static final String javaLangObject = "java.lang.Object"; - - /** - * Undocumented constructor. Do not use; internal-use only. - */ - protected Expr(int pos, CodeIterator i, CtClass declaring, MethodInfo m) - { - currentPos = pos; - iterator = i; - thisClass = declaring; - thisMethod = m; - } - - protected final ConstPool getConstPool() - { - return thisMethod.getConstPool(); - } - - protected final boolean edited() - { - return edited; - } - - protected final int locals() - { - return maxLocals; - } - - protected final int stack() - { - return maxStack; - } - - /** - * Returns true if this method is static. - */ - protected final boolean withinStatic() - { - return (thisMethod.getAccessFlags() & AccessFlag.STATIC) != 0; - } - - /** - * Returns the constructor or method containing the expression. - */ - public CtBehavior where() - { - MethodInfo mi = thisMethod; - CtBehavior[] cb = thisClass.getDeclaredBehaviors(); - for (int i = cb.length - 1; i >= 0; --i) - if (cb[i].getMethodInfo2() == mi) - return cb[i]; - - CtConstructor init = thisClass.getClassInitializer(); - if (init != null && init.getMethodInfo2() == mi) - return init; - - // todo REVISIT I needed to add this because for some reason mi != cb[i] - for (int i = cb.length - 1; i >= 0; --i) - { - if (thisMethod.getName().equals(cb[i].getMethodInfo2().getName()) && thisMethod.getDescriptor().equals(cb[i].getMethodInfo2().getDescriptor())) - { - return cb[i]; - } - } - - String msg = "fatal: not found"; - throw new RuntimeException(msg); - } - - /** - * Returns the list of exceptions that the expression may throw. - * This list includes both the exceptions that the try-catch statements - * including the expression can catch and the exceptions that - * the throws declaration allows the method to throw. - */ - public CtClass[] mayThrow() - { - ClassPool pool = thisClass.getClassPool(); - ConstPool cp = thisMethod.getConstPool(); - LinkedList list = new LinkedList(); - try - { - CodeAttribute ca = thisMethod.getCodeAttribute(); - ExceptionTable et = ca.getExceptionTable(); - int pos = currentPos; - int n = et.size(); - for (int i = 0; i < n; ++i) - if (et.startPc(i) <= pos && pos < et.endPc(i)) - { - int t = et.catchType(i); - if (t > 0) - try - { - addClass(list, pool.get(cp.getClassInfo(t))); - } - catch (NotFoundException e) - { - } +public abstract class Expr implements Opcode { + int currentPos; + + CodeIterator iterator; + + CtClass thisClass; + + MethodInfo thisMethod; + + boolean edited; + + int maxLocals, maxStack; + + static final String javaLangObject = "java.lang.Object"; + + /** + * Undocumented constructor. Do not use; internal-use only. + */ + protected Expr(int pos, CodeIterator i, CtClass declaring, MethodInfo m) { + currentPos = pos; + iterator = i; + thisClass = declaring; + thisMethod = m; + } + + protected final ConstPool getConstPool() { + return thisMethod.getConstPool(); + } + + protected final boolean edited() { + return edited; + } + + protected final int locals() { + return maxLocals; + } + + protected final int stack() { + return maxStack; + } + + /** + * Returns true if this method is static. + */ + protected final boolean withinStatic() { + return (thisMethod.getAccessFlags() & AccessFlag.STATIC) != 0; + } + + /** + * Returns the constructor or method containing the expression. + */ + public CtBehavior where() { + MethodInfo mi = thisMethod; + CtBehavior[] cb = thisClass.getDeclaredBehaviors(); + for (int i = cb.length - 1; i >= 0; --i) + if (cb[i].getMethodInfo2() == mi) + return cb[i]; + + CtConstructor init = thisClass.getClassInitializer(); + if (init != null && init.getMethodInfo2() == mi) + return init; + + /* getDeclaredBehaviors() returns a list of methods/constructors. + * Although the list is cached in a CtClass object, it might be + * recreated for some reason. Thus, the member name and the signature + * must be also checked. + */ + for (int i = cb.length - 1; i >= 0; --i) { + if (thisMethod.getName().equals(cb[i].getMethodInfo2().getName()) + && thisMethod.getDescriptor() + .equals(cb[i].getMethodInfo2().getDescriptor())) { + return cb[i]; } - } - catch (NullPointerException e) - { - } - - ExceptionsAttribute ea = thisMethod.getExceptionsAttribute(); - if (ea != null) - { - String[] exceptions = ea.getExceptions(); - if (exceptions != null) - { - int n = exceptions.length; + } + + throw new RuntimeException("fatal: not found"); + } + + /** + * Returns the list of exceptions that the expression may throw. This list + * includes both the exceptions that the try-catch statements including the + * expression can catch and the exceptions that the throws declaration + * allows the method to throw. + */ + public CtClass[] mayThrow() { + ClassPool pool = thisClass.getClassPool(); + ConstPool cp = thisMethod.getConstPool(); + LinkedList list = new LinkedList(); + try { + CodeAttribute ca = thisMethod.getCodeAttribute(); + ExceptionTable et = ca.getExceptionTable(); + int pos = currentPos; + int n = et.size(); for (int i = 0; i < n; ++i) - try - { - addClass(list, pool.get(exceptions[i])); - } - catch (NotFoundException e) - { - } - } - } - - return (CtClass[]) list.toArray(new CtClass[list.size()]); - } - - private static void addClass(LinkedList list, CtClass c) - { - Iterator it = list.iterator(); - while (it.hasNext()) - if (it.next() == c) + if (et.startPc(i) <= pos && pos < et.endPc(i)) { + int t = et.catchType(i); + if (t > 0) + try { + addClass(list, pool.get(cp.getClassInfo(t))); + } + catch (NotFoundException e) { + } + } + } + catch (NullPointerException e) { + } + + ExceptionsAttribute ea = thisMethod.getExceptionsAttribute(); + if (ea != null) { + String[] exceptions = ea.getExceptions(); + if (exceptions != null) { + int n = exceptions.length; + for (int i = 0; i < n; ++i) + try { + addClass(list, pool.get(exceptions[i])); + } + catch (NotFoundException e) { + } + } + } + + return (CtClass[])list.toArray(new CtClass[list.size()]); + } + + private static void addClass(LinkedList list, CtClass c) { + Iterator it = list.iterator(); + while (it.hasNext()) + if (it.next() == c) + return; + + list.add(c); + } + + /** + * Returns the index of the bytecode corresponding to the expression. It is + * the index into the byte array containing the Java bytecode that + * implements the method. + */ + public int indexOfBytecode() { + return currentPos; + } + + /** + * Returns the line number of the source line containing the expression. + * + * @return -1 if this information is not available. + */ + public int getLineNumber() { + return thisMethod.getLineNumber(currentPos); + } + + /** + * Returns the source file containing the expression. + * + * @return null if this information is not available. + */ + public String getFileName() { + ClassFile cf = thisClass.getClassFile2(); + if (cf == null) + return null; + else + return cf.getSourceFile(); + } + + static final boolean checkResultValue(CtClass retType, String prog) + throws CannotCompileException { + /* + * Is $_ included in the source code? + */ + boolean hasIt = (prog.indexOf(Javac.resultVarName) >= 0); + if (!hasIt && retType != CtClass.voidType) + throw new CannotCompileException( + "the resulting value is not stored in " + + Javac.resultVarName); + + return hasIt; + } + + /* + * If isStaticCall is true, null is assigned to $0. So $0 must be declared + * by calling Javac.recordParams(). + * + * After executing this method, the current stack depth might be less than + * 0. + */ + static final void storeStack(CtClass[] params, boolean isStaticCall, + int regno, Bytecode bytecode) { + storeStack0(0, params.length, params, regno + 1, bytecode); + if (isStaticCall) + bytecode.addOpcode(ACONST_NULL); + + bytecode.addAstore(regno); + } + + private static void storeStack0(int i, int n, CtClass[] params, int regno, + Bytecode bytecode) { + if (i >= n) return; - - list.add(c); - } - - /** - * Returns the index of the bytecode corresponding to the - * expression. - * It is the index into the byte array containing the Java bytecode - * that implements the method. - */ - public int indexOfBytecode() - { - return currentPos; - } - - /** - * Returns the line number of the source line containing the - * expression. - * - * @return -1 if this information is not available. - */ - public int getLineNumber() - { - return thisMethod.getLineNumber(currentPos); - } - - /** - * Returns the source file containing the expression. - * - * @return null if this information is not available. - */ - public String getFileName() - { - ClassFile cf = thisClass.getClassFile2(); - if (cf == null) - return null; - else - return cf.getSourceFile(); - } - - static final boolean checkResultValue(CtClass retType, String prog) - throws CannotCompileException - { - /* Is $_ included in the source code? - */ - boolean hasIt = (prog.indexOf(Javac.resultVarName) >= 0); - if (!hasIt && retType != CtClass.voidType) - throw new CannotCompileException("the resulting value is not stored in " - + Javac.resultVarName); - - return hasIt; - } - - /* If isStaticCall is true, null is assigned to $0. So $0 must - * be declared by calling Javac.recordParams(). - * - * After executing this method, the current stack depth might - * be less than 0. - */ - static final void storeStack(CtClass[] params, boolean isStaticCall, - int regno, Bytecode bytecode) - { - storeStack0(0, params.length, params, regno + 1, bytecode); - if (isStaticCall) - bytecode.addOpcode(ACONST_NULL); - - bytecode.addAstore(regno); - } - - private static void storeStack0(int i, int n, CtClass[] params, - int regno, Bytecode bytecode) - { - if (i >= n) - return; - else - { - CtClass c = params[i]; - int size; - if (c instanceof CtPrimitiveType) - size = ((CtPrimitiveType) c).getDataSize(); - else - size = 1; - - storeStack0(i + 1, n, params, regno + size, bytecode); - bytecode.addStore(regno, c); - } - } - - protected void replace0(int pos, Bytecode bytecode, int size) - throws BadBytecode - { - byte[] code = bytecode.get(); - edited = true; - int gap = code.length - size; - for (int i = 0; i < size; ++i) - iterator.writeByte(NOP, pos + i); - - if (gap > 0) - iterator.insertGap(pos, gap); - - iterator.write(code, pos); - iterator.insert(bytecode.getExceptionTable(), pos); - maxLocals = bytecode.getMaxLocals(); - maxStack = bytecode.getMaxStack(); - } -} + else { + CtClass c = params[i]; + int size; + if (c instanceof CtPrimitiveType) + size = ((CtPrimitiveType)c).getDataSize(); + else + size = 1; + + storeStack0(i + 1, n, params, regno + size, bytecode); + bytecode.addStore(regno, c); + } + } + + protected void replace0(int pos, Bytecode bytecode, int size) + throws BadBytecode { + byte[] code = bytecode.get(); + edited = true; + int gap = code.length - size; + for (int i = 0; i < size; ++i) + iterator.writeByte(NOP, pos + i); + + if (gap > 0) + iterator.insertGap(pos, gap); + + iterator.write(code, pos); + iterator.insert(bytecode.getExceptionTable(), pos); + maxLocals = bytecode.getMaxLocals(); + maxStack = bytecode.getMaxStack(); + } +}
\ No newline at end of file |