Added EmbeddingProvider for JavaScriptBody.
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());