Search in sources :

Example 1 with VisibilityAnnotationTag

use of soot.tagkit.VisibilityAnnotationTag in project robovm by robovm.

the class AttributesEncoder method encodeAttributes.

private Constant encodeAttributes(Host host) {
    List<Value> attributes = new ArrayList<Value>();
    for (Tag tag : host.getTags()) {
        if (tag instanceof SourceFileTag) {
            // Skip. We don't need this at this time.
            Value sourceFile = getString(((SourceFileTag) tag).getSourceFile());
            attributes.add(new PackedStructureConstant(new PackedStructureType(I8, I8_PTR), new IntegerConstant(SOURCE_FILE), sourceFile));
        } else if (tag instanceof EnclosingMethodTag) {
            EnclosingMethodTag emt = (EnclosingMethodTag) tag;
            Value eClass = getString(emt.getEnclosingClass());
            Value eMethod = getStringOrNull(emt.getEnclosingMethod());
            Value eDesc = getStringOrNull(emt.getEnclosingMethodSig());
            attributes.add(new PackedStructureConstant(new PackedStructureType(I8, I8_PTR, I8_PTR, I8_PTR), new IntegerConstant(ENCLOSING_METHOD), eClass, eMethod, eDesc));
        } else if (tag instanceof SignatureTag) {
            Value signature = getString(((SignatureTag) tag).getSignature());
            attributes.add(new PackedStructureConstant(new PackedStructureType(I8, I8_PTR), new IntegerConstant(SIGNATURE), signature));
        } else if (tag instanceof InnerClassTag) {
            InnerClassTag ict = (InnerClassTag) tag;
            Value innerClass = getStringOrNull(ict.getInnerClass());
            Value outerClass = getStringOrNull(ict.getOuterClass());
            Value innerName = getStringOrNull(ict.getShortName());
            Value innerClassAccess = new IntegerConstant(ict.getAccessFlags());
            attributes.add(new PackedStructureConstant(new PackedStructureType(I8, I8_PTR, I8_PTR, I8_PTR, I32), new IntegerConstant(INNER_CLASS), innerClass, outerClass, innerName, innerClassAccess));
        } else if (tag instanceof AnnotationDefaultTag) {
            StructureConstant value = encodeAnnotationElementValue(((AnnotationDefaultTag) tag).getDefaultVal());
            attributes.add(new PackedStructureConstant(new PackedStructureType(I8, value.getType()), new IntegerConstant(ANNOTATION_DEFAULT), value));
        } else if (tag instanceof VisibilityAnnotationTag) {
            VisibilityAnnotationTag vat = (VisibilityAnnotationTag) tag;
            if (vat.getVisibility() == AnnotationConstants.RUNTIME_VISIBLE) {
                Type[] types = new Type[vat.getAnnotations().size()];
                Value[] values = new Value[vat.getAnnotations().size()];
                int i = 0;
                for (AnnotationTag at : vat.getAnnotations()) {
                    values[i] = encodeAnnotationTagValue(at);
                    types[i] = values[i].getType();
                    i++;
                }
                attributes.add(new PackedStructureConstant(new PackedStructureType(I8, I32, new PackedStructureType(types)), new IntegerConstant(RUNTIME_VISIBLE_ANNOTATIONS), new IntegerConstant(vat.getAnnotations().size()), new PackedStructureConstant(new PackedStructureType(types), values)));
            }
        } else if (tag instanceof VisibilityParameterAnnotationTag) {
            VisibilityParameterAnnotationTag vpat = (VisibilityParameterAnnotationTag) tag;
            List<Type> typesList = new ArrayList<Type>();
            List<Value> valuesList = new ArrayList<Value>();
            boolean hasRuntimeVisible = false;
            for (VisibilityAnnotationTag vat : vpat.getVisibilityAnnotations()) {
                typesList.add(I32);
                if (vat.getVisibility() == AnnotationConstants.RUNTIME_VISIBLE && vat.getAnnotations() != null && !vat.getAnnotations().isEmpty()) {
                    hasRuntimeVisible = true;
                    valuesList.add(new IntegerConstant(vat.getAnnotations().size()));
                    for (AnnotationTag at : vat.getAnnotations()) {
                        valuesList.add(encodeAnnotationTagValue(at));
                        typesList.add(valuesList.get(valuesList.size() - 1).getType());
                    }
                } else {
                    valuesList.add(new IntegerConstant(0));
                }
            }
            if (hasRuntimeVisible) {
                Type[] types = typesList.toArray(new Type[typesList.size()]);
                Value[] values = valuesList.toArray(new Value[valuesList.size()]);
                attributes.add(new PackedStructureConstant(new PackedStructureType(I8, I32, new PackedStructureType(types)), new IntegerConstant(RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS), new IntegerConstant(vpat.getVisibilityAnnotations().size()), new PackedStructureConstant(new PackedStructureType(types), values)));
            }
        }
    }
    if (host instanceof SootMethod) {
        List<SootClass> exceptions = ((SootMethod) host).getExceptions();
        if (!exceptions.isEmpty()) {
            Value[] values = new Value[exceptions.size()];
            for (int i = 0; i < exceptions.size(); i++) {
                String exName = getInternalName(exceptions.get(i));
                values[i] = getString(exName);
                addDependency(exName);
            }
            attributes.add(new PackedStructureConstant(new PackedStructureType(I8, I32, new ArrayType(exceptions.size(), I8_PTR)), new IntegerConstant(EXCEPTIONS), new IntegerConstant(exceptions.size()), new ArrayConstant(new ArrayType(exceptions.size(), I8_PTR), values)));
        }
    }
    if (attributes.isEmpty()) {
        return null;
    }
    attributes.add(0, new IntegerConstant(attributes.size()));
    Type[] types = new Type[attributes.size()];
    for (int i = 0; i < types.length; i++) {
        types[i] = attributes.get(i).getType();
    }
    return new PackedStructureConstant(new PackedStructureType(types), attributes.toArray(new Value[0]));
}
Also used : ArrayList(java.util.ArrayList) SourceFileTag(soot.tagkit.SourceFileTag) ArrayType(org.robovm.compiler.llvm.ArrayType) InnerClassTag(soot.tagkit.InnerClassTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag) AnnotationTag(soot.tagkit.AnnotationTag) VisibilityParameterAnnotationTag(soot.tagkit.VisibilityParameterAnnotationTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag) ArrayConstant(org.robovm.compiler.llvm.ArrayConstant) VisibilityParameterAnnotationTag(soot.tagkit.VisibilityParameterAnnotationTag) AnnotationDefaultTag(soot.tagkit.AnnotationDefaultTag) SootClass(soot.SootClass) PackedStructureType(org.robovm.compiler.llvm.PackedStructureType) IntegerConstant(org.robovm.compiler.llvm.IntegerConstant) PackedStructureConstant(org.robovm.compiler.llvm.PackedStructureConstant) EnclosingMethodTag(soot.tagkit.EnclosingMethodTag) PackedStructureType(org.robovm.compiler.llvm.PackedStructureType) ArrayType(org.robovm.compiler.llvm.ArrayType) Type(org.robovm.compiler.llvm.Type) StructureConstant(org.robovm.compiler.llvm.StructureConstant) PackedStructureConstant(org.robovm.compiler.llvm.PackedStructureConstant) Value(org.robovm.compiler.llvm.Value) SignatureTag(soot.tagkit.SignatureTag) SootMethod(soot.SootMethod) Tag(soot.tagkit.Tag) AnnotationDefaultTag(soot.tagkit.AnnotationDefaultTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag) InnerClassTag(soot.tagkit.InnerClassTag) SignatureTag(soot.tagkit.SignatureTag) AnnotationTag(soot.tagkit.AnnotationTag) SourceFileTag(soot.tagkit.SourceFileTag) EnclosingMethodTag(soot.tagkit.EnclosingMethodTag) VisibilityParameterAnnotationTag(soot.tagkit.VisibilityParameterAnnotationTag)

