blob: cc263a8c609e4ff73b280b38e0c6676a3a59900c [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
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. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
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).
16 *
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.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26// -*- C++ -*-
27struct entry;
28struct cpindex;
29struct unpacker;
30
31struct band {
32#ifndef PRODUCT
33 const char* name;
34#endif
35 int bn; // band_number of this band
36 coding* defc; // default coding method
37 cpindex* ix; // CP entry mapping, if CPRefBand
38 byte ixTag; // 0 or 1; null is coded as (nullOK?0:-1)
39 byte nullOK; // 0 or 1; null is coded as (nullOK?0:-1)
40 int length; // expected # values
41 unpacker* u; // back pointer
42
43 value_stream vs[2]; // source of values
44 coding_method cm; // method used for initial state of vs[0]
45 byte* rplimit; // end of band (encoded, transmitted)
46
47 int total_memo; // cached value of getIntTotal, or -1
48 int* hist0; // approximate. histogram
49 enum { HIST0_MIN = 0, HIST0_MAX = 255 }; // catches the usual cases
50
51 // properties for attribute layout elements:
52 byte le_kind; // EK_XXX
53 byte le_bci; // 0,EK_BCI,EK_BCD,EK_BCO
54 byte le_back; // ==EF_BACK
55 byte le_len; // 0,1,2,4 (size in classfile), or call addr
56 band** le_body; // body of repl, union, call (null-terminated)
57 // Note: EK_CASE elements use hist0 to record union tags.
58 #define le_casetags hist0
59
60 band& nextBand() { return this[1]; }
61 band& prevBand() { return this[-1]; }
62
63 void init(unpacker* u_, int bn_, coding* defc_) {
64 u = u_;
65 cm.u = u_;
66 bn = bn_;
67 defc = defc_;
68 }
69 void init(unpacker* u_, int bn_, int defcSpec) {
70 init(u_, bn_, coding::findBySpec(defcSpec));
71 }
72 void initRef(int ixTag_ = 0, bool nullOK_ = false) {
73 ixTag = ixTag_;
74 nullOK = nullOK_;
75 setIndexByTag(ixTag);
76 }
77
78 void expectMoreLength(int l) {
79 assert(length >= 0); // able to accept a length
80 assert((int)l >= 0); // no overflow
81 assert(rplimit == null); // readData not yet called
82 length += l;
83 assert(length >= l); // no overflow
84 }
85
86 void setIndex(cpindex* ix_);
87 void setIndexByTag(byte tag);
88
89 // Parse the band and its meta-coding header.
90 void readData(int expectedLength = 0);
91
92 // Reset the band for another pass (Cf. Java Band.resetForSecondPass.)
93 void rewind() {
94 cm.reset(&vs[0]);
95 }
96
97 byte* &curRP() { return vs[0].rp; }
98 byte* minRP() { return cm.vs0.rp; }
99 byte* maxRP() { return rplimit; }
100 size_t size() { return maxRP() - minRP(); }
101
102 int getByte() { assert(ix == null); return vs[0].getByte(); }
103 int getInt() { assert(ix == null); return vs[0].getInt(); }
104 entry* getRefN() { assert(ix != null); return getRefCommon(ix, true); }
105 entry* getRef() { assert(ix != null); return getRefCommon(ix, false); }
106 entry* getRefUsing(cpindex* ix2)
107 { assert(ix == null); return getRefCommon(ix2, true); }
108 entry* getRefCommon(cpindex* ix, bool nullOK);
109 jlong getLong(band& lo_band, bool have_hi);
110
111 static jlong makeLong(uint hi, uint lo) {
112 return ((julong)hi << 32) + (((julong)lo << 32) >> 32);
113 }
114
115 int getIntTotal();
116 int getIntCount(int tag);
117
118 static band* makeBands(unpacker* u);
119 static void initIndexes(unpacker* u);
120
121#ifndef PRODUCT
122 void dump();
123#endif
124
125 void abort(const char* msg = null); //{ u->abort(msg); }
126 bool aborting(); //{ return u->aborting(); }
127};
128
129extern band all_bands[];
130
131#define BAND_LOCAL /* \
132 band* band_temp = all_bands; \
133 band* all_bands = band_temp */
134
135// Band schema:
136enum band_number {
137 //e_archive_magic,
138 //e_archive_header,
139 //e_band_headers,
140
141 // constant pool contents
142 e_cp_Utf8_prefix,
143 e_cp_Utf8_suffix,
144 e_cp_Utf8_chars,
145 e_cp_Utf8_big_suffix,
146 e_cp_Utf8_big_chars,
147 e_cp_Int,
148 e_cp_Float,
149 e_cp_Long_hi,
150 e_cp_Long_lo,
151 e_cp_Double_hi,
152 e_cp_Double_lo,
153 e_cp_String,
154 e_cp_Class,
155 e_cp_Signature_form,
156 e_cp_Signature_classes,
157 e_cp_Descr_name,
158 e_cp_Descr_type,
159 e_cp_Field_class,
160 e_cp_Field_desc,
161 e_cp_Method_class,
162 e_cp_Method_desc,
163 e_cp_Imethod_class,
164 e_cp_Imethod_desc,
165
166 // bands which define transmission of attributes
167 e_attr_definition_headers,
168 e_attr_definition_name,
169 e_attr_definition_layout,
170
171 // band for hardwired InnerClasses attribute (shared across the package)
172 e_ic_this_class,
173 e_ic_flags,
174 // These bands contain data only where flags sets ACC_IC_LONG_FORM:
175 e_ic_outer_class,
176 e_ic_name,
177
178 // bands for carrying class schema information:
179 e_class_this,
180 e_class_super,
181 e_class_interface_count,
182 e_class_interface,
183
184 // bands for class members
185 e_class_field_count,
186 e_class_method_count,
187
188 e_field_descr,
189 e_field_flags_hi,
190 e_field_flags_lo,
191 e_field_attr_count,
192 e_field_attr_indexes,
193 e_field_attr_calls,
194 e_field_ConstantValue_KQ,
195 e_field_Signature_RS,
196 e_field_metadata_bands,
197 e_field_attr_bands,
198
199 e_method_descr,
200 e_method_flags_hi,
201 e_method_flags_lo,
202 e_method_attr_count,
203 e_method_attr_indexes,
204 e_method_attr_calls,
205 e_method_Exceptions_N,
206 e_method_Exceptions_RC,
207 e_method_Signature_RS,
208 e_method_metadata_bands,
209 e_method_attr_bands,
210
211 e_class_flags_hi,
212 e_class_flags_lo,
213 e_class_attr_count,
214 e_class_attr_indexes,
215 e_class_attr_calls,
216 e_class_SourceFile_RUN,
217 e_class_EnclosingMethod_RC,
218 e_class_EnclosingMethod_RDN,
219 e_class_Signature_RS,
220 e_class_metadata_bands,
221 e_class_InnerClasses_N,
222 e_class_InnerClasses_RC,
223 e_class_InnerClasses_F,
224 e_class_InnerClasses_outer_RCN,
225 e_class_InnerClasses_name_RUN,
226 e_class_ClassFile_version_minor_H,
227 e_class_ClassFile_version_major_H,
228 e_class_attr_bands,
229
230 e_code_headers,
231 e_code_max_stack,
232 e_code_max_na_locals,
233 e_code_handler_count,
234 e_code_handler_start_P,
235 e_code_handler_end_PO,
236 e_code_handler_catch_PO,
237 e_code_handler_class_RCN,
238
239 // code attributes
240 e_code_flags_hi,
241 e_code_flags_lo,
242 e_code_attr_count,
243 e_code_attr_indexes,
244 e_code_attr_calls,
245 e_code_StackMapTable_N,
246 e_code_StackMapTable_frame_T,
247 e_code_StackMapTable_local_N,
248 e_code_StackMapTable_stack_N,
249 e_code_StackMapTable_offset,
250 e_code_StackMapTable_T,
251 e_code_StackMapTable_RC,
252 e_code_StackMapTable_P,
253 e_code_LineNumberTable_N,
254 e_code_LineNumberTable_bci_P,
255 e_code_LineNumberTable_line,
256 e_code_LocalVariableTable_N,
257 e_code_LocalVariableTable_bci_P,
258 e_code_LocalVariableTable_span_O,
259 e_code_LocalVariableTable_name_RU,
260 e_code_LocalVariableTable_type_RS,
261 e_code_LocalVariableTable_slot,
262 e_code_LocalVariableTypeTable_N,
263 e_code_LocalVariableTypeTable_bci_P,
264 e_code_LocalVariableTypeTable_span_O,
265 e_code_LocalVariableTypeTable_name_RU,
266 e_code_LocalVariableTypeTable_type_RS,
267 e_code_LocalVariableTypeTable_slot,
268 e_code_attr_bands,
269
270 // bands for bytecodes
271 e_bc_codes,
272 // remaining bands provide typed opcode fields required by the bc_codes
273
274 e_bc_case_count,
275 e_bc_case_value,
276 e_bc_byte,
277 e_bc_short,
278 e_bc_local,
279 e_bc_label,
280
281 // ldc* operands:
282 e_bc_intref,
283 e_bc_floatref,
284 e_bc_longref,
285 e_bc_doubleref,
286 e_bc_stringref,
287 e_bc_classref,
288
289 e_bc_fieldref,
290 e_bc_methodref,
291 e_bc_imethodref,
292
293 // _self_linker_op family
294 e_bc_thisfield,
295 e_bc_superfield,
296 e_bc_thismethod,
297 e_bc_supermethod,
298
299 // bc_invokeinit family:
300 e_bc_initref,
301
302 // bytecode escape sequences
303 e_bc_escref,
304 e_bc_escrefsize,
305 e_bc_escsize,
306 e_bc_escbyte,
307
308 // file attributes and contents
309 e_file_name,
310 e_file_size_hi,
311 e_file_size_lo,
312 e_file_modtime,
313 e_file_options,
314 //e_file_bits, // handled specially as an appendix
315
316 BAND_LIMIT
317};
318
319// Symbolic names for bands, as if in a giant global struct:
320//#define archive_magic all_bands[e_archive_magic]
321//#define archive_header all_bands[e_archive_header]
322//#define band_headers all_bands[e_band_headers]
323#define cp_Utf8_prefix all_bands[e_cp_Utf8_prefix]
324#define cp_Utf8_suffix all_bands[e_cp_Utf8_suffix]
325#define cp_Utf8_chars all_bands[e_cp_Utf8_chars]
326#define cp_Utf8_big_suffix all_bands[e_cp_Utf8_big_suffix]
327#define cp_Utf8_big_chars all_bands[e_cp_Utf8_big_chars]
328#define cp_Int all_bands[e_cp_Int]
329#define cp_Float all_bands[e_cp_Float]
330#define cp_Long_hi all_bands[e_cp_Long_hi]
331#define cp_Long_lo all_bands[e_cp_Long_lo]
332#define cp_Double_hi all_bands[e_cp_Double_hi]
333#define cp_Double_lo all_bands[e_cp_Double_lo]
334#define cp_String all_bands[e_cp_String]
335#define cp_Class all_bands[e_cp_Class]
336#define cp_Signature_form all_bands[e_cp_Signature_form]
337#define cp_Signature_classes all_bands[e_cp_Signature_classes]
338#define cp_Descr_name all_bands[e_cp_Descr_name]
339#define cp_Descr_type all_bands[e_cp_Descr_type]
340#define cp_Field_class all_bands[e_cp_Field_class]
341#define cp_Field_desc all_bands[e_cp_Field_desc]
342#define cp_Method_class all_bands[e_cp_Method_class]
343#define cp_Method_desc all_bands[e_cp_Method_desc]
344#define cp_Imethod_class all_bands[e_cp_Imethod_class]
345#define cp_Imethod_desc all_bands[e_cp_Imethod_desc]
346#define attr_definition_headers all_bands[e_attr_definition_headers]
347#define attr_definition_name all_bands[e_attr_definition_name]
348#define attr_definition_layout all_bands[e_attr_definition_layout]
349#define ic_this_class all_bands[e_ic_this_class]
350#define ic_flags all_bands[e_ic_flags]
351#define ic_outer_class all_bands[e_ic_outer_class]
352#define ic_name all_bands[e_ic_name]
353#define class_this all_bands[e_class_this]
354#define class_super all_bands[e_class_super]
355#define class_interface_count all_bands[e_class_interface_count]
356#define class_interface all_bands[e_class_interface]
357#define class_field_count all_bands[e_class_field_count]
358#define class_method_count all_bands[e_class_method_count]
359#define field_descr all_bands[e_field_descr]
360#define field_flags_hi all_bands[e_field_flags_hi]
361#define field_flags_lo all_bands[e_field_flags_lo]
362#define field_attr_count all_bands[e_field_attr_count]
363#define field_attr_indexes all_bands[e_field_attr_indexes]
364#define field_ConstantValue_KQ all_bands[e_field_ConstantValue_KQ]
365#define field_Signature_RS all_bands[e_field_Signature_RS]
366#define field_attr_bands all_bands[e_field_attr_bands]
367#define method_descr all_bands[e_method_descr]
368#define method_flags_hi all_bands[e_method_flags_hi]
369#define method_flags_lo all_bands[e_method_flags_lo]
370#define method_attr_count all_bands[e_method_attr_count]
371#define method_attr_indexes all_bands[e_method_attr_indexes]
372#define method_Exceptions_N all_bands[e_method_Exceptions_N]
373#define method_Exceptions_RC all_bands[e_method_Exceptions_RC]
374#define method_Signature_RS all_bands[e_method_Signature_RS]
375#define method_attr_bands all_bands[e_method_attr_bands]
376#define class_flags_hi all_bands[e_class_flags_hi]
377#define class_flags_lo all_bands[e_class_flags_lo]
378#define class_attr_count all_bands[e_class_attr_count]
379#define class_attr_indexes all_bands[e_class_attr_indexes]
380#define class_SourceFile_RUN all_bands[e_class_SourceFile_RUN]
381#define class_EnclosingMethod_RC all_bands[e_class_EnclosingMethod_RC]
382#define class_EnclosingMethod_RDN all_bands[e_class_EnclosingMethod_RDN]
383#define class_Signature_RS all_bands[e_class_Signature_RS]
384#define class_InnerClasses_N all_bands[e_class_InnerClasses_N]
385#define class_InnerClasses_RC all_bands[e_class_InnerClasses_RC]
386#define class_InnerClasses_F all_bands[e_class_InnerClasses_F]
387#define class_InnerClasses_outer_RCN all_bands[e_class_InnerClasses_outer_RCN]
388#define class_InnerClasses_name_RUN all_bands[e_class_InnerClasses_name_RUN]
389#define class_ClassFile_version_minor_H all_bands[e_class_ClassFile_version_minor_H]
390#define class_ClassFile_version_major_H all_bands[e_class_ClassFile_version_major_H]
391#define class_attr_bands all_bands[e_class_attr_bands]
392#define code_headers all_bands[e_code_headers]
393#define code_max_stack all_bands[e_code_max_stack]
394#define code_max_na_locals all_bands[e_code_max_na_locals]
395#define code_handler_count all_bands[e_code_handler_count]
396#define code_handler_start_P all_bands[e_code_handler_start_P]
397#define code_handler_end_PO all_bands[e_code_handler_end_PO]
398#define code_handler_catch_PO all_bands[e_code_handler_catch_PO]
399#define code_handler_class_RCN all_bands[e_code_handler_class_RCN]
400#define code_flags_hi all_bands[e_code_flags_hi]
401#define code_flags_lo all_bands[e_code_flags_lo]
402#define code_attr_count all_bands[e_code_attr_count]
403#define code_attr_indexes all_bands[e_code_attr_indexes]
404#define code_StackMapTable_N all_bands[e_code_StackMapTable_N]
405#define code_StackMapTable_frame_T all_bands[e_code_StackMapTable_frame_T]
406#define code_StackMapTable_local_N all_bands[e_code_StackMapTable_local_N]
407#define code_StackMapTable_stack_N all_bands[e_code_StackMapTable_stack_N]
408#define code_StackMapTable_offset all_bands[e_code_StackMapTable_offset]
409#define code_StackMapTable_T all_bands[e_code_StackMapTable_T]
410#define code_StackMapTable_RC all_bands[e_code_StackMapTable_RC]
411#define code_StackMapTable_P all_bands[e_code_StackMapTable_P]
412#define code_LineNumberTable_N all_bands[e_code_LineNumberTable_N]
413#define code_LineNumberTable_bci_P all_bands[e_code_LineNumberTable_bci_P]
414#define code_LineNumberTable_line all_bands[e_code_LineNumberTable_line]
415#define code_LocalVariableTable_N all_bands[e_code_LocalVariableTable_N]
416#define code_LocalVariableTable_bci_P all_bands[e_code_LocalVariableTable_bci_P]
417#define code_LocalVariableTable_span_O all_bands[e_code_LocalVariableTable_span_O]
418#define code_LocalVariableTable_name_RU all_bands[e_code_LocalVariableTable_name_RU]
419#define code_LocalVariableTable_type_RS all_bands[e_code_LocalVariableTable_type_RS]
420#define code_LocalVariableTable_slot all_bands[e_code_LocalVariableTable_slot]
421#define code_LocalVariableTypeTable_N all_bands[e_code_LocalVariableTypeTable_N]
422#define code_LocalVariableTypeTable_bci_P all_bands[e_code_LocalVariableTypeTable_bci_P]
423#define code_LocalVariableTypeTable_span_O all_bands[e_code_LocalVariableTypeTable_span_O]
424#define code_LocalVariableTypeTable_name_RU all_bands[e_code_LocalVariableTypeTable_name_RU]
425#define code_LocalVariableTypeTable_type_RS all_bands[e_code_LocalVariableTypeTable_type_RS]
426#define code_LocalVariableTypeTable_slot all_bands[e_code_LocalVariableTypeTable_slot]
427#define code_attr_bands all_bands[e_code_attr_bands]
428#define bc_codes all_bands[e_bc_codes]
429#define bc_case_count all_bands[e_bc_case_count]
430#define bc_case_value all_bands[e_bc_case_value]
431#define bc_byte all_bands[e_bc_byte]
432#define bc_short all_bands[e_bc_short]
433#define bc_local all_bands[e_bc_local]
434#define bc_label all_bands[e_bc_label]
435#define bc_intref all_bands[e_bc_intref]
436#define bc_floatref all_bands[e_bc_floatref]
437#define bc_longref all_bands[e_bc_longref]
438#define bc_doubleref all_bands[e_bc_doubleref]
439#define bc_stringref all_bands[e_bc_stringref]
440#define bc_classref all_bands[e_bc_classref]
441#define bc_fieldref all_bands[e_bc_fieldref]
442#define bc_methodref all_bands[e_bc_methodref]
443#define bc_imethodref all_bands[e_bc_imethodref]
444#define bc_thisfield all_bands[e_bc_thisfield]
445#define bc_superfield all_bands[e_bc_superfield]
446#define bc_thismethod all_bands[e_bc_thismethod]
447#define bc_supermethod all_bands[e_bc_supermethod]
448#define bc_initref all_bands[e_bc_initref]
449#define bc_escref all_bands[e_bc_escref]
450#define bc_escrefsize all_bands[e_bc_escrefsize]
451#define bc_escsize all_bands[e_bc_escsize]
452#define bc_escbyte all_bands[e_bc_escbyte]
453#define file_name all_bands[e_file_name]
454#define file_size_hi all_bands[e_file_size_hi]
455#define file_size_lo all_bands[e_file_size_lo]
456#define file_modtime all_bands[e_file_modtime]
457#define file_options all_bands[e_file_options]