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