All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.zving.framework.thirdparty.asm.AnnotationWriter Maven / Gradle / Ivy

There is a newer version: 0.3.0
Show newest version
// Decompiled by DJ v3.12.12.101 Copyright 2016 Atanas Neshkov  Date: 2016/5/14 12:59:34
// Home Page:  http://www.neshkov.com/dj.html - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   AnnotationWriter.java

package com.zving.framework.thirdparty.asm;


// Referenced classes of package com.zving.framework.thirdparty.asm:
//            AnnotationVisitor, ClassWriter, ByteVector, Item, 
//            Type

final class AnnotationWriter extends AnnotationVisitor
{

    AnnotationWriter(ClassWriter cw, boolean named, ByteVector bv, ByteVector parent, int offset)
    {
        super(0x40000);
        this.cw = cw;
        this.named = named;
        this.bv = bv;
        this.parent = parent;
        this.offset = offset;
    }

    public void visit(String name, Object value)
    {
        size++;
        if(named)
            bv.putShort(cw.newUTF8(name));
        if(value instanceof String)
            bv.put12(115, cw.newUTF8((String)value));
        else
        if(value instanceof Byte)
            bv.put12(66, cw.newInteger(((Byte)value).byteValue()).index);
        else
        if(value instanceof Boolean)
        {
            int v = ((Boolean)value).booleanValue() ? 1 : 0;
            bv.put12(90, cw.newInteger(v).index);
        } else
        if(value instanceof Character)
            bv.put12(67, cw.newInteger(((Character)value).charValue()).index);
        else
        if(value instanceof Short)
            bv.put12(83, cw.newInteger(((Short)value).shortValue()).index);
        else
        if(value instanceof Type)
            bv.put12(99, cw.newUTF8(((Type)value).getDescriptor()));
        else
        if(value instanceof byte[])
        {
            byte v[] = (byte[])value;
            bv.put12(91, v.length);
            byte abyte0[];
            int l1 = (abyte0 = v).length;
            for(int j = 0; j < l1; j++)
            {
                byte element = abyte0[j];
                bv.put12(66, cw.newInteger(element).index);
            }

        } else
        if(value instanceof boolean[])
        {
            boolean v[] = (boolean[])value;
            bv.put12(91, v.length);
            boolean aflag[];
            int i2 = (aflag = v).length;
            for(int k = 0; k < i2; k++)
            {
                boolean element = aflag[k];
                bv.put12(90, cw.newInteger(element ? 1 : 0).index);
            }

        } else
        if(value instanceof short[])
        {
            short v[] = (short[])value;
            bv.put12(91, v.length);
            short aword0[];
            int j2 = (aword0 = v).length;
            for(int l = 0; l < j2; l++)
            {
                short element = aword0[l];
                bv.put12(83, cw.newInteger(element).index);
            }

        } else
        if(value instanceof char[])
        {
            char v[] = (char[])value;
            bv.put12(91, v.length);
            char ac[];
            int k2 = (ac = v).length;
            for(int i1 = 0; i1 < k2; i1++)
            {
                char element = ac[i1];
                bv.put12(67, cw.newInteger(element).index);
            }

        } else
        if(value instanceof int[])
        {
            int v[] = (int[])value;
            bv.put12(91, v.length);
            int ai[];
            int l2 = (ai = v).length;
            for(int j1 = 0; j1 < l2; j1++)
            {
                int element = ai[j1];
                bv.put12(73, cw.newInteger(element).index);
            }

        } else
        if(value instanceof long[])
        {
            long v[] = (long[])value;
            bv.put12(91, v.length);
            long al[];
            int l3 = (al = v).length;
            for(int i3 = 0; i3 < l3; i3++)
            {
                long element = al[i3];
                bv.put12(74, cw.newLong(element).index);
            }

        } else
        if(value instanceof float[])
        {
            float v[] = (float[])value;
            bv.put12(91, v.length);
            float af[];
            int j3 = (af = v).length;
            for(int k1 = 0; k1 < j3; k1++)
            {
                float element = af[k1];
                bv.put12(70, cw.newFloat(element).index);
            }

        } else
        if(value instanceof double[])
        {
            double v[] = (double[])value;
            bv.put12(91, v.length);
            double ad[];
            int i4 = (ad = v).length;
            for(int k3 = 0; k3 < i4; k3++)
            {
                double element = ad[k3];
                bv.put12(68, cw.newDouble(element).index);
            }

        } else
        {
            Item i = cw.newConstItem(value);
            bv.put12(".s.IFJDCS".charAt(i.type), i.index);
        }
    }

    public void visitEnum(String name, String desc, String value)
    {
        size++;
        if(named)
            bv.putShort(cw.newUTF8(name));
        bv.put12(101, cw.newUTF8(desc)).putShort(cw.newUTF8(value));
    }

    public AnnotationVisitor visitAnnotation(String name, String desc)
    {
        size++;
        if(named)
            bv.putShort(cw.newUTF8(name));
        bv.put12(64, cw.newUTF8(desc)).putShort(0);
        return new AnnotationWriter(cw, true, bv, bv, bv.length - 2);
    }

    public AnnotationVisitor visitArray(String name)
    {
        size++;
        if(named)
            bv.putShort(cw.newUTF8(name));
        bv.put12(91, 0);
        return new AnnotationWriter(cw, false, bv, bv, bv.length - 2);
    }

    public void visitEnd()
    {
        if(parent != null)
        {
            byte data[] = parent.data;
            data[offset] = (byte)(size >>> 8);
            data[offset + 1] = (byte)size;
        }
    }

    int getSize()
    {
        int size = 0;
        for(AnnotationWriter aw = this; aw != null; aw = aw.next)
            size += aw.bv.length;

        return size;
    }

    void put(ByteVector out)
    {
        int n = 0;
        int size = 2;
        AnnotationWriter aw = this;
        AnnotationWriter last = null;
        for(; aw != null; aw = aw.next)
        {
            n++;
            size += aw.bv.length;
            aw.visitEnd();
            aw.prev = last;
            last = aw;
        }

        out.putInt(size);
        out.putShort(n);
        for(aw = last; aw != null; aw = aw.prev)
            out.putByteArray(aw.bv.data, 0, aw.bv.length);

    }

    static void put(AnnotationWriter panns[], int off, ByteVector out)
    {
        int size = 1 + 2 * (panns.length - off);
        for(int i = off; i < panns.length; i++)
            size += panns[i] != null ? panns[i].getSize() : 0;

        out.putInt(size).putByte(panns.length - off);
        for(int i = off; i < panns.length; i++)
        {
            AnnotationWriter aw = panns[i];
            AnnotationWriter last = null;
            int n = 0;
            for(; aw != null; aw = aw.next)
            {
                n++;
                aw.visitEnd();
                aw.prev = last;
                last = aw;
            }

            out.putShort(n);
            for(aw = last; aw != null; aw = aw.prev)
                out.putByteArray(aw.bv.data, 0, aw.bv.length);

        }

    }

    private final int offset;
    private final ClassWriter cw;
    private int size;
    private final boolean named;
    private final ByteVector bv;
    private final ByteVector parent;
    AnnotationWriter next;
    AnnotationWriter prev;
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy