Browse Source

new files for version 2.5.


git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@10 30ef5769-5b8d-40dd-aea6-55b5d6557bb3
tags/rel_3_17_1_ga
chiba 21 years ago
parent
commit
345ac1e04e
2 changed files with 204 additions and 0 deletions
  1. 72
    0
      src/main/javassist/LoaderClassPath.java
  2. 132
    0
      src/main/javassist/expr/Handler.java

+ 72
- 0
src/main/javassist/LoaderClassPath.java View File

@@ -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.
*
* <p>It is used for obtaining a class file from the given
* class loader by <code>getResourceAsStream()</code>.
* The <code>LoaderClassPath</code> refers to the class loader through
* <code>WeakReference</code>. If the class loader is garbage collected,
* the other search pathes are examined.
*
* @author <a href="mailto:bill@jboss.org">Bill Burke</a>
* @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 ? "<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;
}
}

+ 132
- 0
src/main/javassist/expr/Handler.java View File

@@ -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);
}
}
}

Loading…
Cancel
Save