]> source.dussan.org Git - javassist.git/commitdiff
Changed subclasses of javassist.expr.Expr so that $_ is always initialized.
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Sat, 5 Jun 2004 16:05:18 +0000 (16:05 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Sat, 5 Jun 2004 16:05:18 +0000 (16:05 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@109 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

Readme.html
src/main/javassist/CtClass.java
src/main/javassist/bytecode/Bytecode.java
src/main/javassist/bytecode/Descriptor.java
src/main/javassist/expr/Cast.java
src/main/javassist/expr/FieldAccess.java
src/main/javassist/expr/Instanceof.java
src/main/javassist/expr/MethodCall.java
src/main/javassist/expr/NewExpr.java
tutorial/tutorial.html

index 7c0a4cfb9f8345fd1389e58b996ef0e943ed0c65..fbf088f998f830f5075adf78c42897b4deac0d47 100644 (file)
@@ -5,7 +5,7 @@
 </HEAD>
 <body>
 
-<h1>Javassist version 2</h1>
+<h1>Javassist version 3</h1>
 
 <h3>Copyright (C) 2000-2004 by Shigeru Chiba, All rights reserved.</h3>
 
@@ -255,7 +255,7 @@ see javassist.Dump.
 
 <h2>Changes</h2>
 
-<p>- version 3.0 RC1
+<p>- version 3.0 beta in May 18th, 2004.
 
 <ul>
   <li>The ClassPool framework has been redesigned.
@@ -277,6 +277,7 @@ see javassist.Dump.
   <li>CtClass.getURL() and javassist.ClassPath.find() has been added.
   <li>CtBehavior.insertAt() has been added.
   <li>CtClass.detach() has been added.
+  <li>CodeAttribute.computeMaxStack() has been added.
 </ul>
 
 <p>- version 2.6 in August, 2003.
@@ -553,7 +554,8 @@ Fabian Crabus, Bo Norregaard Jorgensen, Bob Lee, Bill Burke,
 Remy Sanlaville, Muga Nishizawa, Alexey Loubyansky, Saori Oki,
 Andreas Salathe, Dante Torres estrada, S. Pam, Nuno Santos,
 Denis Taye, Colin Sampaleanu, Robert Bialek, Asato Shimotaki,
-Howard Lewis Ship, Richard Jones, and Marjan Sterjev
+Howard Lewis Ship, Richard Jones, Marjan Sterjev,
+Bruce McDonald, and Mark Brennan
 for their contributions.
 
 <p><br>
index 001269a856f5e029aa0702bbbf8cbe273916c1b6..bf5a28ee6d7b0e2c11fa634ea2b72c54375ed0e8 100644 (file)
@@ -35,7 +35,7 @@ public abstract class CtClass {
     /**
      * The version number of this release.
      */
-    public static final String version = "3.0 beta";
+    public static final String version = "3.0 beta 3";
 
     /**
      * Prints the version number and the copyright notice.
index ae6f1691b8e48ba8674b9e27c1810285d72ae30a..e319eeea8574c6909eb51041222db8be8f0e2db8 100644 (file)
@@ -441,6 +441,29 @@ public class Bytecode implements Opcode {
             addLdc(constPool.addIntegerInfo(n));
     }
 
+    /**
+     * Appends an instruction for pushing zero or null on the stack.
+     * If the type is void, this method does not append any instruction.
+     *
+     * @param type      the type of the zero value (or null).
+     */
+    public void addConstZero(CtClass type) {
+        if (type.isPrimitive()) {
+            if (type == CtClass.longType)
+                addOpcode(LCONST_0);
+            else if (type == CtClass.floatType)
+                addOpcode(FCONST_0);
+            else if (type == CtClass.doubleType)
+                addOpcode(DCONST_0);
+            else if (type == CtClass.voidType)
+                throw new RuntimeException("void type?");
+            else
+                addOpcode(ICONST_0);
+        }
+        else
+            addOpcode(ACONST_NULL);
+    }
+
     /**
      * Appends ILOAD or (WIDE) ILOAD_&lt;n&gt;
      *
@@ -680,9 +703,9 @@ public class Bytecode implements Opcode {
                 addLstore(n);
                 return 2;
             }
-            else if(type == CtClass.floatType)
+            else if (type == CtClass.floatType)
                 addFstore(n);
-            else if(type == CtClass.doubleType) {
+            else if (type == CtClass.doubleType) {
                 addDstore(n);
                 return 2;
             }
index b3cc5a8c7c9fe0dd7e5e130159d09ca20970b3ba..9590d63223e20025f14f51f2430a0b75654a7360 100644 (file)
@@ -46,22 +46,20 @@ public class Descriptor {
         return classname.replace('/', '.');
     }
 
-   /**
-    *  Converts to a classname from a descriptor
-    */
-   public static String fromDescriptor(String descriptor)
-   {
-       String newname = toJavaName(descriptor).substring(1);
-       return newname.substring(0, newname.length() - 1);
-   }
-
-   /**
-    *  Converts to a descriptor from a classname
-    */
-   public static String toDescriptor(String classname)
-   {
-       return "L" + toJvmName(classname) + ";";
-   }
+    /**
+     *  Converts to a classname from a descriptor
+     */
+    public static String fromDescriptor(String descriptor) {
+        String newname = toJavaName(descriptor).substring(1);
+        return newname.substring(0, newname.length() - 1);
+    }
+
+    /**
+     *  Converts to a descriptor from a classname
+     */
+    public static String toDescriptor(String classname) {
+        return "L" + toJvmName(classname) + ";";
+    }
 
     /**
      * Returns the internal representation of the class name in the
@@ -179,8 +177,6 @@ public class Descriptor {
         return sbuf.toString();
     }
 
-
-
     private static void toDescriptor(StringBuffer desc, CtClass type) {
         if (type.isArray()) {
             desc.append('[');
index 80ad4012a2cb7d779c77397d5a3306d191b35e2d..160698fffd921aa75478a502be314788e471978c 100644 (file)
@@ -113,6 +113,10 @@ public class Cast extends Expr {
             Bytecode bytecode = jc.getBytecode();
             storeStack(params, true, paramVar, bytecode);
             jc.recordLocalVariables(ca, pos);
+
+            bytecode.addConstZero(retType);
+            bytecode.addStore(retVar, retType);     // initialize $_
+
             jc.compileStmnt(statement);
             bytecode.addLoad(retVar, retType);
 
index 8598f4562197ac59a1dfdb75c4d091195cce49af..954c3413439a1ba71a4f4f0f7be98167faa2419f 100644 (file)
@@ -174,6 +174,8 @@ public class FieldAccess extends Expr {
             /* Is $_ included in the source code?
              */
             boolean included = checkResultValue(retType, statement);
+            if (read)
+                included = true;
 
             int retVar = jc.recordReturnType(retType, included);
             if (read)
@@ -189,6 +191,17 @@ public class FieldAccess extends Expr {
             Bytecode bytecode = jc.getBytecode();
             storeStack(params, isStatic(), paramVar, bytecode);
             jc.recordLocalVariables(ca, pos);
+
+            if (included)
+                if (retType == CtClass.voidType) {
+                    bytecode.addOpcode(ACONST_NULL);
+                    bytecode.addAstore(retVar);
+                }
+                else {
+                    bytecode.addConstZero(retType);
+                    bytecode.addStore(retVar, retType);     // initialize $_
+                }
+
             jc.compileStmnt(statement);
             if (read)
                 bytecode.addLoad(retVar, retType);
index a0982583a084083b2e8ac88b3e7f237ce604d463..2cb9790b701bbc6fc49738ee95b35f6dbe731db1 100644 (file)
@@ -118,6 +118,10 @@ public class Instanceof extends Expr {
             Bytecode bytecode = jc.getBytecode();
             storeStack(params, true, paramVar, bytecode);
             jc.recordLocalVariables(ca, pos);
+
+            bytecode.addConstZero(retType);
+            bytecode.addStore(retVar, retType);     // initialize $_
+
             jc.compileStmnt(statement);
             bytecode.addLoad(retVar, retType);
 
index 28ed8d2ddd9c29b0bd604f1a46830b02474de897..1e0a842d33867378bc57423c07f10e09fbf99eac 100644 (file)
@@ -211,6 +211,12 @@ public class MethodCall extends Expr {
             Bytecode bytecode = jc.getBytecode();
             storeStack(params, c == INVOKESTATIC, paramVar, bytecode);
             jc.recordLocalVariables(ca, pos);
+
+            if (retType != CtClass.voidType) {
+                bytecode.addConstZero(retType);
+                bytecode.addStore(retVar, retType);     // initialize $_
+            }
+
             jc.compileStmnt(statement);
             if (retType != CtClass.voidType)
                 bytecode.addLoad(retVar, retType);
index 1fa7d4e9fe60285afb9499e7642e9ede30d319d2..e4c979fe2c36dcb46b8a57a6f584c362ad43bea1 100644 (file)
@@ -178,6 +178,10 @@ public class NewExpr extends Expr {
             Bytecode bytecode = jc.getBytecode();
             storeStack(params, true, paramVar, bytecode);
             jc.recordLocalVariables(ca, pos);
+
+            bytecode.addConstZero(newType);
+            bytecode.addStore(retVar, newType);     // initialize $_
+
             jc.compileStmnt(statement);
             bytecode.addAload(retVar);
 
index ce0a40cfaf4339b455f6260342bf8d63fa44b65b..6c2600113e4effba0cbe15a8918432b71ce17a5f 100644 (file)
@@ -106,7 +106,27 @@ byte[] b = cc.toBytecode();
 <p>The default <code>ClassPool</code> returned
 by a static method <code>ClassPool.getDefault()</code>
 searches the same path that the underlying JVM (Java virtual machine) has.
-The users can expand this class search path if needed.
+<em>If a program is running on a web application server such as JBoss and Tomcat,
+the <code>ClassPool</code> object may not be able to find user classes</em>
+since such a web application server uses multiple class loaders as well as
+the system class loader.  In that case, an additional class path must be
+registered to the <code>ClassPool</code>.  Suppose that <code>pool</code>
+refers to a <code>ClassPool</code> object:
+
+<ul><pre>
+pool.insertClassPath(new ClassClassPath(this.getClass()));
+</pre></ul>
+
+<p>
+This statement registers the class path that was used for loading
+the class of the object that <code>this</code> referes to.
+You can use any <code>Class</code> object as an argument instead of
+<code>this.getClass()</code>.  The class path used for loading the
+class represented by that <code>Class</code> object is registered.
+
+
+<p>
+You can register a directory name as the class search path.
 For example, the following code adds a directory
 <code>/usr/local/javalib</code>
 to the search path: