diff options
author | chiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3> | 2003-04-23 17:13:13 +0000 |
---|---|---|
committer | chiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3> | 2003-04-23 17:13:13 +0000 |
commit | 345ac1e04e6aa481c530d9312e4055a853830b3c (patch) | |
tree | a38af5eafa91c21690c7495c65932f13794a98aa /src/main/javassist/expr | |
parent | cdeddfd6fc34a06734f9fa525cf5c7437a6c8fb6 (diff) | |
download | javassist-345ac1e04e6aa481c530d9312e4055a853830b3c.tar.gz javassist-345ac1e04e6aa481c530d9312e4055a853830b3c.zip |
new files for version 2.5.
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@10 30ef5769-5b8d-40dd-aea6-55b5d6557bb3
Diffstat (limited to 'src/main/javassist/expr')
-rw-r--r-- | src/main/javassist/expr/Handler.java | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/main/javassist/expr/Handler.java b/src/main/javassist/expr/Handler.java new file mode 100644 index 00000000..efc90cf9 --- /dev/null +++ b/src/main/javassist/expr/Handler.java @@ -0,0 +1,132 @@ +/* + * Javassist, a Java-bytecode translator toolkit. + * Copyright (C) 1999-2003 Shigeru Chiba. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ +package javassist.expr; + +import javassist.*; +import javassist.bytecode.*; +import javassist.compiler.*; +import javassist.compiler.ast.ASTList; + +/** + * Catch clause. + */ +public class Handler extends Expr { + private static String EXCEPTION_NAME = "$1"; + private ExceptionTable etable; + private int index; + + /** + * Undocumented constructor. Do not use; internal-use only. + */ + Handler(ExceptionTable et, int nth, + CodeIterator it, CtClass declaring, MethodInfo m) { + super(et.handlerPc(nth), it, declaring, m); + etable = et; + index = nth; + } + + /** + * Returns the method or constructor containing the catch clause. + */ + public CtBehavior where() { return super.where(); } + + /** + * Returns the source line number of the catch clause. + * + * @return -1 if this information is not available. + */ + public int getLineNumber() { + return super.getLineNumber(); + } + + /** + * Returns the source file containing the catch clause. + * + * @return null if this information is not available. + */ + public String getFileName() { + return super.getFileName(); + } + + /** + * Returns the list of exceptions that the catch clause may throw. + */ + public CtClass[] mayThrow() { + return super.mayThrow(); + } + + /** + * Returns the type handled by the catch clause. + */ + public CtClass getType() throws NotFoundException { + ConstPool cp = getConstPool(); + String name = cp.getClassInfo(etable.catchType(index)); + return Descriptor.toCtClass(name, thisClass.getClassPool()); + } + + /** + * This method has not been implemented yet. + * + * @param statement a Java statement. + */ + public void replace(String statement) throws CannotCompileException { + throw new RuntimeException("not implemented yet"); + } + + /** + * Inserts bytecode at the beginning of the catch clause. + * The caught exception is stored in <code>$1</code>. + * + * @param src the source code representing the inserted bytecode. + * It must be a single statement or block. + */ + public void insertBefore(String src) throws CannotCompileException { + edited = true; + + ConstPool cp = getConstPool(); + CodeAttribute ca = iterator.get(); + Javac jv = new Javac(thisClass); + Bytecode b = jv.getBytecode(); + b.setStackDepth(1); + b.setMaxLocals(ca.getMaxLocals()); + + try { + CtClass type = getType(); + int var = jv.recordVariable(type, EXCEPTION_NAME); + jv.recordReturnType(type, false); + b.addAstore(var); + jv.compileStmnt(src); + b.addAload(var); + + int oldHandler = etable.handlerPc(index); + b.addOpcode(Opcode.GOTO); + b.addIndex(oldHandler - iterator.getCodeLength() + - b.currentPc() + 1); + + maxStack = b.getMaxStack(); + maxLocals = b.getMaxLocals(); + + int pos = iterator.append(b.get()); + iterator.append(b.getExceptionTable(), pos); + etable.setHandlerPc(index, pos); + } + catch (NotFoundException e) { + throw new CannotCompileException(e); + } + catch (CompileError e) { + throw new CannotCompileException(e); + } + } +} |