Example 2 with VisibilityAnnotationTag

use of soot.tagkit.VisibilityAnnotationTag in project robovm by robovm.

the class Annotations method addRuntimeVisibleAnnotation.

public static void addRuntimeVisibleAnnotation(Host host, AnnotationTag annoTag) {
    removeAnnotation(host, annoTag.getType());
    VisibilityAnnotationTag tag = getOrCreateRuntimeVisibilityAnnotationTag(host);
    tag.addAnnotation(annoTag);
}
Also used : VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag)

Example 3 with VisibilityAnnotationTag

use of soot.tagkit.VisibilityAnnotationTag in project robovm by robovm.

the class Annotations method copyAnnotations.

private static void copyAnnotations(SootMethod fromMethod, SootMethod toMethod, int visibility) {
    for (Tag tag : fromMethod.getTags()) {
        if (tag instanceof VisibilityAnnotationTag) {
            if (((VisibilityAnnotationTag) tag).getVisibility() == visibility) {
                VisibilityAnnotationTag copy = new VisibilityAnnotationTag(visibility);
                for (AnnotationTag annoTag : ((VisibilityAnnotationTag) tag).getAnnotations()) {
                    copy.addAnnotation(annoTag);
                }
                toMethod.addTag(copy);
            }
        }
    }
}
Also used : AnnotationTag(soot.tagkit.AnnotationTag) VisibilityParameterAnnotationTag(soot.tagkit.VisibilityParameterAnnotationTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag) Tag(soot.tagkit.Tag) AnnotationTag(soot.tagkit.AnnotationTag) VisibilityParameterAnnotationTag(soot.tagkit.VisibilityParameterAnnotationTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag)

