Search in sources :

Example 36 with CstType

use of com.android.dx.rop.cst.CstType in project J2ME-Loader by nikita36078.

the class AttributeTranslator method translateInnerClasses.

/**
 * Gets the {@code InnerClasses} attribute out of a given
 * {@link AttributeList}, if any, translating it to one or more of an
 * {@code InnerClass}, {@code EnclosingClass}, or
 * {@code MemberClasses} annotation.
 *
 * @param thisClass {@code non-null;} type representing the class being
 * processed
 * @param attribs {@code non-null;} the attributes list to search in
 * @param needEnclosingClass whether to include an
 * {@code EnclosingClass} annotation
 * @return {@code null-ok;} the converted list of annotations, if there
 * was an attribute to translate
 */
private static Annotations translateInnerClasses(CstType thisClass, AttributeList attribs, boolean needEnclosingClass) {
    AttInnerClasses innerClasses = (AttInnerClasses) attribs.findFirst(AttInnerClasses.ATTRIBUTE_NAME);
    if (innerClasses == null) {
        return null;
    }
    /*
         * Search the list for the element representing the current class
         * as well as for any named member classes.
         */
    InnerClassList list = innerClasses.getInnerClasses();
    int size = list.size();
    InnerClassList.Item foundThisClass = null;
    ArrayList<Type> membersList = new ArrayList<Type>();
    for (int i = 0; i < size; i++) {
        InnerClassList.Item item = list.get(i);
        CstType innerClass = item.getInnerClass();
        if (innerClass.equals(thisClass)) {
            foundThisClass = item;
        } else if (thisClass.equals(item.getOuterClass())) {
            membersList.add(innerClass.getClassType());
        }
    }
    int membersSize = membersList.size();
    if ((foundThisClass == null) && (membersSize == 0)) {
        return null;
    }
    Annotations result = new Annotations();
    if (foundThisClass != null) {
        result.add(AnnotationUtils.makeInnerClass(foundThisClass.getInnerName(), foundThisClass.getAccessFlags()));
        if (needEnclosingClass) {
            CstType outer = foundThisClass.getOuterClass();
            if (outer == null) {
                throw new Warning("Ignoring InnerClasses attribute for an " + "anonymous inner class\n" + "(" + thisClass.toHuman() + ") that doesn't come with an\n" + "associated EnclosingMethod attribute. " + "This class was probably produced by a\n" + "compiler that did not target the modern " + ".class file format. The recommended\n" + "solution is to recompile the class from " + "source, using an up-to-date compiler\n" + "and without specifying any \"-target\" type " + "options. The consequence of ignoring\n" + "this warning is that reflective operations " + "on this class will incorrectly\n" + "indicate that it is *not* an inner class.");
            }
            result.add(AnnotationUtils.makeEnclosingClass(foundThisClass.getOuterClass()));
        }
    }
    if (membersSize != 0) {
        StdTypeList typeList = new StdTypeList(membersSize);
        for (int i = 0; i < membersSize; i++) {
            typeList.set(i, membersList.get(i));
        }
        typeList.setImmutable();
        result.add(AnnotationUtils.makeMemberClasses(typeList));
    }
    result.setImmutable();
    return result;
}
Also used : Type(com.android.dx.rop.type.Type) CstType(com.android.dx.rop.cst.CstType) Warning(com.android.dx.util.Warning) AttRuntimeVisibleAnnotations(com.android.dx.cf.attrib.AttRuntimeVisibleAnnotations) AttRuntimeVisibleParameterAnnotations(com.android.dx.cf.attrib.AttRuntimeVisibleParameterAnnotations) Annotations(com.android.dx.rop.annotation.Annotations) AttRuntimeInvisibleAnnotations(com.android.dx.cf.attrib.AttRuntimeInvisibleAnnotations) AttRuntimeInvisibleParameterAnnotations(com.android.dx.cf.attrib.AttRuntimeInvisibleParameterAnnotations) StdTypeList(com.android.dx.rop.type.StdTypeList) CstType(com.android.dx.rop.cst.CstType) ArrayList(java.util.ArrayList) InnerClassList(com.android.dx.cf.attrib.InnerClassList) AttInnerClasses(com.android.dx.cf.attrib.AttInnerClasses)

Example 37 with CstType

use of com.android.dx.rop.cst.CstType in project J2ME-Loader by nikita36078.

the class OutputFinisher method assignIndices.

/**
 * Helper for {@link #assignIndices} which does assignment for one
 * instruction.
 *
 * @param insn {@code non-null;} the instruction
 * @param callback {@code non-null;} the callback
 */
private static void assignIndices(MultiCstInsn insn, DalvCode.AssignIndicesCallback callback) {
    for (int i = 0; i < insn.getNumberOfConstants(); ++i) {
        Constant cst = insn.getConstant(i);
        int index = callback.getIndex(cst);
        insn.setIndex(i, index);
        if (cst instanceof CstMemberRef) {
            CstMemberRef member = (CstMemberRef) cst;
            CstType definer = member.getDefiningClass();
            index = callback.getIndex(definer);
            insn.setClassIndex(index);
        }
    }
}
Also used : CstMemberRef(com.android.dx.rop.cst.CstMemberRef) Constant(com.android.dx.rop.cst.Constant) CstType(com.android.dx.rop.cst.CstType)

Example 38 with CstType

use of com.android.dx.rop.cst.CstType in project J2ME-Loader by nikita36078.

the class OutputFinisher method assignIndices.

