]> source.dussan.org Git - javassist.git/commitdiff
changed CtBehavior.setBody() so that setBody(null) produces a body
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Mon, 19 May 2003 05:57:40 +0000 (05:57 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Mon, 19 May 2003 05:57:40 +0000 (05:57 +0000)
including nothing but a return statement.

git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@20 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

src/main/javassist/CtBehavior.java
src/main/javassist/CtConstructor.java
src/main/javassist/CtMethod.java
src/main/javassist/CtNewConstructor.java
src/main/javassist/CtNewMethod.java
src/main/javassist/compiler/CodeGen.java
src/main/javassist/compiler/Javac.java
src/main/javassist/compiler/Parser.java
tutorial/tutorial2.html

index f040b87b6db2e6d5606255558177c52fbd80e219..35ea406154636a291f8c511996db112d34d62bb6 100644 (file)
@@ -147,6 +147,8 @@ public abstract class CtBehavior extends CtMember {
      *
      * @param src       the source code representing the member body.
      *                  It must be a single statement or block.
+     *                  If it is <code>null</code>, the substituted member
+     *                  body does nothing except returning zero or null.
      */
     public void setBody(String src) throws CannotCompileException {
         declaringClass.checkModify();
index e44e6db03e8b7b404db1bac135676400fe362600..403ce95d4c262e2c2127aa0aab8d5b009aaf3b37 100644 (file)
@@ -283,8 +283,14 @@ public final class CtConstructor extends CtBehavior {
      *
      * @param src       the source code representing the constructor body.
      *                  It must be a single statement or block.
+     *                  If it is <code>null</code>, the substituted
+     *                  constructor body does nothing except calling
+     *                  <code>super()</code>.
      */
     public void setBody(String src) throws CannotCompileException {
+        if (src == null)
+            src = "super();";
+
         super.setBody(src);
     }
 
index 7e100717082f4310e7558e521dbcd93e64c1494a..227964675b16b2b20564b2d44a394109b79cf347 100644 (file)
@@ -304,6 +304,8 @@ public final class CtMethod extends CtBehavior {
      *
      * @param src       the source code representing the method body.
      *                  It must be a single statement or block.
+     *                  If it is <code>null</code>, the substituted method
+     *                  body does nothing except returning zero or null.
      */
     public void setBody(String src) throws CannotCompileException {
         super.setBody(src);
index a461bb19ac2680ed76aa0b136d5d9cbd986b2246..49e7465ae3968274c4de079717cfc53aba30752b 100644 (file)
@@ -74,12 +74,15 @@ public class CtNewConstructor {
     /**
      * Creates a public constructor.
      *
-     * @param returnType        the type of the returned value
-     * @param mname             the method name
-     * @param parameters        a list of the parameter types
-     * @param exceptions        a list of the exception types
-     * @param src               the source text of the method body.
+     * @param returnType        the type of the returned value.
+     * @param mname             the method name.
+     * @param parameters        a list of the parameter types.
+     * @param exceptions        a list of the exception types.
+     * @param body              the source text of the constructor body.
      *                  It must be a block surrounded by <code>{}</code>.
+     *                  If it is <code>null</code>, the substituted
+     *                  constructor body does nothing except calling
+     *                  <code>super()</code>.
      * @param declaring    the class to which the created method is added.
      */
     public static CtConstructor make(CtClass[] parameters,
index 525a121667556a93f45537c8e71027e69ba5fbed..4853c2fdcc0235834d5560674b55eb05b359d880 100644 (file)
@@ -84,12 +84,14 @@ public class CtNewMethod {
     /**
      * Creates a public method.
      *
-     * @param returnType        the type of the returned value
-     * @param mname             the method name
-     * @param parameters        a list of the parameter types
-     * @param exceptions        a list of the exception types
-     * @param src               the source text of the method body.
+     * @param returnType        the type of the returned value.
+     * @param mname             the method name.
+     * @param parameters        a list of the parameter types.
+     * @param exceptions        a list of the exception types.
+     * @param body              the source text of the method body.
      *                  It must be a block surrounded by <code>{}</code>.
+     *                  If it is <code>null</code>, the created method
+     *                  does nothing except returning zero or null.
      * @param declaring    the class to which the created method is added.
      */
     public static CtMethod make(CtClass returnType, String mname,
index 35ca2605cf75067da5e7cdf86f96d6a67e77a270..d0009429fcea86f8f05e2bb911095763bd7bb94f 100644 (file)
@@ -1090,7 +1090,13 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId {
                 bytecode.addOpcode(POP2);
             }
             else if (result_type == P_FLOAT) {
-                bytecode.addOpcode(SWAP);
+                if (type1_p == P_LONG) {
+                    bytecode.addOpcode(DUP_X2);
+                    bytecode.addOpcode(POP);
+                }
+                else
+                    bytecode.addOpcode(SWAP);
+
                 bytecode.addOpcode(op);
                 bytecode.addOpcode(SWAP);
             }
index de322cdfa643585ecceadeca6af8a70c9685590e..491cff4558dded465c8db87fb1d95afc11eeeae5 100644 (file)
@@ -16,6 +16,7 @@
 package javassist.compiler;
 
 import javassist.CtClass;
+import javassist.CtPrimitiveType;
 import javassist.CtMember;
 import javassist.CtField;
 import javassist.CtBehavior;
@@ -25,6 +26,7 @@ import javassist.CannotCompileException;
 import javassist.ClassPool;
 import javassist.Modifier;
 import javassist.bytecode.Bytecode;
+import javassist.bytecode.Opcode;
 import javassist.NotFoundException;
 
 import javassist.compiler.ast.*;
@@ -172,6 +174,7 @@ public class Javac {
      * Compiles a method (or constructor) body.
      *
      * @src    a single statement or a block.
+     *          If null, this method produces a body returning zero or null.
      */
     public Bytecode compileBody(CtBehavior method, String src)
         throws CompileError
@@ -191,10 +194,15 @@ public class Javac {
             recordReturnType(rtype, false);
             boolean isVoid = rtype == CtClass.voidType;
 
-            Parser p = new Parser(new Lex(src));
-            SymbolTable stb = new SymbolTable(stable);
-            Stmnt s = p.parseStatement(stb);
-            gen.atMethodBody(s, method instanceof CtConstructor, isVoid);
+            if (src == null)
+                makeDefaultBody(bytecode, rtype);
+            else {
+                Parser p = new Parser(new Lex(src));
+                SymbolTable stb = new SymbolTable(stable);
+                Stmnt s = p.parseStatement(stb);
+                gen.atMethodBody(s, method instanceof CtConstructor, isVoid);
+            }
+
             return bytecode;
         }
         catch (NotFoundException e) {
@@ -202,6 +210,34 @@ public class Javac {
         }
     }
 
+    private static void makeDefaultBody(Bytecode b, CtClass type) {
+        int op;
+        int value;
+        if (type instanceof CtPrimitiveType) {
+            CtPrimitiveType pt = (CtPrimitiveType)type;
+            op = pt.getReturnOp();
+            if (op == Opcode.DRETURN)
+                value = Opcode.DCONST_0;
+            else if (op == Opcode.FRETURN)
+                value = Opcode.FCONST_0;
+            else if (op == Opcode.LRETURN)
+                value = Opcode.LCONST_0;
+            else if (op == Opcode.RETURN)
+                value = Opcode.NOP;
+            else
+                value = Opcode.ICONST_0;
+        }
+        else {
+            op = Opcode.ARETURN;
+            value = Opcode.ACONST_NULL;
+        }
+
+        if (value != Opcode.NOP)
+            b.addOpcode(value);
+
+        b.addOpcode(op);
+    }
+
     /**
      * Makes variables $0 (this), $1, $2, ..., and $args represent method
      * parameters.  $args represents an array of all the parameters.
index 3bddb7c8431e064a8593689b5c9bc462be5940f5..f18659514a0c36714b7a92485f341b98905b12b5 100644 (file)
@@ -262,6 +262,8 @@ public final class Parser implements TokenId {
             return parseTry(tbl);
         else if (t == SWITCH)
             return parseSwitch(tbl);
+        else if (t == SYNCHRONIZED)
+            return parseSynchronized(tbl);
         else if (t == RETURN)
             return parseReturn(tbl);
         else if (t == THROW)
@@ -403,6 +405,13 @@ public final class Parser implements TokenId {
         throw new CompileError("switch is not supported", lex);
     }
 
+    /* synchronized.statement :
+     *     SYNCHRONIZED "(" expression ")" block.statement
+     */
+    private Stmnt parseSynchronized(SymbolTable tbl) throws CompileError {
+        throw new CompileError("synchronized is not supported", lex);
+    }
+
     /* try.statement
      * : TRY block.statement
      *   [ CATCH "(" class.type Identifier ")" block.statement ]*
index 5016474ae32d069f67a278e59a7caa45f2e4c52a..31d75f0b3346e60928ae03dc6c4db46f73f4c0bb 100644 (file)
@@ -489,10 +489,13 @@ catch (java.io.IOException e) {
 <p><code>CtMethod</code> and <code>CtConstructor</code> provide
 <code>setBody()</code> for substituting a whole
 method body.  They compile the given source text into Java bytecode
-and substitutes it for the original method body.
+and substitutes it for the original method body.  If the given source
+text is <code>null</code>, the substituted body includes only a
+<code>return</code> statement, which returns zero or null unless the
+result type is <code>void</code>.
 
 <p>In the source text given to <code>setBody()</code>, the identifiers
-starting with $ have special meaning
+starting with <code>$</code> have special meaning
 
 <ul><table border=0>
 <tr>
@@ -1095,7 +1098,10 @@ point.addMethod(m);
 In this example, <code>x</code> is a <code>int</code> field in
 the class <code>Point</code>.
 
-<p>The source text passed to <code>make()</code> can refer to
+<p>The source text passed to <code>make()</code> can include the
+identifiers starting with <code>$</code> except <code>$_</code>
+as in <code>setBody()</code>.
+It can also include
 <code>$proceed</code> if the target object and the target method name
 are also given to <code>make()</code>.  For example,
 
@@ -1207,7 +1213,8 @@ supported.
 
 <p><li>Inner classes or anonymous classes are not supported.
 
-<p><li><code>switch</code> statements are not supported yet.
+<p><li><code>switch</code> or <code>synchronized</code>
+statements are not supported yet.
 
 <p><li>Labeled <code>continue</code> and <code>break</code> statements
 are not supported.