mdahm       2004/08/31 01:04:00

  Modified:    src/java/org/apache/bcel/generic FieldOrMethod.java
                        ObjectType.java ReferenceType.java
  Log:
  Patches from [EMAIL PROTECTED]
  
  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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to