at.dms.kjc
Class CClass

java.lang.Object
  extended by at.dms.util.Utils
      extended by at.dms.kjc.CMember
          extended by at.dms.kjc.CClass
All Implemented Interfaces:
Constants, DeepCloneable, Serializable
Direct Known Subclasses:
CBadClass, CBinaryClass, CSourceClass

public abstract class CClass
extends CMember

This class represents the exported members of a class (inner classes, methods and fields)

See Also:
Serialized Form

Field Summary
protected static CClass CLS_UNDEFINED
           
 
Fields inherited from class at.dms.kjc.CMember
owner
 
Fields inherited from class at.dms.util.Utils
EMPTY_LIST, getForLoopCallers
 
Fields inherited from interface at.dms.kjc.Constants
CMP_VERSION, JAV_CLASS, JAV_CLONE, JAV_CLONEABLE, JAV_CONSTRUCTOR, JAV_ERROR, JAV_EXCEPTION, JAV_INIT, JAV_LENGTH, JAV_NAME_SEPARATOR, JAV_OBJECT, JAV_OUTER_THIS, JAV_RUNTIME, JAV_RUNTIME_EXCEPTION, JAV_STATIC_INIT, JAV_STRING, JAV_STRINGBUFFER, JAV_THIS, JAV_THROWABLE, OPE_BAND, OPE_BNOT, OPE_BOR, OPE_BSR, OPE_BXOR, OPE_EQ, OPE_GE, OPE_GT, OPE_LE, OPE_LNOT, OPE_LT, OPE_MINUS, OPE_NE, OPE_PERCENT, OPE_PLUS, OPE_POSTDEC, OPE_POSTINC, OPE_PREDEC, OPE_PREINC, OPE_SIMPLE, OPE_SL, OPE_SLASH, OPE_SR, OPE_STAR, TID_ARRAY, TID_BIT, TID_BOOLEAN, TID_BYTE, TID_CHAR, TID_CLASS, TID_DOUBLE, TID_FLOAT, TID_INT, TID_LONG, TID_SHORT, TID_VECTOR, TID_VOID, VECTOR_EMPTY
 
Fields inherited from interface at.dms.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INLINE, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_EXCEPTIONS, ATT_GENERIC, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_SOURCEFILE, ATT_SYNTHETIC, CST_CLASS, CST_DOUBLE, CST_FIELD, CST_FLOAT, CST_INTEGER, CST_INTERFACEMETHOD, CST_LONG, CST_METHOD, CST_NAMEANDTYPE, CST_STRING, CST_UTF8, ENV_DEBUG_MODE, ENV_USE_CACHE, JAVA_MAGIC, JAVA_MAJOR, JAVA_MINOR, MAX_CODE_PER_METHOD, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup_x1, opc_dup_x2, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_imul, opc_ineg, opc_instanceof, opc_invokeinterface, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc_w, opc_ldc2_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_wide, opc_xxxunusedxxx, POO_ASCII_CONSTANT, POO_CLASS_CONSTANT, POO_DOUBLE_CONSTANT, POO_FLOAT_CONSTANT, POO_INTEGER_CONSTANT, POO_LONG_CONSTANT, POO_NAT_CONSTANT, POO_REF_CONSTANT, POO_STRING_CONSTANT, TYP_ADDRESS, TYP_DOUBLE, TYP_FLOAT, TYP_INT, TYP_LONG, TYP_REFERENCE, TYP_VOID
 
Constructor Summary
protected CClass()
           
  CClass(CClass owner, String sourceFile, int modifiers, String ident, String qualifiedName, CClassType superClass, boolean deprecated)
          Constructs a class export from file
 
Method Summary
 void addField(CSourceField field)
          Adds a field.
 void close(CClassType[] interfaces, Hashtable<String,CField> fields, CMethod[] methods)
          Ends the definition of this class
 void collectApplicableMethods(Vector container, String ident, CType[] actuals)
          Adds all applicable methods (JLS 15.12.2.1) to the specified container.
 Object deepClone()
          Returns a deep clone of this object.
