You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by db...@apache.org on 2013/05/11 19:34:33 UTC

svn commit: r1481383 - in /commons/proper/bcel/trunk/src/main/java/org/apache/bcel: classfile/ generic/ verifier/structurals/

Author: dbrosius
Date: Sat May 11 17:34:32 2013
New Revision: 1481383

URL: http://svn.apache.org/r1481383
Log:
incorporate changes used by Findbugs from BCEL-163

Modified:
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Constant.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/LineNumber.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ArrayType.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGen.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/MethodGen.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ObjectType.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ReferenceType.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java
    commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Constant.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Constant.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Constant.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Constant.java Sat May 11 17:34:32 2013
@@ -145,7 +145,7 @@ public abstract class Constant implement
             case Constants.CONSTANT_NameAndType:
                 return new ConstantNameAndType(file);
             case Constants.CONSTANT_Utf8:
-                return new ConstantUtf8(file);
+                return ConstantUtf8.getInstance(file);
             case Constants.CONSTANT_MethodHandle:
                 return new ConstantMethodHandle(file);
             case Constants.CONSTANT_MethodType:

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java Sat May 11 17:34:32 2013
@@ -18,8 +18,12 @@
 package org.apache.bcel.classfile;
 
 import java.io.DataInput;
+import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
 import org.apache.bcel.Constants;
 