Example 4 with VisibilityAnnotationTag

use of soot.tagkit.VisibilityAnnotationTag in project robovm by robovm.

the class Annotations method getOrCreateRuntimeVisibilityAnnotationTag.

public static VisibilityAnnotationTag getOrCreateRuntimeVisibilityAnnotationTag(SootMethod method, int paramIndex) {
    for (Tag tag : method.getTags()) {
        if (tag instanceof VisibilityParameterAnnotationTag) {
            ArrayList<VisibilityAnnotationTag> l = ((VisibilityParameterAnnotationTag) tag).getVisibilityAnnotations();
            if (l != null && paramIndex < l.size()) {
                if ((l.get(paramIndex)).getVisibility() == RUNTIME_VISIBLE) {
                    return l.get(paramIndex);
                }
            }
        }
    }
    VisibilityParameterAnnotationTag ptag = new VisibilityParameterAnnotationTag(method.getParameterCount(), RUNTIME_VISIBLE);
    ArrayList<VisibilityAnnotationTag> l = new ArrayList<VisibilityAnnotationTag>();
    for (int i = 0; i < method.getParameterCount(); i++) {
        l.add(new VisibilityAnnotationTag(RUNTIME_VISIBLE));
    }
    method.addTag(ptag);
    return l.get(paramIndex);
}
Also used : VisibilityParameterAnnotationTag(soot.tagkit.VisibilityParameterAnnotationTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag) ArrayList(java.util.ArrayList) Tag(soot.tagkit.Tag) AnnotationTag(soot.tagkit.AnnotationTag) VisibilityParameterAnnotationTag(soot.tagkit.VisibilityParameterAnnotationTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag)

Example 5 with VisibilityAnnotationTag

use of soot.tagkit.VisibilityAnnotationTag in project robovm by robovm.

the class Annotations method getOrCreateRuntimeVisibilityAnnotationTag.

public static VisibilityAnnotationTag getOrCreateRuntimeVisibilityAnnotationTag(Host host) {
    for (Tag tag : host.getTags()) {
        if (tag instanceof VisibilityAnnotationTag) {
            if (((VisibilityAnnotationTag) tag).getVisibility() == RUNTIME_VISIBLE) {
                return (VisibilityAnnotationTag) tag;
            }
        }
    }
    VisibilityAnnotationTag tag = new VisibilityAnnotationTag(RUNTIME_VISIBLE);
    host.addTag(tag);
    return tag;
}
Also used : VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag) Tag(soot.tagkit.Tag) AnnotationTag(soot.tagkit.AnnotationTag) VisibilityParameterAnnotationTag(soot.tagkit.VisibilityParameterAnnotationTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag)

Aggregations

VisibilityAnnotationTag (soot.tagkit.VisibilityAnnotationTag)10 AnnotationTag (soot.tagkit.AnnotationTag)8 VisibilityParameterAnnotationTag (soot.tagkit.VisibilityParameterAnnotationTag)8 Tag (soot.tagkit.Tag)6 ArrayList (java.util.ArrayList)4 List (java.util.List)1 ArrayConstant (org.robovm.compiler.llvm.ArrayConstant)1 ArrayType (org.robovm.compiler.llvm.ArrayType)1 IntegerConstant (org.robovm.compiler.llvm.IntegerConstant)1 PackedStructureConstant (org.robovm.compiler.llvm.PackedStructureConstant)1 PackedStructureType (org.robovm.compiler.llvm.PackedStructureType)1 StructureConstant (org.robovm.compiler.llvm.StructureConstant)1 Type (org.robovm.compiler.llvm.Type)1 Value (org.robovm.compiler.llvm.Value)1 SootClass (soot.SootClass)1 SootMethod (soot.SootMethod)1 AnnotationDefaultTag (soot.tagkit.AnnotationDefaultTag)1 EnclosingMethodTag (soot.tagkit.EnclosingMethodTag)1 InnerClassTag (soot.tagkit.InnerClassTag)1 SignatureTag (soot.tagkit.SignatureTag)1