protected  void deepCloneInto(CClass other)
          Clones all fields of this into
 boolean descendsFrom(CClass from)
          descendsFrom
 CType[] genConstructorArray(CType[] params)
          add synthetic parameters to method def
 void genOuterSyntheticParams(CodeSequence code)
          add synthetic parameters to method call
 void genSyntheticParamsFromExplicitSuper(boolean qualifiedAndAnonymous, CodeSequence code)
          add synthetic parameters to super constructor invocation.
 CMethod[] getAbstractMethods()
          Returns the abstract methods of this class or interface.
 CMethod[] getApplicableMethods(String ident, CType[] actuals)
          Returns all applicable methods (JLS 15.12.2.1).
 CClass getCClass()
           
 CField getField(String ident)
          Returns the field with the specified name.
 int getFieldCount()
          Returns the number of fields.
 CField[] getFields()
          Returns an array containing the fields defined by this class.
protected static String getIdent(String qualifiedName)
           
protected  CMethod getImplementingMethod(CMethod pattern, CClass caller, boolean localClassOnly)
          Returns the non-abstract method that implements the specified method, or null if the method is not implemented.
 CClassType[] getInnerClasses()
           
 CClassType[] getInterfaces()
          Returns the interfaces defined by this class.
 CMethod[] getMethods()
          Returns the methods defined by this class.
 String getPackage()
           
 String getQualifiedName()
           
 Hashtable<String,CField> getRawFields()
          getFields will fail if any fields are binary.
 String getSourceFile()
          Returns the source file of this class.
 CClass getSuperClass()
          Returns the super class of this class
 CClassType getType()
          Returns the type of this class
 boolean hasOuterThis()
           
 boolean isAbstract()
           
 boolean isAccessible(CClass from)
          Checks whether this type is accessible from the specified class (JLS 6.6).
 boolean isAnonymous()
           
 boolean isClass()
           
 boolean isDefinedInside(CClass outer)
          Returns true iff this class is defined inside the specified class
 boolean isInterface()
           
 boolean isNested()
          Checks whether this type is nested.
 boolean isQualifiedAndAnonymous()
           
 CClass lookupClass(CClass caller, String name)
          This can be used to see if a given class name is visible inside of this file.
 CField lookupField(CClass caller, String ident)
          Searches the class or interface to locate declarations of fields that are accessible.
 CMethod lookupMethod(CClass caller, String ident, CType[] actuals)
          JLS 15.12.2 : Searches the class or interface to locate method declarations that are both applicable and accessible, that is, declarations that can be correctly invoked on the given arguments.
 CField lookupSuperField(CClass caller, String ident)
          Searches the class or interface to locate declarations of fields that are accessible.
 CMethod[] lookupSuperMethod(String ident, CType[] actuals)
          Searches the superclass and superinterfaces to locate method declarations that are applicable.
 void setHasOuterThis(boolean hasOuterThis)
          Sets hasOuterThis
 void setInnerClasses(CClassType[] inners)
          End of first pass, we need innerclassesinterfaces
 void setQualifiedAndAnonymous(boolean qualifiedAndAnonymous)
           
 void setSuperClass(CClassType superClass)
          Sets the super class of this class
 void setType(CType type)
           
 String toString()
          Returns a string representation of this class.
 
Methods inherited from class at.dms.kjc.CMember
deepCloneInto, getField, getIdent, getJavaName, getMethod, getModifiers, getOwner, getPrefixName, isDeprecated, isFinal, isPrivate, isProtected, isPublic, isStatic, setModifiers
 
Methods inherited from class at.dms.util.Utils
asPercent, cellMathEquivalent, cMathEquivalent, cppMathEquivalent, deepCloneInto, equalArrays, fail, getEnvironmentVariable, getExpression, hasPeeks, initArray, initArray, initLiteralArray, intArrayToList, isMathMethod, isUniform, kopi_assert, kopi_assert, makeCountdownForLoop, makeDotFileName, makeForLoop, makeForLoop, makeForLoop, makeForLoopFieldIndex, makeForLoopLocalIndex, nextPow2, passThruParens, peelMarkers, popBeforePeek, readFile, removeUnusedPops, replaceAll, setupDotFileName, simplifyMathMethod, splitQualifiedName, splitQualifiedName, toArray, toIntArray, toVector, voidToInt, writeFile
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