@@ -35,8 +39,59 @@ import org.apache.bcel.Constants;
 public final class ConstantUtf8 extends Constant {
 
     private static final long serialVersionUID = -8709101585611518985L;
-    private String bytes;
+    private final String bytes;
 
+    private static final int MAX_CACHE_ENTRIES = 20000;
+    private static final int INITIAL_CACHE_CAPACITY = (int)(MAX_CACHE_ENTRIES/0.75);
+    private static HashMap<String, ConstantUtf8> cache;
+    private static int considered = 0;
+    private static int hits = 0;
+    private static int skipped = 0;
+    private static int created = 0;
+    final static boolean BCEL_STATISTICS = Boolean.getBoolean("bcel.statistics");
+    final static boolean BCEL_DONT_CACHE = Boolean.getBoolean("bcel.dontCache");
+
+    static {
+        if (BCEL_STATISTICS)
+            Runtime.getRuntime().addShutdownHook(new Thread() {
+                public void run() {
+                    System.err.println("Cache hit " + hits + "/" + considered +", "
+                            + skipped + " skipped");
+                    System.err.println("Total of " + created + " ConstantUtf8 objects created");
+                }
+            });
+    }
+
+    public static synchronized ConstantUtf8 getCachedInstance(String s) {
+        if (BCEL_DONT_CACHE || s.length() > 200) {
+            skipped++;
+            return  new ConstantUtf8(s);
+        }
+        considered++;
+        if (cache == null)  {
+            cache = new LinkedHashMap<String, ConstantUtf8>(INITIAL_CACHE_CAPACITY, 0.75f, true) {
+                protected boolean removeEldestEntry(Map.Entry eldest) {
+                     return size() > MAX_CACHE_ENTRIES;
+                }
+            };
+        }
+        ConstantUtf8 result = cache.get(s);
+        if (result != null) {
+                hits++;
+                return result;
+            }
+        result = new ConstantUtf8(s);
+        cache.put(s, result);
+        return result;
+    }
+
+    public static ConstantUtf8 getInstance(String s) {
+        return getCachedInstance(s);
+    }
+
+    public static ConstantUtf8 getInstance (DataInputStream file)  throws IOException {
+        return getInstance(file.readUTF());
+    }
 
     /**
      * Initialize from another object.
@@ -55,6 +110,7 @@ public final class ConstantUtf8 extends 
     ConstantUtf8(DataInput file) throws IOException {
         super(Constants.CONSTANT_Utf8);
         bytes = file.readUTF();
+        created++;
     }
 
 
@@ -67,6 +123,7 @@ public final class ConstantUtf8 extends 
             throw new IllegalArgumentException("bytes must not be null!");
         }
         this.bytes = bytes;
+        created++;
     }
 
 
@@ -106,9 +163,10 @@ public final class ConstantUtf8 extends 
 
     /**
      * @param bytes the raw bytes of this Utf-8
+     * @deprecated
      */
     public final void setBytes( String bytes ) {
-        this.bytes = bytes;
+        throw new UnsupportedOperationException();
     }
 
 

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/LineNumber.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/LineNumber.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/LineNumber.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/LineNumber.java Sat May 11 17:34:32 2013
@@ -34,8 +34,8 @@ import java.io.Serializable;
 public final class LineNumber implements Cloneable, Node, Serializable {
 
     private static final long serialVersionUID = 169537400672820016L;
-    private int start_pc; // Program Counter (PC) corresponds to line
-    private int line_number; // number in source file
+    private short start_pc; // Program Counter (PC) corresponds to line
+    private short line_number; // number in source file
 
 
     /**
@@ -61,8 +61,8 @@ public final class LineNumber implements
      * @param line_number line number in source file
      */
     public LineNumber(int start_pc, int line_number) {
-        this.start_pc = start_pc;
-        this.line_number = line_number;
+        this.start_pc = (short) start_pc;
+        this.line_number = (short)line_number;
     }
 
 
@@ -94,7 +94,7 @@ public final class LineNumber implements
      * @return Corresponding source line
      */
     public final int getLineNumber() {
-        return line_number;
+        return 0xffff & line_number;
     }
 
 
@@ -102,7 +102,7 @@ public final class LineNumber implements
      * @return PC in code
      */
     public final int getStartPC() {
-        return start_pc;
+        return  0xffff & start_pc;
     }
 
 
@@ -110,7 +110,7 @@ public final class LineNumber implements
      * @param line_number the source line number
      */
     public final void setLineNumber( int line_number ) {
-        this.line_number = line_number;
+        this.line_number = (short) line_number;
     }
 
 
@@ -118,7 +118,7 @@ public final class LineNumber implements
      * @param start_pc the pc for this line number
      */
     public final void setStartPC( int start_pc ) {
-        this.start_pc = start_pc;
+        this.start_pc = (short) start_pc;
     }
 
 

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ArrayType.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ArrayType.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ArrayType.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ArrayType.java Sat May 11 17:34:32 2013
@@ -48,7 +48,7 @@ public final class ArrayType extends Ref
      * @param class_name complete name of class (java.lang.String, e.g.)
      */
     public ArrayType(String class_name, int dimensions) {
-        this(new ObjectType(class_name), dimensions);
+        this(ObjectType.getInstance(class_name), dimensions);
     }
 
 

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGen.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGen.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGen.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGen.java Sat May 11 17:34:32 2013
@@ -117,7 +117,7 @@ public class FieldGen extends FieldGenOr
      * by the JVM automatically.
      */
     public void setInitValue( String str ) {
-        checkType(new ObjectType("java.lang.String"));
+        checkType(  ObjectType.getInstance("java.lang.String"));
         if (str != null) {
             value = str;
         }

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java Sat May 11 17:34:32 2013
@@ -100,7 +100,7 @@ public abstract class FieldOrMethod exte
      */
     @Deprecated
     public ObjectType getClassType( ConstantPoolGen cpg ) {
-        return new ObjectType(getClassName(cpg));
+        return ObjectType.getInstance(getClassName(cpg));
     }
 
 
@@ -121,7 +121,7 @@ public abstract class FieldOrMethod exte
             return (ArrayType) Type.getType(className);
         } else {
             className = className.replace('/', '.');
-            return new ObjectType(className);
+            return ObjectType.getInstance(className);
         }
     }
 

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java Sat May 11 17:34:32 2013
@@ -622,7 +622,7 @@ public class InstructionFactory implemen
 
 
     public NEW createNew( String s ) {
-        return createNew(new ObjectType(s));
+        return createNew(ObjectType.getInstance(s));
     }
 
 

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/MethodGen.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/MethodGen.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/MethodGen.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/MethodGen.java Sat May 11 17:34:32 2013
@@ -136,7 +136,7 @@ public class MethodGen extends FieldGenO
             /* Add local variables, namely the implicit `this' and the arguments
              */
             if (!isStatic() && (class_name != null)) { // Instance method -> `this' is local var 0
-                addLocalVariable("this", new ObjectType(class_name), start, end);
+                addLocalVariable("this",  ObjectType.getInstance(class_name), start, end);
             }
         }
         if (arg_types != null) {
@@ -197,7 +197,7 @@ public class MethodGen extends FieldGenO
                         if (type > 0) {
                             String cen = m.getConstantPool().getConstantString(type,
                                     Constants.CONSTANT_Class);
-                            c_type = new ObjectType(cen);
+                            c_type =  ObjectType.getInstance(cen);
                         }
                         int end_pc = ce.getEndPC();
                         int length = m.getCode().getCode().length;

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ObjectType.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ObjectType.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ObjectType.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ObjectType.java Sat May 11 17:34:32 2013
@@ -17,6 +17,10 @@
  */
 package org.apache.bcel.generic;
 
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
 import org.apache.bcel.Constants;
 import org.apache.bcel.Repository;
 import org.apache.bcel.classfile.JavaClass;
@@ -30,8 +34,27 @@ import org.apache.bcel.classfile.JavaCla
 public class ObjectType extends ReferenceType {
 
     private static final long serialVersionUID = -2819379966444533294L;
-    private String class_name; // Class name of type
-
+    private final String class_name; // Class name of type
+    private static final int MAX_CACHE_ENTRIES = 200;
+    private static final int INITIAL_CACHE_CAPACITY = (int)(MAX_CACHE_ENTRIES/0.75);
+    private static HashMap<String, ObjectType> cache;
+
+    public synchronized static ObjectType getInstance(String class_name) {
+        if (cache == null)
+            cache = new LinkedHashMap<String, ObjectType>(INITIAL_CACHE_CAPACITY, 0.75f, true) {
+
+
+            protected boolean removeEldestEntry(Map.Entry eldest) {
+               return size() > MAX_CACHE_ENTRIES;
+            }
+
+        };
+        ObjectType result = cache.get(class_name);
+        if (result != null) return result;
+        result = new ObjectType(class_name);
+        cache.put(class_name, result);
+        return result;
+    }
 
     /**
      * @param class_name fully qualified class name, e.g. java.lang.String

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ReferenceType.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ReferenceType.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ReferenceType.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ReferenceType.java Sat May 11 17:34:32 2013
@@ -166,7 +166,7 @@ public abstract class ReferenceType exte
             // 'java.io.Serializable'"
             if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) {
                 for (int ii = 0; ii < Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS.length; ii++) {
-                    if (T.equals(new ObjectType(Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) {
+                    if (T.equals(ObjectType.getInstance(Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) {
                         return true;
                     }
                 }
@@ -252,7 +252,7 @@ public abstract class ReferenceType exte
         for (int i = 0; i < t_sups.length; i++) {
             for (int j = 0; j < this_sups.length; j++) {
                 if (this_sups[j].equals(t_sups[i])) {
-                    return new ObjectType(this_sups[j].getClassName());
+                    return ObjectType.getInstance(this_sups[j].getClassName());
                 }
             }
         }
@@ -325,7 +325,7 @@ public abstract class ReferenceType exte
         for (int i = 0; i < t_sups.length; i++) {
             for (int j = 0; j < this_sups.length; j++) {
                 if (this_sups[j].equals(t_sups[i])) {
-                    return new ObjectType(this_sups[j].getClassName());
+                    return ObjectType.getInstance(this_sups[j].getClassName());
                 }
             }
         }

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java Sat May 11 17:34:32 2013
@@ -34,7 +34,7 @@ import org.apache.bcel.classfile.Utility
 public abstract class Type implements java.io.Serializable {
 
     private static final long serialVersionUID = -1985077286871826895L;
-    protected byte type;
+    protected final byte type;
     protected String signature; // signature for the type
     /** Predefined constants
      */
@@ -47,11 +47,11 @@ public abstract class Type implements ja
     public static final BasicType DOUBLE = new BasicType(Constants.T_DOUBLE);
     public static final BasicType FLOAT = new BasicType(Constants.T_FLOAT);
     public static final BasicType CHAR = new BasicType(Constants.T_CHAR);
-    public static final ObjectType OBJECT = new ObjectType("java.lang.Object");
-    public static final ObjectType CLASS = new ObjectType("java.lang.Class");
-    public static final ObjectType STRING = new ObjectType("java.lang.String");
-    public static final ObjectType STRINGBUFFER = new ObjectType("java.lang.StringBuffer");
-    public static final ObjectType THROWABLE = new ObjectType("java.lang.Throwable");
+    public static final ObjectType OBJECT = ObjectType.getInstance("java.lang.Object");
+    public static final ObjectType CLASS = ObjectType.getInstance("java.lang.Class");
+    public static final ObjectType STRING = ObjectType.getInstance("java.lang.String");
+    public static final ObjectType STRINGBUFFER = ObjectType.getInstance("java.lang.StringBuffer");
+    public static final ObjectType THROWABLE = ObjectType.getInstance("java.lang.Throwable");
     public static final Type[] NO_ARGS = new Type[0];
     public static final ReferenceType NULL = new ReferenceType() {
 
@@ -202,7 +202,7 @@ public abstract class Type implements ja
             }
             //corrected concurrent private static field acess
             wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed
-            return new ObjectType(signature.substring(1, index).replace('/', '.'));
+            return ObjectType.getInstance(signature.substring(1, index).replace('/', '.'));
         }
     }
 
