/* |
|
* Copyright (c) 1994, 2003, Oracle and/or its affiliates. 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. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.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; } |
|
} |