/**
 * Helper for {@link #assignIndices} which does assignment for one
 * instruction.
 *
 * @param insn {@code non-null;} the instruction
 * @param callback {@code non-null;} the callback
 */
private static void assignIndices(CstInsn insn, DalvCode.AssignIndicesCallback callback) {
    Constant cst = insn.getConstant();
    int index = callback.getIndex(cst);
    if (index >= 0) {
        insn.setIndex(index);
    }
    if (cst instanceof CstMemberRef) {
        CstMemberRef member = (CstMemberRef) cst;
        CstType definer = member.getDefiningClass();
        index = callback.getIndex(definer);
        // TODO(oth): what scenarios is this guard valid under? Is it not just an error?
        if (index >= 0) {
            insn.setClassIndex(index);
        }
    }
}
Also used : CstMemberRef(com.android.dx.rop.cst.CstMemberRef) Constant(com.android.dx.rop.cst.Constant) CstType(com.android.dx.rop.cst.CstType)

Example 39 with CstType

use of com.android.dx.rop.cst.CstType in project J2ME-Loader by nikita36078.

the class StdCatchBuilder method handlersFor.

/**
 * Makes the {@link CatchHandlerList} for the given basic block.
 *
 * @param block {@code non-null;} block to get entries for
 * @param addresses {@code non-null;} address objects for each block
 * @return {@code non-null;} array of entries
 */
private static CatchHandlerList handlersFor(BasicBlock block, BlockAddresses addresses) {
    IntList successors = block.getSuccessors();
    int succSize = successors.size();
    int primary = block.getPrimarySuccessor();
    TypeList catches = block.getLastInsn().getCatches();
    int catchSize = catches.size();
    if (catchSize == 0) {
        return CatchHandlerList.EMPTY;
    }
    if (((primary == -1) && (succSize != catchSize)) || ((primary != -1) && ((succSize != (catchSize + 1)) || (primary != successors.get(catchSize))))) {
        /*
             * Blocks that throw are supposed to list their primary
             * successor -- if any -- last in the successors list, but
             * that constraint appears to be violated here.
             */
        throw new RuntimeException("shouldn't happen: weird successors list");
    }
    /*
         * Reduce the effective catchSize if we spot a catch-all that
         * isn't at the end.
         */
    for (int i = 0; i < catchSize; i++) {
        Type type = catches.getType(i);
        if (type.equals(Type.OBJECT)) {
            catchSize = i + 1;
            break;
        }
    }
    CatchHandlerList result = new CatchHandlerList(catchSize);
    for (int i = 0; i < catchSize; i++) {
        CstType oneType = new CstType(catches.getType(i));
        CodeAddress oneHandler = addresses.getStart(successors.get(i));
        result.set(i, oneType, oneHandler.getAddress());
    }
    result.setImmutable();
    return result;
}
Also used : Type(com.android.dx.rop.type.Type) CstType(com.android.dx.rop.cst.CstType) CstType(com.android.dx.rop.cst.CstType) TypeList(com.android.dx.rop.type.TypeList) IntList(com.android.dx.util.IntList)

Example 40 with CstType

use of com.android.dx.rop.cst.CstType in project J2ME-Loader by nikita36078.

the class Form22c method isCompatible.

/**
 * {@inheritDoc}
 */
@Override
public boolean isCompatible(DalvInsn insn) {
    RegisterSpecList regs = insn.getRegisters();
    if (!((insn instanceof CstInsn) && (regs.size() == 2) && unsignedFitsInNibble(regs.get(0).getReg()) && unsignedFitsInNibble(regs.get(1).getReg()))) {
        return false;
    }
    CstInsn ci = (CstInsn) insn;
    int cpi = ci.getIndex();
    if (!unsignedFitsInShort(cpi)) {
        return false;
    }
    Constant cst = ci.getConstant();
    return (cst instanceof CstType) || (cst instanceof CstFieldRef);
}
Also used : CstInsn(com.android.dx.dex.code.CstInsn) Constant(com.android.dx.rop.cst.Constant) CstType(com.android.dx.rop.cst.CstType) CstFieldRef(com.android.dx.rop.cst.CstFieldRef) RegisterSpecList(com.android.dx.rop.code.RegisterSpecList)

Aggregations

CstType (com.android.dx.rop.cst.CstType)76 CstString (com.android.dx.rop.cst.CstString)29 Constant (com.android.dx.rop.cst.Constant)28 CstFieldRef (com.android.dx.rop.cst.CstFieldRef)19 CstMethodRef (com.android.dx.rop.cst.CstMethodRef)18 Type (com.android.dx.rop.type.Type)16 RegisterSpecList (com.android.dx.rop.code.RegisterSpecList)12 CstInsn (com.android.dx.dex.code.CstInsn)10 Annotations (com.android.dx.rop.annotation.Annotations)10 RegisterSpec (com.android.dx.rop.code.RegisterSpec)10 CstNat (com.android.dx.rop.cst.CstNat)10 TypeList (com.android.dx.rop.type.TypeList)9 Annotation (com.android.dx.rop.annotation.Annotation)8 ConstantPool (com.android.dx.rop.cst.ConstantPool)8 ByteArray (com.android.dx.util.ByteArray)7 IntList (com.android.dx.util.IntList)7 AttEnclosingMethod (com.android.dx.cf.attrib.AttEnclosingMethod)6 NameValuePair (com.android.dx.rop.annotation.NameValuePair)6 ThrowingCstInsn (com.android.dx.rop.code.ThrowingCstInsn)6 CstInteger (com.android.dx.rop.cst.CstInteger)6