/* * Copyright 1994-2003 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package sun.tools.java; import java.io.IOException; import java.io.DataInputStream; import java.io.DataOutputStream; /** * This class is used to represent an attribute from a binary class. * This class should go away once arrays are objects. * * WARNING: The contents of this source file are not part of any * supported API. Code that depends on them does so at its own risk: * they are subject to change or removal without notice. */ public final class BinaryAttribute implements Constants { Identifier name; byte data[]; BinaryAttribute next; /** * Constructor */ BinaryAttribute(Identifier name, byte data[], BinaryAttribute next) { this.name = name; this.data = data; this.next = next; } /** * Load a list of attributes */ public static BinaryAttribute load(DataInputStream in, BinaryConstantPool cpool, int mask) throws IOException { BinaryAttribute atts = null; int natt = in.readUnsignedShort(); // JVM 4.6 method_info.attrutes_count for (int i = 0 ; i < natt ; i++) { // id from JVM 4.7 attribute_info.attribute_name_index Identifier id = cpool.getIdentifier(in.readUnsignedShort()); // id from JVM 4.7 attribute_info.attribute_length int len = in.readInt(); if (id.equals(idCode) && ((mask & ATT_CODE) == 0)) { in.skipBytes(len); } else { byte data[] = new byte[len]; in.readFully(data); atts = new BinaryAttribute(id, data, atts); } } return atts; } // write out the Binary attributes to the given stream // (note that attributes may be null) static void write(BinaryAttribute attributes, DataOutputStream out, BinaryConstantPool cpool, Environment env) throws IOException { // count the number of attributes int attributeCount = 0; for (BinaryAttribute att = attributes; att != null; att = att.next) attributeCount++; out.writeShort(attributeCount); // write out each attribute for (BinaryAttribute att = attributes; att != null; att = att.next) { Identifier name = att.name; byte data[] = att.data; // write the identifier out.writeShort(cpool.indexString(name.toString(), env)); // write the length out.writeInt(data.length); // write the data out.write(data, 0, data.length); } } /** * Accessors */ public Identifier getName() { return name; } public byte getData()[] { return data; } public BinaryAttribute getNextAttribute() { return next; } }