From 345ac1e04e6aa481c530d9312e4055a853830b3c Mon Sep 17 00:00:00 2001 From: chiba Date: Wed, 23 Apr 2003 17:13:13 +0000 Subject: [PATCH] new files for version 2.5. git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@10 30ef5769-5b8d-40dd-aea6-55b5d6557bb3 --- src/main/javassist/LoaderClassPath.java | 72 +++++++++++++ src/main/javassist/expr/Handler.java | 132 ++++++++++++++++++++++++ 2 files changed, 204 insertions(+) create mode 100644 src/main/javassist/LoaderClassPath.java create mode 100644 src/main/javassist/expr/Handler.java diff --git a/src/main/javassist/LoaderClassPath.java b/src/main/javassist/LoaderClassPath.java new file mode 100644 index 00000000..6407e46d --- /dev/null +++ b/src/main/javassist/LoaderClassPath.java @@ -0,0 +1,72 @@ +/* + * 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; + +import java.io.InputStream; +import java.lang.ref.WeakReference; + +/** + * A class search-path representing a class loader. + * + *

It is used for obtaining a class file from the given + * class loader by getResourceAsStream(). + * The LoaderClassPath refers to the class loader through + * WeakReference. If the class loader is garbage collected, + * the other search pathes are examined. + * + * @author Bill Burke + * @author Shigeru Chiba + * + * @see javassist.ClassPath + * @see ClassPool#insertClassPath(ClassPath) + * @see ClassPool#appendClassPath(ClassPath) + */ +public class LoaderClassPath implements ClassPath { + private WeakReference clref; + + /** + * Creates a search path representing a class loader. + */ + public LoaderClassPath(ClassLoader cl) { + clref = new WeakReference(cl); + } + + public String toString() { + Object cl = null; + if (clref != null) + cl = clref.get(); + + return cl == null ? "" : cl.toString(); + } + + /** + * Obtains a class file from the class loader. + */ + public InputStream openClassfile(String classname) { + String cname = classname.replace('.', '/') + ".class"; + ClassLoader cl = (ClassLoader)clref.get(); + if (cl == null) + return null; // not found + else + return cl.getResourceAsStream(cname); + } + + /** + * Closes this class path. + */ + public void close() { + clref = null; + } +} 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 $1. + * + * @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); + } + } +} -- 2.39.5