Rebasing the Inflater support on jzlib which, unlike GNU ClassPath, has correct implementation of Huffman code. Making the implementation more easily testable by turning Inflater and ZipInputStream into pure delegates. Current implementation is going to need proper long support.
2 * Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
26 package org.apidesign.javap;
29 import java.io.DataInputStream;
30 import java.io.IOException;
31 import static org.apidesign.javap.RuntimeConstants.*;
34 * Strores method data informastion.
36 * @author Sucheta Dambalkar (Adopted code from jdis)
38 public class MethodData {
46 Vector exception_table = new Vector(0);
47 Vector lin_num_tb = new Vector(0);
48 Vector loc_var_tb = new Vector(0);
49 StackMapTableData[] stackMapTable;
50 StackMapData[] stackMap;
51 int[] exc_index_table=null;
52 Vector attrs=new Vector(0);
53 Vector code_attrs=new Vector(0);
54 int max_stack, max_locals;
55 boolean isSynthetic=false;
56 boolean isDeprecated=false;
58 public MethodData(ClassData cls){
65 public void read(DataInputStream in) throws IOException {
66 access = in.readUnsignedShort();
67 name_index=in.readUnsignedShort();
68 descriptor_index =in.readUnsignedShort();
69 int attributes_count = in.readUnsignedShort();
70 for (int i = 0; i < attributes_count; i++) {
71 int attr_name_index=in.readUnsignedShort();
74 if (cls.getTag(attr_name_index)==CONSTANT_UTF8) {
75 String attr_name=cls.getString(attr_name_index);
76 if ( attr_name.equals("Code")){
78 AttrData attr=new AttrData(cls);
79 attr.read(attr_name_index);
80 attrs.addElement(attr);
82 } else if ( attr_name.equals("Exceptions")){
84 AttrData attr=new AttrData(cls);
85 attr.read(attr_name_index);
86 attrs.addElement(attr);
88 } else if (attr_name.equals("Synthetic")){
90 throw new ClassFormatError("invalid Synthetic attr length");
92 AttrData attr=new AttrData(cls);
93 attr.read(attr_name_index);
94 attrs.addElement(attr);
96 } else if (attr_name.equals("Deprecated")){
98 throw new ClassFormatError("invalid Synthetic attr length");
100 AttrData attr=new AttrData(cls);
101 attr.read(attr_name_index);
102 attrs.addElement(attr);
106 AttrData attr=new AttrData(cls);
107 attr.read(attr_name_index, in);
108 attrs.addElement(attr);
114 * Read code attribute info.
116 public void readCode(DataInputStream in) throws IOException {
118 int attr_length = in.readInt();
119 max_stack=in.readUnsignedShort();
120 max_locals=in.readUnsignedShort();
121 int codelen=in.readInt();
123 code=new byte[codelen];
125 while(totalread < codelen){
126 totalread += in.read(code, totalread, codelen-totalread);
128 // in.read(code, 0, codelen);
130 readExceptionTable(in);
131 int code_attributes_count = in.readUnsignedShort();
133 for (int k = 0 ; k < code_attributes_count ; k++) {
134 int table_name_index=in.readUnsignedShort();
135 int table_name_tag=cls.getTag(table_name_index);
136 AttrData attr=new AttrData(cls);
137 if (table_name_tag==CONSTANT_UTF8) {
138 String table_name_tstr=cls.getString(table_name_index);
139 if (table_name_tstr.equals("LineNumberTable")) {
140 readLineNumTable(in);
141 attr.read(table_name_index);
142 } else if (table_name_tstr.equals("LocalVariableTable")) {
144 attr.read(table_name_index);
145 } else if (table_name_tstr.equals("StackMapTable")) {
146 readStackMapTable(in);
147 attr.read(table_name_index);
148 } else if (table_name_tstr.equals("StackMap")) {
150 attr.read(table_name_index);
152 attr.read(table_name_index, in);
154 code_attrs.addElement(attr);
158 attr.read(table_name_index, in);
159 code_attrs.addElement(attr);
164 * Read exception table info.
166 void readExceptionTable (DataInputStream in) throws IOException {
167 int exception_table_len=in.readUnsignedShort();
168 exception_table=new Vector(exception_table_len);
169 for (int l = 0; l < exception_table_len; l++) {
170 exception_table.addElement(new TrapData(in, l));
175 * Read LineNumberTable attribute info.
177 void readLineNumTable (DataInputStream in) throws IOException {
178 int attr_len = in.readInt(); // attr_length
179 int lin_num_tb_len = in.readUnsignedShort();
180 lin_num_tb=new Vector(lin_num_tb_len);
181 for (int l = 0; l < lin_num_tb_len; l++) {
182 lin_num_tb.addElement(new LineNumData(in));
187 * Read LocalVariableTable attribute info.
189 void readLocVarTable (DataInputStream in) throws IOException {
190 int attr_len=in.readInt(); // attr_length
191 int loc_var_tb_len = in.readUnsignedShort();
192 loc_var_tb = new Vector(loc_var_tb_len);
193 for (int l = 0; l < loc_var_tb_len; l++) {
194 loc_var_tb.addElement(new LocVarData(in));
199 * Read Exception attribute info.
201 public void readExceptions(DataInputStream in) throws IOException {
202 int attr_len=in.readInt(); // attr_length in prog
203 int num_exceptions = in.readUnsignedShort();
204 exc_index_table=new int[num_exceptions];
205 for (int l = 0; l < num_exceptions; l++) {
206 int exc=in.readShort();
207 exc_index_table[l]=exc;
212 * Read StackMapTable attribute info.
214 void readStackMapTable(DataInputStream in) throws IOException {
215 int attr_len = in.readInt(); //attr_length
216 int stack_map_tb_len = in.readUnsignedShort();
217 stackMapTable = new StackMapTableData[stack_map_tb_len];
218 for (int i=0; i<stack_map_tb_len; i++) {
219 stackMapTable[i] = StackMapTableData.getInstance(in, this);
224 * Read StackMap attribute info.
226 void readStackMap(DataInputStream in) throws IOException {
227 int attr_len = in.readInt(); //attr_length
228 int stack_map_len = in.readUnsignedShort();
229 stackMap = new StackMapData[stack_map_len];
230 for (int i = 0; i<stack_map_len; i++) {
231 stackMap[i] = new StackMapData(in, this);
236 * Return access of the method.
238 public int getAccess(){
243 * Return name of the method.
245 public String getName(){
246 return cls.getStringValue(name_index);
250 * Return internal siganature of the method.
252 public String getInternalSig(){
253 return cls.getStringValue(descriptor_index);
257 * Return code attribute data of a method.
259 public byte[] getCode(){
264 * Return LineNumberTable size.
266 public int getnumlines(){
267 return lin_num_tb.size();
271 * Return LineNumberTable
273 public Vector getlin_num_tb(){
278 * Return LocalVariableTable size.
280 public int getloc_var_tbsize(){
281 return loc_var_tb.size();
286 * Return LocalVariableTable.
288 public Vector getloc_var_tb(){
295 public StackMapData[] getStackMap() {
300 * Return StackMapTable.
302 public StackMapTableData[] getStackMapTable() {
303 return stackMapTable;
306 public StackMapIterator createStackMapIterator() {
307 return new StackMapIterator(this);
311 * Return true if method is static
313 public boolean isStatic(){
314 if ((access & ACC_STATIC) !=0) return true;
320 * Return max depth of operand stack.
322 public int getMaxStack(){
328 * Return number of local variables.
330 public int getMaxLocals(){
336 * Return exception index table in Exception attribute.
338 public int []get_exc_index_table(){
339 return exc_index_table;
344 * Return exception table in code attributre.
346 public TrapDataIterator getTrapDataIterator(){
347 return new TrapDataIterator(exception_table);
352 * Return method attributes.
354 public Vector getAttributes(){
360 * Return code attributes.
362 public Vector getCodeAttributes(){
368 * Return true if method id synthetic.
370 public boolean isSynthetic(){
376 * Return true if method is deprecated.
378 public boolean isDeprecated(){
382 public byte[] findAnnotationData(boolean classRetention) {
383 String n = classRetention ?
384 "RuntimeInvisibleAnnotations" : // NOI18N
385 "RuntimeVisibleAnnotations"; // NOI18N
386 AttrData[] arr = new AttrData[attrs.size()];
388 return ClassData.findAttr(n, arr);
391 public boolean isConstructor() {
392 return "<init>".equals(getName());