private int compareArrayKey(ArrayContentsKey key1, Object key2) { if (key2 instanceof ArrayContentsKey) { ArrayClass k1 = (ArrayClass)key1.getInstanceKey().getConcreteType(); ArrayClass k2 = (ArrayClass)((ArrayContentsKey)key2).getInstanceKey().getConcreteType(); int d1 = k1.getDimensionality(); int d2 = k2.getDimensionality(); if (d1 != d2) { return d1-d2; } else if (k1.getInnermostElementClass() == null) { if (k2.getInnermostElementClass() == null) return comparePrimitives( k1.getReference().getInnermostElementType(), k2.getReference().getInnermostElementType()); else return -1; } else if (k2.getInnermostElementClass() == null) { return 1; } else { return compareConcreteTypes( k1.getInnermostElementClass(), k2.getInnermostElementClass()); } } else return -1; }
/** * @return null if the element type is a primitive * @throws IllegalArgumentException if T == null */ private static IClass myElementType(ArrayClass T, int d) throws IllegalArgumentException, IllegalArgumentException { if (T == null) { throw new IllegalArgumentException("T == null"); } if (d == 0) { return T.getElementClass(); } else { ArrayClass element = (ArrayClass) T.getElementClass(); if (element == null) { return null; } else { return myElementType(element, d - 1); } } }
public int getDimensionality() { return getArrayTypeDimensionality(getReference()); }
final int dim = aCls.getDimensionality(); if (aCls.isOfPrimitives()) { ret.add(aCls.getReference()); } else { final IClass inner = aCls.getInnermostElementClass();
/** * Record that we have a new instanceKey for a given declared type. */ private void registerInstanceOfClass(IClass klass, int index) { if (DEBUG) { System.err.println("registerInstanceOfClass " + klass + ' ' + index); } assert !klass.getReference().equals(TypeReference.JavaLangObject); IClass T = klass; registerInstanceWithAllSuperclasses(index, T); registerInstanceWithAllInterfaces(klass, index); if (klass.isArrayClass()) { ArrayClass aClass = (ArrayClass) klass; int dim = aClass.getDimensionality(); registerMultiDimArraysForArrayOfObjectTypes(dim, index, aClass); IClass elementClass = aClass.getInnermostElementClass(); if (elementClass != null) { registerArrayInstanceWithAllSuperclassesOfElement(index, elementClass, dim); registerArrayInstanceWithAllInterfacesOfElement(index, elementClass, dim); } } }
/** * Add a New statement of the given array type and length */ public SSANewInstruction add1DArrayAllocation(TypeReference T, int length) { int instance = nextLocal++; NewSiteReference ref = NewSiteReference.make(statements.size(), T); assert T.isArrayType(); assert ((ArrayClass)cha.lookupClass(T)).getDimensionality() == 1; int[] sizes = new int[1]; Arrays.fill(sizes, getValueNumberForIntConstant(length)); SSANewInstruction result = insts.NewInstruction(statements.size(), instance, ref, sizes); statements.add(result); cache.invalidate(this, Everywhere.EVERYWHERE); return result; }
@Override public IClass getSuperclass() { IClass elt = getElementClass(); assert getReference().getArrayElementType().isPrimitiveType() || elt != null; // super is Ljava/lang/Object in two cases: // 1) [Ljava/lang/Object // 2) [? for primitive arrays (null from getElementClass) if (elt == null || elt.getReference() == getClassLoader().getLanguage().getRootType()) { return loader.lookupClass(getClassLoader().getLanguage().getRootType().getName()); } // else it is array of super of element type (yuck) else { TypeReference eltSuperRef = elt.getSuperclass().getReference(); TypeReference superRef = TypeReference.findOrCreateArrayOf(eltSuperRef); return elt.getSuperclass().getClassLoader().lookupClass(superRef.getName()); } }
@Override public TypeName getName() { return getReference().getName(); }
NewSiteReference ref = NewSiteReference.make(statements.size(), T); if (T.isArrayType()) { int[] sizes = new int[ArrayClass.getArrayTypeDimensionality(T)]; Arrays.fill(sizes, getValueNumberForIntConstant(1)); result = insts.NewInstruction(statements.size(), instance, ref, sizes); SSANewInstruction ni = null; if (e.isArrayType()) { int[] sizes = new int[((ArrayClass)cha.lookupClass(T)).getDimensionality()]; Arrays.fill(sizes, getValueNumberForIntConstant(1)); ni = insts.NewInstruction(statements.size(), alloc, n, sizes);
@Override public Collection<IClass> getAllImplementedInterfaces() { HashSet<IClass> result = HashSetFactory.make(2); for (TypeReference ref : getClassLoader().getLanguage().getArrayInterfaces()) { IClass klass = loader.lookupClass(ref.getName()); if (klass != null) { result.add(klass); } } return result; }
@Override public IField getField(Atom name) { return getSuperclass().getField(name); }
IClassLoader primordial = getRootClassLoader(delegator); if (arrayClass == null) { arrayClasses.put(aRef, arrayClass=new ArrayClass(aRef,primordial,cha)); arrayClass = new ArrayClass(realType, elementCls.getClassLoader(), cha);
final int dim = aCls.getDimensionality(); if (aCls.isOfPrimitives()) { ret.add(aCls.getReference()); } else { final IClass inner = aCls.getInnermostElementClass();
/** * Record that we have a new instanceKey for a given declared type. */ private void registerInstanceOfClass(IClass klass, int index) { if (DEBUG) { System.err.println("registerInstanceOfClass " + klass + ' ' + index); } assert !klass.getReference().equals(TypeReference.JavaLangObject); IClass T = klass; registerInstanceWithAllSuperclasses(index, T); registerInstanceWithAllInterfaces(klass, index); if (klass.isArrayClass()) { ArrayClass aClass = (ArrayClass) klass; int dim = aClass.getDimensionality(); registerMultiDimArraysForArrayOfObjectTypes(dim, index, aClass); IClass elementClass = aClass.getInnermostElementClass(); if (elementClass != null) { registerArrayInstanceWithAllSuperclassesOfElement(index, elementClass, dim); registerArrayInstanceWithAllInterfacesOfElement(index, elementClass, dim); } } }
/** * Add a New statement of the given array type and length */ public SSANewInstruction add1DArrayAllocation(TypeReference T, int length) { int instance = nextLocal++; NewSiteReference ref = NewSiteReference.make(statements.size(), T); assert T.isArrayType(); assert ((ArrayClass)cha.lookupClass(T)).getDimensionality() == 1; int[] sizes = new int[1]; Arrays.fill(sizes, getValueNumberForIntConstant(length)); SSANewInstruction result = insts.NewInstruction(statements.size(), instance, ref, sizes); statements.add(result); cache.invalidate(this, Everywhere.EVERYWHERE); return result; }
@Override public IClass getSuperclass() { IClass elt = getElementClass(); assert getReference().getArrayElementType().isPrimitiveType() || elt != null; // super is Ljava/lang/Object in two cases: // 1) [Ljava/lang/Object // 2) [? for primitive arrays (null from getElementClass) if (elt == null || elt.getReference() == getClassLoader().getLanguage().getRootType()) { return loader.lookupClass(getClassLoader().getLanguage().getRootType().getName()); } // else it is array of super of element type (yuck) else { TypeReference eltSuperRef = elt.getSuperclass().getReference(); TypeReference superRef = TypeReference.findOrCreateArrayOf(eltSuperRef); return elt.getSuperclass().getClassLoader().lookupClass(superRef.getName()); } }
@Override public String toString() { return getReference().toString(); }
NewSiteReference ref = NewSiteReference.make(statements.size(), T); if (T.isArrayType()) { int[] sizes = new int[ArrayClass.getArrayTypeDimensionality(T)]; Arrays.fill(sizes, getValueNumberForIntConstant(1)); result = insts.NewInstruction(statements.size(), instance, ref, sizes); SSANewInstruction ni = null; if (e.isArrayType()) { int[] sizes = new int[((ArrayClass)cha.lookupClass(T)).getDimensionality()]; Arrays.fill(sizes, getValueNumberForIntConstant(1)); ni = insts.NewInstruction(statements.size(), alloc, n, sizes);
@Override public Collection<IClass> getAllImplementedInterfaces() { HashSet<IClass> result = HashSetFactory.make(2); for (TypeReference ref : getClassLoader().getLanguage().getArrayInterfaces()) { IClass klass = loader.lookupClass(ref.getName()); if (klass != null) { result.add(klass); } } return result; }
@Override public IField getField(Atom name, TypeName typeName) { return getSuperclass().getField(name, typeName); }