aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/javassist/expr
diff options
context:
space:
mode:
authorpatriot1burke <patriot1burke@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>2004-12-09 22:37:15 +0000
committerpatriot1burke <patriot1burke@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>2004-12-09 22:37:15 +0000
commitb28caee37389d844b4d9c537f031a5bc294c89c0 (patch)
tree5c46b4d0d0700d7524c036d989dd815132cdcf78 /src/main/javassist/expr
parent804fb36894708763ffffd1db7a9be68ef22c340d (diff)
downloadjavassist-b28caee37389d844b4d9c537f031a5bc294c89c0.tar.gz
javassist-b28caee37389d844b4d9c537f031a5bc294c89c0.zip
methodinfos are not equal for some reason.
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@149 30ef5769-5b8d-40dd-aea6-55b5d6557bb3
Diffstat (limited to 'src/main/javassist/expr')
-rw-r--r--src/main/javassist/expr/Expr.java470
1 files changed, 265 insertions, 205 deletions
diff --git a/src/main/javassist/expr/Expr.java b/src/main/javassist/expr/Expr.java
index 3c99b1fc..8d2b75ab 100644
--- a/src/main/javassist/expr/Expr.java
+++ b/src/main/javassist/expr/Expr.java
@@ -15,216 +15,276 @@
package javassist.expr;
-import javassist.*;
-import javassist.bytecode.*;
-import javassist.compiler.*;
-import java.util.LinkedList;
+import javassist.CannotCompileException;
+import javassist.ClassPool;
+import javassist.CtBehavior;
+import javassist.CtClass;
+import javassist.CtConstructor;
+import javassist.CtPrimitiveType;
+import javassist.NotFoundException;
+import javassist.bytecode.AccessFlag;
+import javassist.bytecode.BadBytecode;
+import javassist.bytecode.Bytecode;
+import javassist.bytecode.ClassFile;
+import javassist.bytecode.CodeAttribute;
+import javassist.bytecode.CodeIterator;
+import javassist.bytecode.ConstPool;
+import javassist.bytecode.ExceptionTable;
+import javassist.bytecode.ExceptionsAttribute;
+import javassist.bytecode.MethodInfo;
+import javassist.bytecode.Opcode;
+import javassist.compiler.Javac;
+
import java.util.Iterator;
+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.getMethodInfo2() == mi)
- return init;
-
- 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)
- 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) {}
+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)
+ {
+ }
}
- }
-
- 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)
+ }
+ 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;
- 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();
- }
+
+ 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();
+ }
}