jakarta-bcel-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From md...@apache.org
Subject cvs commit: jakarta-bcel/src/java/org/apache/bcel/generic FieldOrMethod.java ObjectType.java ReferenceType.java
Date Tue, 31 Aug 2004 08:04:00 GMT
mdahm       2004/08/31 01:04:00

  Modified:    src/java/org/apache/bcel/generic FieldOrMethod.java
                        ObjectType.java ReferenceType.java
  Log:
  Patches from daveho@cs.umd.edu
  
  Revision  Changes    Path
  1.3       +24 -1     jakarta-bcel/src/java/org/apache/bcel/generic/FieldOrMethod.java
  
  Index: FieldOrMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/generic/FieldOrMethod.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- FieldOrMethod.java	23 May 2003 07:55:16 -0000	1.2
  +++ FieldOrMethod.java	31 Aug 2004 08:03:59 -0000	1.3
  @@ -104,9 +104,32 @@
     }
   
     /** @return type of the referenced class/interface
  +   * @deprecated If the instruction references an array class,
  +   *    the ObjectType returned will be invalid.  Use
  +   *    getReferenceType() instead.
      */
     public ObjectType getClassType(ConstantPoolGen cpg) {
       return new ObjectType(getClassName(cpg));
  +  }
  +
  +  /**
  +   * Return the reference type representing the class, interface,
  +   * or array class referenced by the instruction.
  +   * @param cpg the ConstantPoolGen used to create the instruction
  +   * @return an ObjectType (if the referenced class type is a class
  +   *   or interface), or an ArrayType (if the referenced class
  +   *   type is an array class)
  +   */
  +  public ReferenceType getReferenceType(ConstantPoolGen cpg) {
  +    ConstantPool cp  = cpg.getConstantPool();
  +    ConstantCP   cmr = (ConstantCP)cp.getConstant(index);
  +    String className = cp.getConstantString(cmr.getClassIndex(), org.apache.bcel.Constants.CONSTANT_Class);
  +    if (className.startsWith("[")) {
  +      return (ArrayType) Type.getType(className);
  +    } else {
  +      className = className.replace('/', '.');
  +      return new ObjectType(className);
  +    }
     }
   
     /** @return type of the referenced class/interface
  
  
  
  1.4       +33 -1     jakarta-bcel/src/java/org/apache/bcel/generic/ObjectType.java
  
  Index: ObjectType.java
  ===================================================================
  RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/generic/ObjectType.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ObjectType.java	30 Apr 2004 06:51:33 -0000	1.3
  +++ ObjectType.java	31 Aug 2004 08:03:59 -0000	1.4
  @@ -92,6 +92,9 @@
     /**
      * If "this" doesn't reference a class, it references an interface
      * or a non-existant entity.
  +   * @deprecated this method returns an inaccurate result
  +   *   if the class or interface referenced cannot
  +   *   be found: use referencesClassExact() instead
      */
     public boolean referencesClass() {
       try {
  @@ -105,6 +108,9 @@
     /**
      * If "this" doesn't reference an interface, it references a class
      * or a non-existant entity.
  +   * @deprecated this method returns an inaccurate result
  +   *   if the class or interface referenced cannot
  +   *   be found: use referencesInterfaceExact() instead
      */
     public boolean referencesInterface(){
       try {
  @@ -113,6 +119,32 @@
       } catch (ClassNotFoundException e) {
         return false;
       }
  +  }
  +
  +  /**
  +   * Return true if this type references a class,
  +   * false if it references an interface.
  +   * @return true if the type references a class, false if
  +   *   it references an interface
  +   * @throws ClassNotFoundException if the class or interface
  +   *   referenced by this type can't be found
  +   */
  +  public boolean referencesClassExact() throws ClassNotFoundException {
  +    JavaClass jc = Repository.lookupClass(class_name);
  +    return jc.isClass();
  +  }
  +
  +  /**
  +   * Return true if this type references an interface,
  +   * false if it references a class.
  +   * @return true if the type references an interface, false if
  +   *   it references a class
  +   * @throws ClassNotFoundException if the class or interface
  +   *   referenced by this type can't be found
  +   */
  +  public boolean referencesInterfaceExact() throws ClassNotFoundException {
  +    JavaClass jc = Repository.lookupClass(class_name);
  +    return !jc.isClass();
     }
   
     /**
  
  
  
  1.8       +9 -9      jakarta-bcel/src/java/org/apache/bcel/generic/ReferenceType.java
  
  Index: ReferenceType.java
  ===================================================================
  RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/generic/ReferenceType.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ReferenceType.java	12 Jun 2003 07:30:22 -0000	1.7
  +++ ReferenceType.java	31 Aug 2004 08:03:59 -0000	1.8
  @@ -116,11 +116,11 @@
   
       /* If this is a class type then
        */
  -    if ((this instanceof ObjectType) && (((ObjectType) this).referencesClass()))
{
  +    if ((this instanceof ObjectType) && (((ObjectType) this).referencesClassExact()))
{
         /* If T is a class type, then this must be the same class as T,
   	 or this must be a subclass of T;
         */
  -      if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) {
  +      if ((T instanceof ObjectType) && (((ObjectType) T).referencesClassExact()))
{
   	if (this.equals(T))
   	  return true;
   
  @@ -131,7 +131,7 @@
   
         /* If T is an interface type, this must implement interface T.
          */
  -      if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface()))
{
  +      if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact()))
{
   	if (Repository.implementationOf(((ObjectType) this).getClassName(),
   					((ObjectType) T).getClassName()))
   	  return true;
  @@ -140,17 +140,17 @@
   
       /* If this is an interface type, then:
        */
  -    if ((this instanceof ObjectType) && (((ObjectType) this).referencesInterface()))
{
  +    if ((this instanceof ObjectType) && (((ObjectType) this).referencesInterfaceExact()))
{
         /* If T is a class type, then T must be Object (2.4.7).
          */
  -      if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) {
  +      if ((T instanceof ObjectType) && (((ObjectType) T).referencesClassExact()))
{
   	if (T.equals(Type.OBJECT)) return true;
         }
   
         /* If T is an interface type, then T must be the same interface
          * as this or a superinterface of this (2.13.2).
          */
  -      if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface()))
{
  +       if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact()))
{
   	if (this.equals(T)) return true;
   	if (Repository.implementationOf(((ObjectType) this).getClassName(),
   					((ObjectType) T).getClassName()))
  @@ -164,7 +164,7 @@
       if (this instanceof ArrayType) {
         /* If T is a class type, then T must be Object (2.4.7).
          */
  -      if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) {
  +      if ((T instanceof ObjectType) && (((ObjectType) T).referencesClassExact()))
{
   	if (T.equals(Type.OBJECT)) return true;
         }
   
  @@ -194,7 +194,7 @@
         // are at least two different pages where assignment compatibility is defined and
         // on one of them "interfaces implemented by arrays" is exchanged with "'Cloneable'
or
         // 'java.io.Serializable'"
  -      if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface()))
{
  +      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]))) return
true;
   	}
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: bcel-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: bcel-dev-help@jakarta.apache.org


Mime
View raw message