CLS_UNDEFINED

protected static CClass CLS_UNDEFINED
Constructor Detail

CClass

protected CClass()

CClass

public CClass(CClass owner,
              String sourceFile,
              int modifiers,
              String ident,
              String qualifiedName,
              CClassType superClass,
              boolean deprecated)
Constructs a class export from file

Method Detail

close

public void close(CClassType[] interfaces,
                  Hashtable<String,CField> fields,
                  CMethod[] methods)
Ends the definition of this class


getCClass

public CClass getCClass()
Overrides:
getCClass in class CMember
Returns:
the interface

isNested

public boolean isNested()
Checks whether this type is nested. JLS 8 (introduction), JLS 9 (introduction) : A nested type (class or interface) is any type whose declaration occurs within the body of another class or interface. A top level type is a type that is not a nested class.

Returns:
true iff this type is nested

isAbstract

public boolean isAbstract()
Returns:
true if this member is abstract

isAnonymous

public boolean isAnonymous()
Returns:
true if this class is anonymous

hasOuterThis

public boolean hasOuterThis()
Returns:
true if this class is has an outer this

setHasOuterThis

public void setHasOuterThis(boolean hasOuterThis)
Sets hasOuterThis


isInterface

public boolean isInterface()
Returns:
true if this class is an interface

isClass

public boolean isClass()
Returns:
true if this class is a class

getQualifiedName

public String getQualifiedName()
Overrides:
getQualifiedName in class CMember
Returns:
the full name of this class

getPackage

public String getPackage()
Returns:
the name of the package of the package this class belongs to

getSuperClass

public CClass getSuperClass()
Returns the super class of this class


setSuperClass

public void setSuperClass(CClassType superClass)
Sets the super class of this class


getType

public CClassType getType()
Returns the type of this class


setType

public void setType(CType type)

getSourceFile

public String getSourceFile()
Returns the source file of this class.


getField

public CField getField(String ident)
Returns the field with the specified name.

Parameters:
ident - the name of the field

getFieldCount

public int getFieldCount()
Returns the number of fields.


getFields

public CField[] getFields()
Returns an array containing the fields defined by this class.


getRawFields

public Hashtable<String,CField> getRawFields()
getFields will fail if any fields are binary. This will not fail.


getInterfaces

public CClassType[] getInterfaces()
Returns the interfaces defined by this class.


getMethods

public CMethod[] getMethods()
Returns the methods defined by this class.


getInnerClasses

public CClassType[] getInnerClasses()
Returns:
the InnerClasses

setInnerClasses

public void setInnerClasses(CClassType[] inners)
End of first pass, we need innerclassesinterfaces


descendsFrom

public boolean descendsFrom(CClass from)
descendsFrom

Parameters:
from - an other CClass
Returns:
true if this class inherit from "from" or equals "from"

isDefinedInside

public boolean isDefinedInside(CClass outer)
Returns true iff this class is defined inside the specified class

Parameters:
outer - another class

toString

public String toString()
Returns a string representation of this class.

Overrides:
toString in class Object

setQualifiedAndAnonymous

public void setQualifiedAndAnonymous(boolean qualifiedAndAnonymous)

isQualifiedAndAnonymous

public boolean isQualifiedAndAnonymous()

lookupClass

public CClass lookupClass(CClass caller,
                          String name)
                   throws UnpositionedError
This can be used to see if a given class name is visible inside of this file. This includes globally-qualified class names that include their package and simple names that are visible thanks to some previous import statement or visible because they are in this file. If one is found, that entry is returned, otherwise null is returned.

