]> source.dussan.org Git - javassist.git/commitdiff
new files for version 2.5.
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Wed, 23 Apr 2003 17:13:13 +0000 (17:13 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Wed, 23 Apr 2003 17:13:13 +0000 (17:13 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@10 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

src/main/javassist/LoaderClassPath.java [new file with mode: 0644]
src/main/javassist/expr/Handler.java [new file with mode: 0644]

diff --git a/src/main/javassist/LoaderClassPath.java b/src/main/javassist/LoaderClassPath.java
new file mode 100644 (file)
index 0000000..6407e46
--- /dev/null
@@ -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;
+    }
+}
diff --git a/src/main/javassist/expr/Handler.java b/src/main/javassist/expr/Handler.java
new file mode 100644 (file)
index 0000000..efc90cf
--- /dev/null
@@ -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);
+        }
+    }
+}