@@ -290,7 +290,7 @@ public abstract class Type implements ja
                 throw new IllegalStateException("Ooops, what primitive type is " + cl);
             }
         } else { // "Real" class
-            return new ObjectType(cl.getName());
+            return ObjectType.getInstance(cl.getName());
         }
     }
 

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java Sat May 11 17:34:32 2013
@@ -53,7 +53,7 @@ import org.apache.bcel.verifier.exc.Stru
  */
 public class InstConstraintVisitor extends EmptyVisitor{
 
-	private static final ObjectType GENERIC_ARRAY = new ObjectType("org.apache.bcel.verifier.structurals.GenericArray");
+	private static final ObjectType GENERIC_ARRAY = ObjectType.getInstance("org.apache.bcel.verifier.structurals.GenericArray");
 
 	/**
 	 * The constructor. Constructs a new instance of this class.
@@ -1276,7 +1276,7 @@ public class InstConstraintVisitor exten
 
 		if (f.isProtected()){
 			ObjectType classtype = o.getClassType(cpg);
-			ObjectType curr = new ObjectType(mg.getClassName());
+			ObjectType curr = ObjectType.getInstance(mg.getClassName());
 
 			if (	classtype.equals(curr) ||
 						curr.subclassOf(classtype)	){
@@ -2689,7 +2689,7 @@ public class InstConstraintVisitor exten
 		
 		if (f.isProtected()){
 			ObjectType classtype = o.getClassType(cpg);
-			ObjectType curr = new ObjectType(mg.getClassName());
+			ObjectType curr = ObjectType.getInstance(mg.getClassName());
 
 			if (	classtype.equals(curr) ||
 						curr.subclassOf(classtype)	){

Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java Sat May 11 17:34:32 2013
@@ -356,12 +356,12 @@ public final class Pass3bVerifier extend
 				Frame f = new Frame(mg.getMaxLocals(),mg.getMaxStack());
 				if ( !mg.isStatic() ){
 					if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){
-						Frame._this = new UninitializedObjectType(new ObjectType(jc.getClassName()));
+						Frame._this = new UninitializedObjectType(ObjectType.getInstance(jc.getClassName()));
 						f.getLocals().set(0, Frame._this);
 					}
 					else{
 						Frame._this = null;
-						f.getLocals().set(0, new ObjectType(jc.getClassName()));
+						f.getLocals().set(0, ObjectType.getInstance(jc.getClassName()));
 					}
 				}
 				Type[] argtypes = mg.getArgumentTypes();