Parameters:
caller - the class of the caller
name - a TypeName (6.5.2)
Throws:
UnpositionedError

lookupField

public CField lookupField(CClass caller,
                          String ident)
                   throws UnpositionedError
Searches the class or interface to locate declarations of fields that are accessible.

Parameters:
caller - the class of the caller
ident - the simple name of the field
Returns:
the field definition
Throws:
UnpositionedError - this error will be positioned soon

lookupSuperField

public CField lookupSuperField(CClass caller,
                               String ident)
                        throws UnpositionedError
Searches the class or interface to locate declarations of fields that are accessible.

Parameters:
caller - the class of the caller
ident - the simple name of the field
Returns:
the field definition
Throws:
UnpositionedError - this error will be positioned soon

lookupMethod

public CMethod lookupMethod(CClass caller,
                            String ident,
                            CType[] actuals)
                     throws UnpositionedError
JLS 15.12.2 : Searches the class or interface to locate method declarations that are both applicable and accessible, that is, declarations that can be correctly invoked on the given arguments. There may be more than one such method declaration, in which case the most specific one is chosen.

Parameters:
caller - the class of the caller
ident - method invocation name
actuals - method invocation arguments
Returns:
the method to apply
Throws:
UnpositionedError - this error will be positioned soon

lookupSuperMethod

public CMethod[] lookupSuperMethod(String ident,
                                   CType[] actuals)
                            throws UnpositionedError
Searches the superclass and superinterfaces to locate method declarations that are applicable. No check for accessibility is done here.

Parameters:
ident - method invocation name
actuals - method invocation arguments
Throws:
UnpositionedError - this error will be positioned soon

getAbstractMethods

public CMethod[] getAbstractMethods()
Returns the abstract methods of this class or interface. JLS 8.1.1.1 : A class C has abstract methods if any of the following is true : - C explicitly contains a declaration of an abstract method. - Any of C's superclasses declares an abstract method that has not been implemented in C or any of its superclasses. - A direct superinterface of C declares or inherits a method (which is therefore necessarily abstract) and C neither declares nor inherits a method that implements it.


getImplementingMethod

protected CMethod getImplementingMethod(CMethod pattern,
                                        CClass caller,
                                        boolean localClassOnly)
Returns the non-abstract method that implements the specified method, or null if the method is not implemented.

Parameters:
pattern - the method specification
localClassOnly - do not search superclasses ?

getApplicableMethods

public CMethod[] getApplicableMethods(String ident,
                                      CType[] actuals)
Returns all applicable methods (JLS 15.12.2.1).

Parameters:
ident - method invocation name
actuals - method invocation arguments

collectApplicableMethods

public void collectApplicableMethods(Vector container,
                                     String ident,
                                     CType[] actuals)
Adds all applicable methods (JLS 15.12.2.1) to the specified container.

Parameters:
container - the container for the methods
ident - method invocation name
actuals - method invocation arguments

getIdent

protected static String getIdent(String qualifiedName)
Returns:
the short name of this class

isAccessible

public boolean isAccessible(CClass from)
Checks whether this type is accessible from the specified class (JLS 6.6).

Overrides:
isAccessible in class CMember
Returns:
true iff this member is accessible

addField

public void addField(CSourceField field)
Adds a field.


genConstructorArray

public CType[] genConstructorArray(CType[] params)
add synthetic parameters to method def


genOuterSyntheticParams

public void genOuterSyntheticParams(CodeSequence code)
add synthetic parameters to method call


genSyntheticParamsFromExplicitSuper

public void genSyntheticParamsFromExplicitSuper(boolean qualifiedAndAnonymous,
                                                CodeSequence code)
add synthetic parameters to super constructor invocation. Adds reference to enclosing reference.

Parameters:
qualifiedAndAnonymous - true, its it is a qualified

deepClone

public Object deepClone()
Returns a deep clone of this object.

Specified by:
deepClone in interface DeepCloneable
Overrides:
deepClone in class CMember

deepCloneInto

protected void deepCloneInto(CClass other)
Clones all fields of this into
other