1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it
8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free
9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option)
10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version.
11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT
13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details.
16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along
18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc.,
19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.classfile.io;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.*;
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.*;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.visitor.*;
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.preverification.*;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.preverification.visitor.*;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.*;
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*;
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor;
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.*;
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*;
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.io.*;
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ClassVisitor writes out the ProgramClass objects that it visits to the
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * given DataOutput object.
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class ProgramClassWriter
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends      SimplifiedVisitor
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements   ClassVisitor,
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             MemberVisitor,
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ConstantVisitor,
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             AttributeVisitor
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private RuntimeDataOutput dataOutput;
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final ConstantBodyWriter         constantBodyWriter         = new ConstantBodyWriter();
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final AttributeBodyWriter        attributeBodyWriter        = new AttributeBodyWriter();
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final StackMapFrameBodyWriter    stackMapFrameBodyWriter    = new StackMapFrameBodyWriter();
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final VerificationTypeBodyWriter verificationTypeBodyWriter = new VerificationTypeBodyWriter();
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final ElementValueBodyWriter     elementValueBodyWriter     = new ElementValueBodyWriter();
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Creates a new ProgramClassWriter for writing to the given DataOutput.
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public ProgramClassWriter(DataOutput dataOutput)
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.dataOutput = new RuntimeDataOutput(dataOutput);
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ClassVisitor.
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramClass(ProgramClass programClass)
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the magic number.
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeInt(programClass.u4magic);
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the version numbers.
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(ClassUtil.internalMinorClassVersion(programClass.u4version));
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(ClassUtil.internalMajorClassVersion(programClass.u4version));
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the constant pool.
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programClass.u2constantPoolCount);
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.constantPoolEntriesAccept(this);
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the general class information.
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programClass.u2accessFlags);
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programClass.u2thisClass);
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programClass.u2superClass);
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the interfaces.
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programClass.u2interfacesCount);
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < programClass.u2interfacesCount; index++)
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(programClass.u2interfaces[index]);
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the fields.
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programClass.u2fieldsCount);
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.fieldsAccept(this);
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the methods.
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programClass.u2methodsCount);
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.methodsAccept(this);
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the class attributes.
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programClass.u2attributesCount);
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.attributesAccept(this);
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryClass(LibraryClass libraryClass)
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for MemberVisitor.
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramField(ProgramClass programClass, ProgramField programField)
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the general field information.
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programField.u2accessFlags);
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programField.u2nameIndex);
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programField.u2descriptorIndex);
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the field attributes.
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programField.u2attributesCount);
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programField.attributesAccept(programClass, this);
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod)
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the general method information.
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programMethod.u2accessFlags);
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programMethod.u2nameIndex);
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programMethod.u2descriptorIndex);
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the method attributes.
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(programMethod.u2attributesCount);
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programMethod.attributesAccept(programClass, this);
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryMember(LibraryClass libraryClass, LibraryMember libraryMember)
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ConstantVisitor.
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyConstant(Clazz clazz, Constant constant)
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the tag.
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeByte(constant.getTag());
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the actual body.
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constant.accept(clazz, constantBodyWriter);
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private class ConstantBodyWriter
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    extends       SimplifiedVisitor
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    implements    ConstantVisitor
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for ConstantVisitor.
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant)
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeInt(integerConstant.u4value);
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitLongConstant(Clazz clazz, LongConstant longConstant)
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeLong(longConstant.u8value);
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant)
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeFloat(floatConstant.f4value);
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant)
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeDouble(doubleConstant.f8value);
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitStringConstant(Clazz clazz, StringConstant stringConstant)
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(stringConstant.u2stringIndex);
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant)
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            byte[] bytes = utf8Constant.getBytes();
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(bytes.length);
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.write(bytes);
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
211b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant)
212b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
213b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            dataOutput.writeShort(invokeDynamicConstant.u2bootstrapMethodAttributeIndex);
214b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            dataOutput.writeShort(invokeDynamicConstant.u2nameAndTypeIndex);
215b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
216b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
217b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
218b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant)
219b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
220b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            dataOutput.writeByte(methodHandleConstant.u1referenceKind);
221b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            dataOutput.writeShort(methodHandleConstant.u2referenceIndex);
222b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
223b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
224b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(refConstant.u2classIndex);
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(refConstant.u2nameAndTypeIndex);
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(classConstant.u2nameIndex);
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
238b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant)
239b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
240b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            dataOutput.writeShort(methodTypeConstant.u2descriptorIndex);
241b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
242b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
243b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant)
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(nameAndTypeConstant.u2nameIndex);
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(nameAndTypeConstant.u2descriptorIndex);
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AttributeVisitor.
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyAttribute(Clazz clazz, Attribute attribute)
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the attribute name index.
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeShort(attribute.u2attributeNameIndex);
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // We'll write the attribute body into an array first, so we can
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // automatically figure out its length.
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Temporarily replace the current data output.
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        RuntimeDataOutput oldDataOutput = dataOutput;
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput = new RuntimeDataOutput(new DataOutputStream(byteArrayOutputStream));
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the attribute body into the array. Note that the
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // accept method with two dummy null arguments never throws
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // an UnsupportedOperationException.
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        attribute.accept(clazz, null, null, attributeBodyWriter);
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Restore the original data output.
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput = oldDataOutput;
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Write the attribute length and body.
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        byte[] info = byteArrayOutputStream.toByteArray();
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.writeInt(info.length);
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        dataOutput.write(info);
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private class AttributeBodyWriter
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    extends       SimplifiedVisitor
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    implements    AttributeVisitor,
286b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                  BootstrapMethodInfoVisitor,
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                  InnerClassesInfoVisitor,
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                  ExceptionInfoVisitor,
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                  StackMapFrameVisitor,
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                  VerificationTypeVisitor,
291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                  LineNumberInfoVisitor,
292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                  LocalVariableInfoVisitor,
293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                  LocalVariableTypeInfoVisitor,
294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                  AnnotationVisitor,
295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                  ElementValueVisitor
296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for AttributeVisitor.
298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute)
300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the unknown information.
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.write(unknownAttribute.info);
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
306b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute)
307b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
308b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // Write the bootstrap methods.
309b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            dataOutput.writeShort(bootstrapMethodsAttribute.u2bootstrapMethodsCount);
310b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
311b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            bootstrapMethodsAttribute.bootstrapMethodEntriesAccept(clazz, this);
312b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
313b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
314b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute)
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(sourceFileAttribute.u2sourceFileIndex);
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute)
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(sourceDirAttribute.u2sourceDirIndex);
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the inner classes.
330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(innerClassesAttribute.u2classesCount);
331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            innerClassesAttribute.innerClassEntriesAccept(clazz, this);
333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(enclosingMethodAttribute.u2classIndex);
339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(enclosingMethodAttribute.u2nameAndTypeIndex);
340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute)
344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // This attribute does not contain any additional information.
346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute)
350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // This attribute does not contain any additional information.
352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(signatureAttribute.u2signatureIndex);
358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute)
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(constantValueAttribute.u2constantValueIndex);
364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute)
368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the exceptions.
370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(exceptionsAttribute.u2exceptionIndexTableLength);
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            for (int index = 0; index < exceptionsAttribute.u2exceptionIndexTableLength; index++)
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                dataOutput.writeShort(exceptionsAttribute.u2exceptionIndexTable[index]);
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the stack size and local variable frame size.
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(codeAttribute.u2maxStack);
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(codeAttribute.u2maxLocals);
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the byte code.
386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeInt(codeAttribute.u4codeLength);
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.write(codeAttribute.code, 0, codeAttribute.u4codeLength);
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the exceptions.
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(codeAttribute.u2exceptionTableLength);
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            codeAttribute.exceptionsAccept(clazz, method, this);
394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the code attributes.
396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(codeAttribute.u2attributesCount);
397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            codeAttribute.attributesAccept(clazz, method, ProgramClassWriter.this);
399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute)
403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the stack map frames (only full frames, without tag).
405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(stackMapAttribute.u2stackMapFramesCount);
406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            stackMapAttribute.stackMapFramesAccept(clazz, method, codeAttribute, stackMapFrameBodyWriter);
408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute)
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the stack map frames.
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(stackMapTableAttribute.u2stackMapFramesCount);
415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            stackMapTableAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this);
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute)
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the line numbers.
423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(lineNumberTableAttribute.u2lineNumberTableLength);
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            lineNumberTableAttribute.lineNumbersAccept(clazz, method, codeAttribute, this);
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the local variables.
432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableTableAttribute.u2localVariableTableLength);
433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the local variable types.
441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableTypeTableAttribute.u2localVariableTypeTableLength);
442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute)
448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the annotations.
450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(annotationsAttribute.u2annotationsCount);
451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            annotationsAttribute.annotationsAccept(clazz, this);
453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute)
457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the parameter annotations.
459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeByte(parameterAnnotationsAttribute.u2parametersCount);
460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            for (int parameterIndex = 0; parameterIndex < parameterAnnotationsAttribute.u2parametersCount; parameterIndex++)
462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Write the parameter annotations of the given parameter.
464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                int          u2annotationsCount = parameterAnnotationsAttribute.u2parameterAnnotationsCount[parameterIndex];
465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                Annotation[] annotations        = parameterAnnotationsAttribute.parameterAnnotations[parameterIndex];
466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                dataOutput.writeShort(u2annotationsCount);
468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                for (int index = 0; index < u2annotationsCount; index++)
470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
471b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    visitAnnotation(clazz, annotations[index]);
472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the default element value.
481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            annotationDefaultAttribute.defaultValue.accept(clazz, null, this);
482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
485b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Implementations for BootstrapMethodInfoVisitor.
486b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
487b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo)
488b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
489b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            dataOutput.writeShort(bootstrapMethodInfo.u2methodHandleIndex);
490b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
491b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // Write the bootstrap method arguments.
492b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            dataOutput.writeShort(bootstrapMethodInfo.u2methodArgumentCount);
493b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
494b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            for (int index = 0; index < bootstrapMethodInfo.u2methodArgumentCount; index++)
495b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            {
496b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                dataOutput.writeShort(bootstrapMethodInfo.u2methodArguments[index]);
497b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
498b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
499b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
500b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for InnerClassesInfoVisitor.
502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo)
504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(innerClassesInfo.u2innerClassIndex);
506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(innerClassesInfo.u2outerClassIndex);
507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(innerClassesInfo.u2innerNameIndex);
508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(innerClassesInfo.u2innerClassAccessFlags);
509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for ExceptionInfoVisitor.
513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo)
515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(exceptionInfo.u2startPC);
517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(exceptionInfo.u2endPC);
518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(exceptionInfo.u2handlerPC);
519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(exceptionInfo.u2catchType);
520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for StackMapFrameVisitor.
524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitAnyStackMapFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrame stackMapFrame)
526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the stack map frame tag.
528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeByte(stackMapFrame.getTag());
529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the actual body.
531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            stackMapFrame.accept(clazz, method, codeAttribute, offset, stackMapFrameBodyWriter);
532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for LineNumberInfoVisitor.
536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitLineNumberInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfo lineNumberInfo)
538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(lineNumberInfo.u2startPC);
540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(lineNumberInfo.u2lineNumber);
541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for LocalVariableInfoVisitor.
545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo)
547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableInfo.u2startPC);
549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableInfo.u2length);
550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableInfo.u2nameIndex);
551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableInfo.u2descriptorIndex);
552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableInfo.u2index);
553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for LocalVariableTypeInfoVisitor.
557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo)
559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableTypeInfo.u2startPC);
561b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableTypeInfo.u2length);
562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableTypeInfo.u2nameIndex);
563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableTypeInfo.u2signatureIndex);
564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(localVariableTypeInfo.u2index);
565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for AnnotationVisitor.
569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitAnnotation(Clazz clazz, Annotation annotation)
571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the annotation type.
573b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(annotation.u2typeIndex);
574b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
575b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the element value pairs.
576b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(annotation.u2elementValuesCount);
577b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
578b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            annotation.elementValuesAccept(clazz, this);
579b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
580b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
581b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
582b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for ElementValueVisitor.
583b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
584b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue)
585b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
586b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the element name index, if applicable.
587b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            int u2elementNameIndex = elementValue.u2elementNameIndex;
588b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (u2elementNameIndex != 0)
589b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
590b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                dataOutput.writeShort(u2elementNameIndex);
591b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
592b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
593b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the tag.
594b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeByte(elementValue.getTag());
595b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
596b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the actual body.
597b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            elementValue.accept(clazz, annotation, elementValueBodyWriter);
598b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
599b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
600b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
601b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
602b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private class StackMapFrameBodyWriter
603b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    extends       SimplifiedVisitor
604b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    implements    StackMapFrameVisitor,
605b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                  VerificationTypeVisitor
606b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitSameZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameZeroFrame sameZeroFrame)
608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (sameZeroFrame.getTag() == StackMapFrame.SAME_ZERO_FRAME_EXTENDED)
610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                dataOutput.writeShort(sameZeroFrame.u2offsetDelta);
612b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
616b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame)
617b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (sameOneFrame.getTag() == StackMapFrame.SAME_ONE_FRAME_EXTENDED)
619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                dataOutput.writeShort(sameOneFrame.u2offsetDelta);
621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the verification type of the stack entry.
624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            sameOneFrame.stackItemAccept(clazz, method, codeAttribute, offset, this);
625b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
626b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitLessZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LessZeroFrame lessZeroFrame)
629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
630b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(lessZeroFrame.u2offsetDelta);
631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame)
635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(moreZeroFrame.u2offsetDelta);
637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the verification types of the additional local variables.
639b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            moreZeroFrame.additionalVariablesAccept(clazz, method, codeAttribute, offset, this);
640b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
641b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame)
644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(fullFrame.u2offsetDelta);
646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the verification types of the local variables.
648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(fullFrame.variablesCount);
649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            fullFrame.variablesAccept(clazz, method, codeAttribute, offset, this);
650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the verification types of the stack entries.
652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(fullFrame.stackCount);
653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            fullFrame.stackAccept(clazz, method, codeAttribute, offset, this);
654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
655b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for VerificationTypeVisitor.
658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType)
660b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
661b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the verification type tag.
662b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeByte(verificationType.getTag());
663b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
664b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the actual body.
665b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            verificationType.accept(clazz, method, codeAttribute, offset, verificationTypeBodyWriter);
666b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
667b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
668b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
669b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
670b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private class VerificationTypeBodyWriter
671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    extends       SimplifiedVisitor
672b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    implements    VerificationTypeVisitor
673b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
674b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for VerificationTypeVisitor.
675b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
676b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType)
677b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
678b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Most verification types don't contain any additional information.
679b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
680b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
681b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
682b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ObjectType objectType)
683b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
684b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(objectType.u2classIndex);
685b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
686b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
687b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
688b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitUninitializedType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, UninitializedType uninitializedType)
689b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
690b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(uninitializedType.u2newInstructionOffset);
691b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
692b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
693b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
694b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
695b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private class ElementValueBodyWriter
696b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    extends       SimplifiedVisitor
697b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    implements    ElementValueVisitor
698b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
699b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for ElementValueVisitor.
700b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
701b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue)
702b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
703b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(constantElementValue.u2constantValueIndex);
704b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
705b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
706b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
707b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue)
708b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
709b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(enumConstantElementValue.u2typeNameIndex);
710b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(enumConstantElementValue.u2constantNameIndex);
711b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
712b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
713b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
714b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue)
715b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
716b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(classElementValue.u2classInfoIndex);
717b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
718b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
719b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
720b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue)
721b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
722b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the annotation.
723b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            attributeBodyWriter.visitAnnotation(clazz, annotationElementValue.annotationValue);
724b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
725b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
726b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
727b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue)
728b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
729b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Write the element values.
730b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dataOutput.writeShort(arrayElementValue.u2elementValuesCount);
731b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
732b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            arrayElementValue.elementValuesAccept(clazz, annotation, attributeBodyWriter);
733b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
734b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
735b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
736