changeset 15935 | 50da9e5eb858 |
parent 15932 | a27c3d066552 |
child 16617 | 6235d2c7549f |
child 16445 | cb44d5b3ad89 |
15934:104ff83451f1 | 15935:50da9e5eb858 |
---|---|
88 #define JAVA_7_VERSION 51 |
88 #define JAVA_7_VERSION 51 |
89 |
89 |
90 // Extension method support. |
90 // Extension method support. |
91 #define JAVA_8_VERSION 52 |
91 #define JAVA_8_VERSION 52 |
92 |
92 |
93 |
93 void ClassFileParser::parse_constant_pool_entries(int length, TRAPS) { |
94 void ClassFileParser::parse_constant_pool_entries(ClassLoaderData* loader_data, constantPoolHandle cp, int length, TRAPS) { |
|
95 // Use a local copy of ClassFileStream. It helps the C++ compiler to optimize |
94 // Use a local copy of ClassFileStream. It helps the C++ compiler to optimize |
96 // this function (_current can be allocated in a register, with scalar |
95 // this function (_current can be allocated in a register, with scalar |
97 // replacement of aggregates). The _current pointer is copied back to |
96 // replacement of aggregates). The _current pointer is copied back to |
98 // stream() when this function returns. DON'T call another method within |
97 // stream() when this function returns. DON'T call another method within |
99 // this method that uses stream(). |
98 // this method that uses stream(). |
102 ClassFileStream* cfs = &cfs1; |
101 ClassFileStream* cfs = &cfs1; |
103 #ifdef ASSERT |
102 #ifdef ASSERT |
104 assert(cfs->allocated_on_stack(),"should be local"); |
103 assert(cfs->allocated_on_stack(),"should be local"); |
105 u1* old_current = cfs0->current(); |
104 u1* old_current = cfs0->current(); |
106 #endif |
105 #endif |
107 Handle class_loader(THREAD, loader_data->class_loader()); |
106 Handle class_loader(THREAD, _loader_data->class_loader()); |
108 |
107 |
109 // Used for batching symbol allocations. |
108 // Used for batching symbol allocations. |
110 const char* names[SymbolTable::symbol_alloc_batch_size]; |
109 const char* names[SymbolTable::symbol_alloc_batch_size]; |
111 int lengths[SymbolTable::symbol_alloc_batch_size]; |
110 int lengths[SymbolTable::symbol_alloc_batch_size]; |
112 int indices[SymbolTable::symbol_alloc_batch_size]; |
111 int indices[SymbolTable::symbol_alloc_batch_size]; |
122 switch (tag) { |
121 switch (tag) { |
123 case JVM_CONSTANT_Class : |
122 case JVM_CONSTANT_Class : |
124 { |
123 { |
125 cfs->guarantee_more(3, CHECK); // name_index, tag/access_flags |
124 cfs->guarantee_more(3, CHECK); // name_index, tag/access_flags |
126 u2 name_index = cfs->get_u2_fast(); |
125 u2 name_index = cfs->get_u2_fast(); |
127 cp->klass_index_at_put(index, name_index); |
126 _cp->klass_index_at_put(index, name_index); |
128 } |
127 } |
129 break; |
128 break; |
130 case JVM_CONSTANT_Fieldref : |
129 case JVM_CONSTANT_Fieldref : |
131 { |
130 { |
132 cfs->guarantee_more(5, CHECK); // class_index, name_and_type_index, tag/access_flags |
131 cfs->guarantee_more(5, CHECK); // class_index, name_and_type_index, tag/access_flags |
133 u2 class_index = cfs->get_u2_fast(); |
132 u2 class_index = cfs->get_u2_fast(); |
134 u2 name_and_type_index = cfs->get_u2_fast(); |
133 u2 name_and_type_index = cfs->get_u2_fast(); |
135 cp->field_at_put(index, class_index, name_and_type_index); |
134 _cp->field_at_put(index, class_index, name_and_type_index); |
136 } |
135 } |
137 break; |
136 break; |
138 case JVM_CONSTANT_Methodref : |
137 case JVM_CONSTANT_Methodref : |
139 { |
138 { |
140 cfs->guarantee_more(5, CHECK); // class_index, name_and_type_index, tag/access_flags |
139 cfs->guarantee_more(5, CHECK); // class_index, name_and_type_index, tag/access_flags |
141 u2 class_index = cfs->get_u2_fast(); |
140 u2 class_index = cfs->get_u2_fast(); |
142 u2 name_and_type_index = cfs->get_u2_fast(); |
141 u2 name_and_type_index = cfs->get_u2_fast(); |
143 cp->method_at_put(index, class_index, name_and_type_index); |
142 _cp->method_at_put(index, class_index, name_and_type_index); |
144 } |
143 } |
145 break; |
144 break; |
146 case JVM_CONSTANT_InterfaceMethodref : |
145 case JVM_CONSTANT_InterfaceMethodref : |
147 { |
146 { |
148 cfs->guarantee_more(5, CHECK); // class_index, name_and_type_index, tag/access_flags |
147 cfs->guarantee_more(5, CHECK); // class_index, name_and_type_index, tag/access_flags |
149 u2 class_index = cfs->get_u2_fast(); |
148 u2 class_index = cfs->get_u2_fast(); |
150 u2 name_and_type_index = cfs->get_u2_fast(); |
149 u2 name_and_type_index = cfs->get_u2_fast(); |
151 cp->interface_method_at_put(index, class_index, name_and_type_index); |
150 _cp->interface_method_at_put(index, class_index, name_and_type_index); |
152 } |
151 } |
153 break; |
152 break; |
154 case JVM_CONSTANT_String : |
153 case JVM_CONSTANT_String : |
155 { |
154 { |
156 cfs->guarantee_more(3, CHECK); // string_index, tag/access_flags |
155 cfs->guarantee_more(3, CHECK); // string_index, tag/access_flags |
157 u2 string_index = cfs->get_u2_fast(); |
156 u2 string_index = cfs->get_u2_fast(); |
158 cp->string_index_at_put(index, string_index); |
157 _cp->string_index_at_put(index, string_index); |
159 } |
158 } |
160 break; |
159 break; |
161 case JVM_CONSTANT_MethodHandle : |
160 case JVM_CONSTANT_MethodHandle : |
162 case JVM_CONSTANT_MethodType : |
161 case JVM_CONSTANT_MethodType : |
163 if (_major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { |
162 if (_major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { |
172 } |
171 } |
173 if (tag == JVM_CONSTANT_MethodHandle) { |
172 if (tag == JVM_CONSTANT_MethodHandle) { |
174 cfs->guarantee_more(4, CHECK); // ref_kind, method_index, tag/access_flags |
173 cfs->guarantee_more(4, CHECK); // ref_kind, method_index, tag/access_flags |
175 u1 ref_kind = cfs->get_u1_fast(); |
174 u1 ref_kind = cfs->get_u1_fast(); |
176 u2 method_index = cfs->get_u2_fast(); |
175 u2 method_index = cfs->get_u2_fast(); |
177 cp->method_handle_index_at_put(index, ref_kind, method_index); |
176 _cp->method_handle_index_at_put(index, ref_kind, method_index); |
178 } else if (tag == JVM_CONSTANT_MethodType) { |
177 } else if (tag == JVM_CONSTANT_MethodType) { |
179 cfs->guarantee_more(3, CHECK); // signature_index, tag/access_flags |
178 cfs->guarantee_more(3, CHECK); // signature_index, tag/access_flags |
180 u2 signature_index = cfs->get_u2_fast(); |
179 u2 signature_index = cfs->get_u2_fast(); |
181 cp->method_type_index_at_put(index, signature_index); |
180 _cp->method_type_index_at_put(index, signature_index); |
182 } else { |
181 } else { |
183 ShouldNotReachHere(); |
182 ShouldNotReachHere(); |
184 } |
183 } |
185 break; |
184 break; |
186 case JVM_CONSTANT_InvokeDynamic : |
185 case JVM_CONSTANT_InvokeDynamic : |
198 cfs->guarantee_more(5, CHECK); // bsm_index, nt, tag/access_flags |
197 cfs->guarantee_more(5, CHECK); // bsm_index, nt, tag/access_flags |
199 u2 bootstrap_specifier_index = cfs->get_u2_fast(); |
198 u2 bootstrap_specifier_index = cfs->get_u2_fast(); |
200 u2 name_and_type_index = cfs->get_u2_fast(); |
199 u2 name_and_type_index = cfs->get_u2_fast(); |
201 if (_max_bootstrap_specifier_index < (int) bootstrap_specifier_index) |
200 if (_max_bootstrap_specifier_index < (int) bootstrap_specifier_index) |
202 _max_bootstrap_specifier_index = (int) bootstrap_specifier_index; // collect for later |
201 _max_bootstrap_specifier_index = (int) bootstrap_specifier_index; // collect for later |
203 cp->invoke_dynamic_at_put(index, bootstrap_specifier_index, name_and_type_index); |
202 _cp->invoke_dynamic_at_put(index, bootstrap_specifier_index, name_and_type_index); |
204 } |
203 } |
205 break; |
204 break; |
206 case JVM_CONSTANT_Integer : |
205 case JVM_CONSTANT_Integer : |
207 { |
206 { |
208 cfs->guarantee_more(5, CHECK); // bytes, tag/access_flags |
207 cfs->guarantee_more(5, CHECK); // bytes, tag/access_flags |
209 u4 bytes = cfs->get_u4_fast(); |
208 u4 bytes = cfs->get_u4_fast(); |
210 cp->int_at_put(index, (jint) bytes); |
209 _cp->int_at_put(index, (jint) bytes); |
211 } |
210 } |
212 break; |
211 break; |
213 case JVM_CONSTANT_Float : |
212 case JVM_CONSTANT_Float : |
214 { |
213 { |
215 cfs->guarantee_more(5, CHECK); // bytes, tag/access_flags |
214 cfs->guarantee_more(5, CHECK); // bytes, tag/access_flags |
216 u4 bytes = cfs->get_u4_fast(); |
215 u4 bytes = cfs->get_u4_fast(); |
217 cp->float_at_put(index, *(jfloat*)&bytes); |
216 _cp->float_at_put(index, *(jfloat*)&bytes); |
218 } |
217 } |
219 break; |
218 break; |
220 case JVM_CONSTANT_Long : |
219 case JVM_CONSTANT_Long : |
221 // A mangled type might cause you to overrun allocated memory |
220 // A mangled type might cause you to overrun allocated memory |
222 guarantee_property(index+1 < length, |
221 guarantee_property(index+1 < length, |
223 "Invalid constant pool entry %u in class file %s", |
222 "Invalid constant pool entry %u in class file %s", |
224 index, CHECK); |
223 index, CHECK); |
225 { |
224 { |
226 cfs->guarantee_more(9, CHECK); // bytes, tag/access_flags |
225 cfs->guarantee_more(9, CHECK); // bytes, tag/access_flags |
227 u8 bytes = cfs->get_u8_fast(); |
226 u8 bytes = cfs->get_u8_fast(); |
228 cp->long_at_put(index, bytes); |
227 _cp->long_at_put(index, bytes); |
229 } |
228 } |
230 index++; // Skip entry following eigth-byte constant, see JVM book p. 98 |
229 index++; // Skip entry following eigth-byte constant, see JVM book p. 98 |
231 break; |
230 break; |
232 case JVM_CONSTANT_Double : |
231 case JVM_CONSTANT_Double : |
233 // A mangled type might cause you to overrun allocated memory |
232 // A mangled type might cause you to overrun allocated memory |
235 "Invalid constant pool entry %u in class file %s", |
234 "Invalid constant pool entry %u in class file %s", |
236 index, CHECK); |
235 index, CHECK); |
237 { |
236 { |
238 cfs->guarantee_more(9, CHECK); // bytes, tag/access_flags |
237 cfs->guarantee_more(9, CHECK); // bytes, tag/access_flags |
239 u8 bytes = cfs->get_u8_fast(); |
238 u8 bytes = cfs->get_u8_fast(); |
240 cp->double_at_put(index, *(jdouble*)&bytes); |
239 _cp->double_at_put(index, *(jdouble*)&bytes); |
241 } |
240 } |
242 index++; // Skip entry following eigth-byte constant, see JVM book p. 98 |
241 index++; // Skip entry following eigth-byte constant, see JVM book p. 98 |
243 break; |
242 break; |
244 case JVM_CONSTANT_NameAndType : |
243 case JVM_CONSTANT_NameAndType : |
245 { |
244 { |
246 cfs->guarantee_more(5, CHECK); // name_index, signature_index, tag/access_flags |
245 cfs->guarantee_more(5, CHECK); // name_index, signature_index, tag/access_flags |
247 u2 name_index = cfs->get_u2_fast(); |
246 u2 name_index = cfs->get_u2_fast(); |
248 u2 signature_index = cfs->get_u2_fast(); |
247 u2 signature_index = cfs->get_u2_fast(); |
249 cp->name_and_type_at_put(index, name_index, signature_index); |
248 _cp->name_and_type_at_put(index, name_index, signature_index); |
250 } |
249 } |
251 break; |
250 break; |
252 case JVM_CONSTANT_Utf8 : |
251 case JVM_CONSTANT_Utf8 : |
253 { |
252 { |
254 cfs->guarantee_more(2, CHECK); // utf8_length |
253 cfs->guarantee_more(2, CHECK); // utf8_length |
281 names[names_count] = (char*)utf8_buffer; |
280 names[names_count] = (char*)utf8_buffer; |
282 lengths[names_count] = utf8_length; |
281 lengths[names_count] = utf8_length; |
283 indices[names_count] = index; |
282 indices[names_count] = index; |
284 hashValues[names_count++] = hash; |
283 hashValues[names_count++] = hash; |
285 if (names_count == SymbolTable::symbol_alloc_batch_size) { |
284 if (names_count == SymbolTable::symbol_alloc_batch_size) { |
286 SymbolTable::new_symbols(loader_data, cp, names_count, names, lengths, indices, hashValues, CHECK); |
285 SymbolTable::new_symbols(_loader_data, _cp, names_count, names, lengths, indices, hashValues, CHECK); |
287 names_count = 0; |
286 names_count = 0; |
288 } |
287 } |
289 } else { |
288 } else { |
290 cp->symbol_at_put(index, result); |
289 _cp->symbol_at_put(index, result); |
291 } |
290 } |
292 } |
291 } |
293 break; |
292 break; |
294 default: |
293 default: |
295 classfile_parse_error( |
294 classfile_parse_error( |
298 } |
297 } |
299 } |
298 } |
300 |
299 |
301 // Allocate the remaining symbols |
300 // Allocate the remaining symbols |
302 if (names_count > 0) { |
301 if (names_count > 0) { |
303 SymbolTable::new_symbols(loader_data, cp, names_count, names, lengths, indices, hashValues, CHECK); |
302 SymbolTable::new_symbols(_loader_data, _cp, names_count, names, lengths, indices, hashValues, CHECK); |
304 } |
303 } |
305 |
304 |
306 // Copy _current pointer of local copy back to stream(). |
305 // Copy _current pointer of local copy back to stream(). |
307 #ifdef ASSERT |
306 #ifdef ASSERT |
308 assert(cfs0->current() == old_current, "non-exclusive use of stream()"); |
307 assert(cfs0->current() == old_current, "non-exclusive use of stream()"); |
309 #endif |
308 #endif |
310 cfs0->set_current(cfs1.current()); |
309 cfs0->set_current(cfs1.current()); |
311 } |
310 } |
312 |
311 |
313 // This class unreferences constant pool symbols if an error has occurred |
|
314 // while parsing the class before it is assigned into the class. |
|
315 // If it gets an error after that it is unloaded and the constant pool will |
|
316 // be cleaned up then. |
|
317 class ConstantPoolCleaner : public StackObj { |
|
318 constantPoolHandle _cphandle; |
|
319 bool _in_error; |
|
320 public: |
|
321 ConstantPoolCleaner(constantPoolHandle cp) : _cphandle(cp), _in_error(true) {} |
|
322 ~ConstantPoolCleaner() { |
|
323 if (_in_error && _cphandle.not_null()) { |
|
324 _cphandle->unreference_symbols(); |
|
325 } |
|
326 } |
|
327 void set_in_error(bool clean) { _in_error = clean; } |
|
328 }; |
|
329 |
|
330 bool inline valid_cp_range(int index, int length) { return (index > 0 && index < length); } |
312 bool inline valid_cp_range(int index, int length) { return (index > 0 && index < length); } |
331 |
313 |
332 inline Symbol* check_symbol_at(constantPoolHandle cp, int index) { |
314 inline Symbol* check_symbol_at(constantPoolHandle cp, int index) { |
333 if (valid_cp_range(index, cp->length()) && cp->tag_at(index).is_utf8()) |
315 if (valid_cp_range(index, cp->length()) && cp->tag_at(index).is_utf8()) |
334 return cp->symbol_at(index); |
316 return cp->symbol_at(index); |
335 else |
317 else |
336 return NULL; |
318 return NULL; |
337 } |
319 } |
338 |
320 |
339 constantPoolHandle ClassFileParser::parse_constant_pool(ClassLoaderData* loader_data, TRAPS) { |
321 constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) { |
340 ClassFileStream* cfs = stream(); |
322 ClassFileStream* cfs = stream(); |
341 constantPoolHandle nullHandle; |
323 constantPoolHandle nullHandle; |
342 |
324 |
343 cfs->guarantee_more(3, CHECK_(nullHandle)); // length, first cp tag |
325 cfs->guarantee_more(3, CHECK_(nullHandle)); // length, first cp tag |
344 u2 length = cfs->get_u2_fast(); |
326 u2 length = cfs->get_u2_fast(); |
345 guarantee_property( |
327 guarantee_property( |
346 length >= 1, "Illegal constant pool size %u in class file %s", |
328 length >= 1, "Illegal constant pool size %u in class file %s", |
347 length, CHECK_(nullHandle)); |
329 length, CHECK_(nullHandle)); |
348 ConstantPool* constant_pool = |
330 ConstantPool* constant_pool = ConstantPool::allocate(_loader_data, length, |
349 ConstantPool::allocate(loader_data, |
331 CHECK_(nullHandle)); |
350 length, |
332 _cp = constant_pool; // save in case of errors |
351 CHECK_(nullHandle)); |
|
352 constantPoolHandle cp (THREAD, constant_pool); |
333 constantPoolHandle cp (THREAD, constant_pool); |
353 |
334 |
354 ConstantPoolCleaner cp_in_error(cp); // set constant pool to be cleaned up. |
|
355 |
|
356 // parsing constant pool entries |
335 // parsing constant pool entries |
357 parse_constant_pool_entries(loader_data, cp, length, CHECK_(nullHandle)); |
336 parse_constant_pool_entries(length, CHECK_(nullHandle)); |
358 |
337 |
359 int index = 1; // declared outside of loops for portability |
338 int index = 1; // declared outside of loops for portability |
360 |
339 |
361 // first verification pass - validate cross references and fixup class and string constants |
340 // first verification pass - validate cross references and fixup class and string constants |
362 for (index = 1; index < length; index++) { // Index 0 is unused |
341 for (index = 1; index < length; index++) { // Index 0 is unused |
371 // fall through |
350 // fall through |
372 case JVM_CONSTANT_InterfaceMethodref : { |
351 case JVM_CONSTANT_InterfaceMethodref : { |
373 if (!_need_verify) break; |
352 if (!_need_verify) break; |
374 int klass_ref_index = cp->klass_ref_index_at(index); |
353 int klass_ref_index = cp->klass_ref_index_at(index); |
375 int name_and_type_ref_index = cp->name_and_type_ref_index_at(index); |
354 int name_and_type_ref_index = cp->name_and_type_ref_index_at(index); |
376 check_property(valid_cp_range(klass_ref_index, length) && |
355 check_property(valid_klass_reference_at(klass_ref_index), |
377 is_klass_reference(cp, klass_ref_index), |
|
378 "Invalid constant pool index %u in class file %s", |
356 "Invalid constant pool index %u in class file %s", |
379 klass_ref_index, |
357 klass_ref_index, |
380 CHECK_(nullHandle)); |
358 CHECK_(nullHandle)); |
381 check_property(valid_cp_range(name_and_type_ref_index, length) && |
359 check_property(valid_cp_range(name_and_type_ref_index, length) && |
382 cp->tag_at(name_and_type_ref_index).is_name_and_type(), |
360 cp->tag_at(name_and_type_ref_index).is_name_and_type(), |
402 break; |
380 break; |
403 case JVM_CONSTANT_NameAndType : { |
381 case JVM_CONSTANT_NameAndType : { |
404 if (!_need_verify) break; |
382 if (!_need_verify) break; |
405 int name_ref_index = cp->name_ref_index_at(index); |
383 int name_ref_index = cp->name_ref_index_at(index); |
406 int signature_ref_index = cp->signature_ref_index_at(index); |
384 int signature_ref_index = cp->signature_ref_index_at(index); |
407 check_property( |
385 check_property(valid_symbol_at(name_ref_index), |
408 valid_cp_range(name_ref_index, length) && |
386 "Invalid constant pool index %u in class file %s", |
409 cp->tag_at(name_ref_index).is_utf8(), |
387 name_ref_index, CHECK_(nullHandle)); |
410 "Invalid constant pool index %u in class file %s", |
388 check_property(valid_symbol_at(signature_ref_index), |
411 name_ref_index, CHECK_(nullHandle)); |
389 "Invalid constant pool index %u in class file %s", |
412 check_property( |
390 signature_ref_index, CHECK_(nullHandle)); |
413 valid_cp_range(signature_ref_index, length) && |
|
414 cp->tag_at(signature_ref_index).is_utf8(), |
|
415 "Invalid constant pool index %u in class file %s", |
|
416 signature_ref_index, CHECK_(nullHandle)); |
|
417 break; |
391 break; |
418 } |
392 } |
419 case JVM_CONSTANT_Utf8 : |
393 case JVM_CONSTANT_Utf8 : |
420 break; |
394 break; |
421 case JVM_CONSTANT_UnresolvedClass : // fall-through |
395 case JVM_CONSTANT_UnresolvedClass : // fall-through |
423 ShouldNotReachHere(); // Only JVM_CONSTANT_ClassIndex should be present |
397 ShouldNotReachHere(); // Only JVM_CONSTANT_ClassIndex should be present |
424 break; |
398 break; |
425 case JVM_CONSTANT_ClassIndex : |
399 case JVM_CONSTANT_ClassIndex : |
426 { |
400 { |
427 int class_index = cp->klass_index_at(index); |
401 int class_index = cp->klass_index_at(index); |
428 check_property( |
402 check_property(valid_symbol_at(class_index), |
429 valid_cp_range(class_index, length) && |
403 "Invalid constant pool index %u in class file %s", |
430 cp->tag_at(class_index).is_utf8(), |
404 class_index, CHECK_(nullHandle)); |
431 "Invalid constant pool index %u in class file %s", |
|
432 class_index, CHECK_(nullHandle)); |
|
433 cp->unresolved_klass_at_put(index, cp->symbol_at(class_index)); |
405 cp->unresolved_klass_at_put(index, cp->symbol_at(class_index)); |
434 } |
406 } |
435 break; |
407 break; |
436 case JVM_CONSTANT_StringIndex : |
408 case JVM_CONSTANT_StringIndex : |
437 { |
409 { |
438 int string_index = cp->string_index_at(index); |
410 int string_index = cp->string_index_at(index); |
439 check_property( |
411 check_property(valid_symbol_at(string_index), |
440 valid_cp_range(string_index, length) && |
412 "Invalid constant pool index %u in class file %s", |
441 cp->tag_at(string_index).is_utf8(), |
413 string_index, CHECK_(nullHandle)); |
442 "Invalid constant pool index %u in class file %s", |
|
443 string_index, CHECK_(nullHandle)); |
|
444 Symbol* sym = cp->symbol_at(string_index); |
414 Symbol* sym = cp->symbol_at(string_index); |
445 cp->unresolved_string_at_put(index, sym); |
415 cp->unresolved_string_at_put(index, sym); |
446 } |
416 } |
447 break; |
417 break; |
448 case JVM_CONSTANT_MethodHandle : |
418 case JVM_CONSTANT_MethodHandle : |
489 } |
459 } |
490 break; |
460 break; |
491 case JVM_CONSTANT_MethodType : |
461 case JVM_CONSTANT_MethodType : |
492 { |
462 { |
493 int ref_index = cp->method_type_index_at(index); |
463 int ref_index = cp->method_type_index_at(index); |
494 check_property( |
464 check_property(valid_symbol_at(ref_index) && EnableInvokeDynamic, |
495 valid_cp_range(ref_index, length) && |
465 "Invalid constant pool index %u in class file %s", |
496 cp->tag_at(ref_index).is_utf8() && |
466 ref_index, CHECK_(nullHandle)); |
497 EnableInvokeDynamic, |
|
498 "Invalid constant pool index %u in class file %s", |
|
499 ref_index, CHECK_(nullHandle)); |
|
500 } |
467 } |
501 break; |
468 break; |
502 case JVM_CONSTANT_InvokeDynamic : |
469 case JVM_CONSTANT_InvokeDynamic : |
503 { |
470 { |
504 int name_and_type_ref_index = cp->invoke_dynamic_name_and_type_ref_index_at(index); |
471 int name_and_type_ref_index = cp->invoke_dynamic_name_and_type_ref_index_at(index); |
539 } |
506 } |
540 } |
507 } |
541 } |
508 } |
542 |
509 |
543 if (!_need_verify) { |
510 if (!_need_verify) { |
544 cp_in_error.set_in_error(false); |
|
545 return cp; |
511 return cp; |
546 } |
512 } |
547 |
513 |
548 // second verification pass - checks the strings are of the right format. |
514 // second verification pass - checks the strings are of the right format. |
549 // but not yet to the other entries |
515 // but not yet to the other entries |
662 assert(cp->symbol_at(index)->refcount() != 0, "count corrupted"); |
628 assert(cp->symbol_at(index)->refcount() != 0, "count corrupted"); |
663 } |
629 } |
664 } // end of switch |
630 } // end of switch |
665 } // end of for |
631 } // end of for |
666 |
632 |
667 cp_in_error.set_in_error(false); |
|
668 return cp; |
633 return cp; |
669 } |
634 } |
670 |
635 |
671 |
636 |
672 void ClassFileParser::patch_constant_pool(constantPoolHandle cp, int index, Handle patch, TRAPS) { |
637 void ClassFileParser::patch_constant_pool(constantPoolHandle cp, int index, Handle patch, TRAPS) { |
784 |
749 |
785 return true; |
750 return true; |
786 } |
751 } |
787 |
752 |
788 |
753 |
789 Array<Klass*>* ClassFileParser::parse_interfaces(constantPoolHandle cp, |
754 Array<Klass*>* ClassFileParser::parse_interfaces(int length, |
790 int length, |
|
791 ClassLoaderData* loader_data, |
|
792 Handle protection_domain, |
755 Handle protection_domain, |
793 Symbol* class_name, |
756 Symbol* class_name, |
794 bool* has_default_methods, |
757 bool* has_default_methods, |
795 TRAPS) { |
758 TRAPS) { |
796 ClassFileStream* cfs = stream(); |
759 if (length == 0) { |
797 assert(length > 0, "only called for length>0"); |
760 _local_interfaces = Universe::the_empty_klass_array(); |
798 // FIXME: Leak at later OOM. |
761 } else { |
799 Array<Klass*>* interfaces = MetadataFactory::new_array<Klass*>(loader_data, length, NULL, CHECK_NULL); |
762 ClassFileStream* cfs = stream(); |
800 |
763 assert(length > 0, "only called for length>0"); |
801 int index; |
764 _local_interfaces = MetadataFactory::new_array<Klass*>(_loader_data, length, NULL, CHECK_NULL); |
802 for (index = 0; index < length; index++) { |
765 |
803 u2 interface_index = cfs->get_u2(CHECK_NULL); |
766 int index; |
804 KlassHandle interf; |
|
805 check_property( |
|
806 valid_cp_range(interface_index, cp->length()) && |
|
807 is_klass_reference(cp, interface_index), |
|
808 "Interface name has bad constant pool index %u in class file %s", |
|
809 interface_index, CHECK_NULL); |
|
810 if (cp->tag_at(interface_index).is_klass()) { |
|
811 interf = KlassHandle(THREAD, cp->resolved_klass_at(interface_index)); |
|
812 } else { |
|
813 Symbol* unresolved_klass = cp->klass_name_at(interface_index); |
|
814 |
|
815 // Don't need to check legal name because it's checked when parsing constant pool. |
|
816 // But need to make sure it's not an array type. |
|
817 guarantee_property(unresolved_klass->byte_at(0) != JVM_SIGNATURE_ARRAY, |
|
818 "Bad interface name in class file %s", CHECK_NULL); |
|
819 Handle class_loader(THREAD, loader_data->class_loader()); |
|
820 |
|
821 // Call resolve_super so classcircularity is checked |
|
822 Klass* k = SystemDictionary::resolve_super_or_fail(class_name, |
|
823 unresolved_klass, class_loader, protection_domain, |
|
824 false, CHECK_NULL); |
|
825 interf = KlassHandle(THREAD, k); |
|
826 } |
|
827 |
|
828 if (!interf()->is_interface()) { |
|
829 THROW_MSG_(vmSymbols::java_lang_IncompatibleClassChangeError(), "Implementing class", NULL); |
|
830 } |
|
831 if (InstanceKlass::cast(interf())->has_default_methods()) { |
|
832 *has_default_methods = true; |
|
833 } |
|
834 interfaces->at_put(index, interf()); |
|
835 } |
|
836 |
|
837 if (!_need_verify || length <= 1) { |
|
838 return interfaces; |
|
839 } |
|
840 |
|
841 // Check if there's any duplicates in interfaces |
|
842 ResourceMark rm(THREAD); |
|
843 NameSigHash** interface_names = NEW_RESOURCE_ARRAY_IN_THREAD( |
|
844 THREAD, NameSigHash*, HASH_ROW_SIZE); |
|
845 initialize_hashtable(interface_names); |
|
846 bool dup = false; |
|
847 { |
|
848 debug_only(No_Safepoint_Verifier nsv;) |
|
849 for (index = 0; index < length; index++) { |
767 for (index = 0; index < length; index++) { |
850 Klass* k = interfaces->at(index); |
768 u2 interface_index = cfs->get_u2(CHECK_NULL); |
851 Symbol* name = InstanceKlass::cast(k)->name(); |
769 KlassHandle interf; |
852 // If no duplicates, add (name, NULL) in hashtable interface_names. |
770 check_property( |
853 if (!put_after_lookup(name, NULL, interface_names)) { |
771 valid_klass_reference_at(interface_index), |
854 dup = true; |
772 "Interface name has bad constant pool index %u in class file %s", |
855 break; |
773 interface_index, CHECK_NULL); |
856 } |
774 if (_cp->tag_at(interface_index).is_klass()) { |
857 } |
775 interf = KlassHandle(THREAD, _cp->resolved_klass_at(interface_index)); |
858 } |
776 } else { |
859 if (dup) { |
777 Symbol* unresolved_klass = _cp->klass_name_at(interface_index); |
860 classfile_parse_error("Duplicate interface name in class file %s", CHECK_NULL); |
778 |
861 } |
779 // Don't need to check legal name because it's checked when parsing constant pool. |
862 |
780 // But need to make sure it's not an array type. |
863 return interfaces; |
781 guarantee_property(unresolved_klass->byte_at(0) != JVM_SIGNATURE_ARRAY, |
864 } |
782 "Bad interface name in class file %s", CHECK_NULL); |
865 |
783 Handle class_loader(THREAD, _loader_data->class_loader()); |
866 |
784 |
867 void ClassFileParser::verify_constantvalue(int constantvalue_index, int signature_index, constantPoolHandle cp, TRAPS) { |
785 // Call resolve_super so classcircularity is checked |
786 Klass* k = SystemDictionary::resolve_super_or_fail(class_name, |
|
787 unresolved_klass, class_loader, protection_domain, |
|
788 false, CHECK_NULL); |
|
789 interf = KlassHandle(THREAD, k); |
|
790 } |
|
791 |
|
792 if (!interf()->is_interface()) { |
|
793 THROW_MSG_(vmSymbols::java_lang_IncompatibleClassChangeError(), "Implementing class", NULL); |
|
794 } |
|
795 if (InstanceKlass::cast(interf())->has_default_methods()) { |
|
796 *has_default_methods = true; |
|
797 } |
|
798 _local_interfaces->at_put(index, interf()); |
|
799 } |
|
800 |
|
801 if (!_need_verify || length <= 1) { |
|
802 return _local_interfaces; |
|
803 } |
|
804 |
|
805 // Check if there's any duplicates in interfaces |
|
806 ResourceMark rm(THREAD); |
|
807 NameSigHash** interface_names = NEW_RESOURCE_ARRAY_IN_THREAD( |
|
808 THREAD, NameSigHash*, HASH_ROW_SIZE); |
|
809 initialize_hashtable(interface_names); |
|
810 bool dup = false; |
|
811 { |
|
812 debug_only(No_Safepoint_Verifier nsv;) |
|
813 for (index = 0; index < length; index++) { |
|
814 Klass* k = _local_interfaces->at(index); |
|
815 Symbol* name = InstanceKlass::cast(k)->name(); |
|
816 // If no duplicates, add (name, NULL) in hashtable interface_names. |
|
817 if (!put_after_lookup(name, NULL, interface_names)) { |
|
818 dup = true; |
|
819 break; |
|
820 } |
|
821 } |
|
822 } |
|
823 if (dup) { |
|
824 classfile_parse_error("Duplicate interface name in class file %s", CHECK_NULL); |
|
825 } |
|
826 } |
|
827 return _local_interfaces; |
|
828 } |
|
829 |
|
830 |
|
831 void ClassFileParser::verify_constantvalue(int constantvalue_index, int signature_index, TRAPS) { |
|
868 // Make sure the constant pool entry is of a type appropriate to this field |
832 // Make sure the constant pool entry is of a type appropriate to this field |
869 guarantee_property( |
833 guarantee_property( |
870 (constantvalue_index > 0 && |
834 (constantvalue_index > 0 && |
871 constantvalue_index < cp->length()), |
835 constantvalue_index < _cp->length()), |
872 "Bad initial value index %u in ConstantValue attribute in class file %s", |
836 "Bad initial value index %u in ConstantValue attribute in class file %s", |
873 constantvalue_index, CHECK); |
837 constantvalue_index, CHECK); |
874 constantTag value_type = cp->tag_at(constantvalue_index); |
838 constantTag value_type = _cp->tag_at(constantvalue_index); |
875 switch ( cp->basic_type_for_signature_at(signature_index) ) { |
839 switch ( _cp->basic_type_for_signature_at(signature_index) ) { |
876 case T_LONG: |
840 case T_LONG: |
877 guarantee_property(value_type.is_long(), "Inconsistent constant value type in class file %s", CHECK); |
841 guarantee_property(value_type.is_long(), "Inconsistent constant value type in class file %s", CHECK); |
878 break; |
842 break; |
879 case T_FLOAT: |
843 case T_FLOAT: |
880 guarantee_property(value_type.is_float(), "Inconsistent constant value type in class file %s", CHECK); |
844 guarantee_property(value_type.is_float(), "Inconsistent constant value type in class file %s", CHECK); |
884 break; |
848 break; |
885 case T_BYTE: case T_CHAR: case T_SHORT: case T_BOOLEAN: case T_INT: |
849 case T_BYTE: case T_CHAR: case T_SHORT: case T_BOOLEAN: case T_INT: |
886 guarantee_property(value_type.is_int(), "Inconsistent constant value type in class file %s", CHECK); |
850 guarantee_property(value_type.is_int(), "Inconsistent constant value type in class file %s", CHECK); |
887 break; |
851 break; |
888 case T_OBJECT: |
852 case T_OBJECT: |
889 guarantee_property((cp->symbol_at(signature_index)->equals("Ljava/lang/String;") |
853 guarantee_property((_cp->symbol_at(signature_index)->equals("Ljava/lang/String;") |
890 && value_type.is_string()), |
854 && value_type.is_string()), |
891 "Bad string initial value in class file %s", CHECK); |
855 "Bad string initial value in class file %s", CHECK); |
892 break; |
856 break; |
893 default: |
857 default: |
894 classfile_parse_error( |
858 classfile_parse_error( |
897 } |
861 } |
898 } |
862 } |
899 |
863 |
900 |
864 |
901 // Parse attributes for a field. |
865 // Parse attributes for a field. |
902 void ClassFileParser::parse_field_attributes(ClassLoaderData* loader_data, |
866 void ClassFileParser::parse_field_attributes(u2 attributes_count, |
903 constantPoolHandle cp, |
|
904 u2 attributes_count, |
|
905 bool is_static, u2 signature_index, |
867 bool is_static, u2 signature_index, |
906 u2* constantvalue_index_addr, |
868 u2* constantvalue_index_addr, |
907 bool* is_synthetic_addr, |
869 bool* is_synthetic_addr, |
908 u2* generic_signature_index_addr, |
870 u2* generic_signature_index_addr, |
909 AnnotationArray** field_annotations, |
|
910 AnnotationArray** field_type_annotations, |
|
911 ClassFileParser::FieldAnnotationCollector* parsed_annotations, |
871 ClassFileParser::FieldAnnotationCollector* parsed_annotations, |
912 TRAPS) { |
872 TRAPS) { |
913 ClassFileStream* cfs = stream(); |
873 ClassFileStream* cfs = stream(); |
914 assert(attributes_count > 0, "length should be greater than 0"); |
874 assert(attributes_count > 0, "length should be greater than 0"); |
915 u2 constantvalue_index = 0; |
875 u2 constantvalue_index = 0; |
925 int runtime_invisible_type_annotations_length = 0; |
885 int runtime_invisible_type_annotations_length = 0; |
926 while (attributes_count--) { |
886 while (attributes_count--) { |
927 cfs->guarantee_more(6, CHECK); // attribute_name_index, attribute_length |
887 cfs->guarantee_more(6, CHECK); // attribute_name_index, attribute_length |
928 u2 attribute_name_index = cfs->get_u2_fast(); |
888 u2 attribute_name_index = cfs->get_u2_fast(); |
929 u4 attribute_length = cfs->get_u4_fast(); |
889 u4 attribute_length = cfs->get_u4_fast(); |
930 check_property(valid_cp_range(attribute_name_index, cp->length()) && |
890 check_property(valid_symbol_at(attribute_name_index), |
931 cp->tag_at(attribute_name_index).is_utf8(), |
|
932 "Invalid field attribute index %u in class file %s", |
891 "Invalid field attribute index %u in class file %s", |
933 attribute_name_index, |
892 attribute_name_index, |
934 CHECK); |
893 CHECK); |
935 Symbol* attribute_name = cp->symbol_at(attribute_name_index); |
894 Symbol* attribute_name = _cp->symbol_at(attribute_name_index); |
936 if (is_static && attribute_name == vmSymbols::tag_constant_value()) { |
895 if (is_static && attribute_name == vmSymbols::tag_constant_value()) { |
937 // ignore if non-static |
896 // ignore if non-static |
938 if (constantvalue_index != 0) { |
897 if (constantvalue_index != 0) { |
939 classfile_parse_error("Duplicate ConstantValue attribute in class file %s", CHECK); |
898 classfile_parse_error("Duplicate ConstantValue attribute in class file %s", CHECK); |
940 } |
899 } |
942 attribute_length == 2, |
901 attribute_length == 2, |
943 "Invalid ConstantValue field attribute length %u in class file %s", |
902 "Invalid ConstantValue field attribute length %u in class file %s", |
944 attribute_length, CHECK); |
903 attribute_length, CHECK); |
945 constantvalue_index = cfs->get_u2(CHECK); |
904 constantvalue_index = cfs->get_u2(CHECK); |
946 if (_need_verify) { |
905 if (_need_verify) { |
947 verify_constantvalue(constantvalue_index, signature_index, cp, CHECK); |
906 verify_constantvalue(constantvalue_index, signature_index, CHECK); |
948 } |
907 } |
949 } else if (attribute_name == vmSymbols::tag_synthetic()) { |
908 } else if (attribute_name == vmSymbols::tag_synthetic()) { |
950 if (attribute_length != 0) { |
909 if (attribute_length != 0) { |
951 classfile_parse_error( |
910 classfile_parse_error( |
952 "Invalid Synthetic field attribute length %u in class file %s", |
911 "Invalid Synthetic field attribute length %u in class file %s", |
969 generic_signature_index = cfs->get_u2(CHECK); |
928 generic_signature_index = cfs->get_u2(CHECK); |
970 } else if (attribute_name == vmSymbols::tag_runtime_visible_annotations()) { |
929 } else if (attribute_name == vmSymbols::tag_runtime_visible_annotations()) { |
971 runtime_visible_annotations_length = attribute_length; |
930 runtime_visible_annotations_length = attribute_length; |
972 runtime_visible_annotations = cfs->get_u1_buffer(); |
931 runtime_visible_annotations = cfs->get_u1_buffer(); |
973 assert(runtime_visible_annotations != NULL, "null visible annotations"); |
932 assert(runtime_visible_annotations != NULL, "null visible annotations"); |
974 parse_annotations(loader_data, |
933 parse_annotations(runtime_visible_annotations, |
975 runtime_visible_annotations, |
|
976 runtime_visible_annotations_length, |
934 runtime_visible_annotations_length, |
977 cp, |
|
978 parsed_annotations, |
935 parsed_annotations, |
979 CHECK); |
936 CHECK); |
980 cfs->skip_u1(runtime_visible_annotations_length, CHECK); |
937 cfs->skip_u1(runtime_visible_annotations_length, CHECK); |
981 } else if (PreserveAllAnnotations && attribute_name == vmSymbols::tag_runtime_invisible_annotations()) { |
938 } else if (PreserveAllAnnotations && attribute_name == vmSymbols::tag_runtime_invisible_annotations()) { |
982 runtime_invisible_annotations_length = attribute_length; |
939 runtime_invisible_annotations_length = attribute_length; |
1002 } |
959 } |
1003 |
960 |
1004 *constantvalue_index_addr = constantvalue_index; |
961 *constantvalue_index_addr = constantvalue_index; |
1005 *is_synthetic_addr = is_synthetic; |
962 *is_synthetic_addr = is_synthetic; |
1006 *generic_signature_index_addr = generic_signature_index; |
963 *generic_signature_index_addr = generic_signature_index; |
1007 *field_annotations = assemble_annotations(loader_data, |
964 AnnotationArray* a = assemble_annotations(runtime_visible_annotations, |
1008 runtime_visible_annotations, |
|
1009 runtime_visible_annotations_length, |
965 runtime_visible_annotations_length, |
1010 runtime_invisible_annotations, |
966 runtime_invisible_annotations, |
1011 runtime_invisible_annotations_length, |
967 runtime_invisible_annotations_length, |
1012 CHECK); |
968 CHECK); |
1013 *field_type_annotations = assemble_annotations(loader_data, |
969 parsed_annotations->set_field_annotations(a); |
1014 runtime_visible_type_annotations, |
970 a = assemble_annotations(runtime_visible_type_annotations, |
1015 runtime_visible_type_annotations_length, |
971 runtime_visible_type_annotations_length, |
1016 runtime_invisible_type_annotations, |
972 runtime_invisible_type_annotations, |
1017 runtime_invisible_type_annotations_length, |
973 runtime_invisible_type_annotations_length, |
1018 CHECK); |
974 CHECK); |
975 parsed_annotations->set_field_type_annotations(a); |
|
1019 return; |
976 return; |
1020 } |
977 } |
1021 |
978 |
1022 |
979 |
1023 // Field allocation types. Used for computing field offsets. |
980 // Field allocation types. Used for computing field offsets. |
1104 count[atype]++; |
1061 count[atype]++; |
1105 return atype; |
1062 return atype; |
1106 } |
1063 } |
1107 }; |
1064 }; |
1108 |
1065 |
1109 Array<u2>* ClassFileParser::parse_fields(ClassLoaderData* loader_data, |
1066 Array<u2>* ClassFileParser::parse_fields(Symbol* class_name, |
1110 Symbol* class_name, |
|
1111 constantPoolHandle cp, |
|
1112 bool is_interface, |
1067 bool is_interface, |
1113 FieldAllocationCount *fac, |
1068 FieldAllocationCount *fac, |
1114 Array<AnnotationArray*>** fields_annotations, |
|
1115 Array<AnnotationArray*>** fields_type_annotations, |
|
1116 u2* java_fields_count_ptr, TRAPS) { |
1069 u2* java_fields_count_ptr, TRAPS) { |
1117 ClassFileStream* cfs = stream(); |
1070 ClassFileStream* cfs = stream(); |
1118 cfs->guarantee_more(2, CHECK_NULL); // length |
1071 cfs->guarantee_more(2, CHECK_NULL); // length |
1119 u2 length = cfs->get_u2_fast(); |
1072 u2 length = cfs->get_u2_fast(); |
1120 *java_fields_count_ptr = length; |
1073 *java_fields_count_ptr = length; |
1145 // array and any unused slots will be discarded. |
1098 // array and any unused slots will be discarded. |
1146 ResourceMark rm(THREAD); |
1099 ResourceMark rm(THREAD); |
1147 u2* fa = NEW_RESOURCE_ARRAY_IN_THREAD( |
1100 u2* fa = NEW_RESOURCE_ARRAY_IN_THREAD( |
1148 THREAD, u2, total_fields * (FieldInfo::field_slots + 1)); |
1101 THREAD, u2, total_fields * (FieldInfo::field_slots + 1)); |
1149 |
1102 |
1150 AnnotationArray* field_annotations = NULL; |
|
1151 AnnotationArray* field_type_annotations = NULL; |
|
1152 // The generic signature slots start after all other fields' data. |
1103 // The generic signature slots start after all other fields' data. |
1153 int generic_signature_slot = total_fields * FieldInfo::field_slots; |
1104 int generic_signature_slot = total_fields * FieldInfo::field_slots; |
1154 int num_generic_signature = 0; |
1105 int num_generic_signature = 0; |
1155 for (int n = 0; n < length; n++) { |
1106 for (int n = 0; n < length; n++) { |
1156 cfs->guarantee_more(8, CHECK_NULL); // access_flags, name_index, descriptor_index, attributes_count |
1107 cfs->guarantee_more(8, CHECK_NULL); // access_flags, name_index, descriptor_index, attributes_count |
1159 jint flags = cfs->get_u2_fast() & JVM_RECOGNIZED_FIELD_MODIFIERS; |
1110 jint flags = cfs->get_u2_fast() & JVM_RECOGNIZED_FIELD_MODIFIERS; |
1160 verify_legal_field_modifiers(flags, is_interface, CHECK_NULL); |
1111 verify_legal_field_modifiers(flags, is_interface, CHECK_NULL); |
1161 access_flags.set_flags(flags); |
1112 access_flags.set_flags(flags); |
1162 |
1113 |
1163 u2 name_index = cfs->get_u2_fast(); |
1114 u2 name_index = cfs->get_u2_fast(); |
1164 int cp_size = cp->length(); |
1115 int cp_size = _cp->length(); |
1165 check_property( |
1116 check_property(valid_symbol_at(name_index), |
1166 valid_cp_range(name_index, cp_size) && cp->tag_at(name_index).is_utf8(), |
|
1167 "Invalid constant pool index %u for field name in class file %s", |
1117 "Invalid constant pool index %u for field name in class file %s", |
1168 name_index, CHECK_NULL); |
1118 name_index, |
1169 Symbol* name = cp->symbol_at(name_index); |
1119 CHECK_NULL); |
1120 Symbol* name = _cp->symbol_at(name_index); |
|
1170 verify_legal_field_name(name, CHECK_NULL); |
1121 verify_legal_field_name(name, CHECK_NULL); |
1171 |
1122 |
1172 u2 signature_index = cfs->get_u2_fast(); |
1123 u2 signature_index = cfs->get_u2_fast(); |
1173 check_property( |
1124 check_property(valid_symbol_at(signature_index), |
1174 valid_cp_range(signature_index, cp_size) && |
|
1175 cp->tag_at(signature_index).is_utf8(), |
|
1176 "Invalid constant pool index %u for field signature in class file %s", |
1125 "Invalid constant pool index %u for field signature in class file %s", |
1177 signature_index, CHECK_NULL); |
1126 signature_index, CHECK_NULL); |
1178 Symbol* sig = cp->symbol_at(signature_index); |
1127 Symbol* sig = _cp->symbol_at(signature_index); |
1179 verify_legal_field_signature(name, sig, CHECK_NULL); |
1128 verify_legal_field_signature(name, sig, CHECK_NULL); |
1180 |
1129 |
1181 u2 constantvalue_index = 0; |
1130 u2 constantvalue_index = 0; |
1182 bool is_synthetic = false; |
1131 bool is_synthetic = false; |
1183 u2 generic_signature_index = 0; |
1132 u2 generic_signature_index = 0; |
1184 bool is_static = access_flags.is_static(); |
1133 bool is_static = access_flags.is_static(); |
1185 FieldAnnotationCollector parsed_annotations; |
1134 FieldAnnotationCollector parsed_annotations(_loader_data); |
1186 |
1135 |
1187 u2 attributes_count = cfs->get_u2_fast(); |
1136 u2 attributes_count = cfs->get_u2_fast(); |
1188 if (attributes_count > 0) { |
1137 if (attributes_count > 0) { |
1189 parse_field_attributes(loader_data, |
1138 parse_field_attributes(attributes_count, is_static, signature_index, |
1190 cp, attributes_count, is_static, signature_index, |
|
1191 &constantvalue_index, &is_synthetic, |
1139 &constantvalue_index, &is_synthetic, |
1192 &generic_signature_index, &field_annotations, |
1140 &generic_signature_index, &parsed_annotations, |
1193 &field_type_annotations, &parsed_annotations, |
|
1194 CHECK_NULL); |
1141 CHECK_NULL); |
1195 if (field_annotations != NULL) { |
1142 if (parsed_annotations.field_annotations() != NULL) { |
1196 if (*fields_annotations == NULL) { |
1143 if (_fields_annotations == NULL) { |
1197 *fields_annotations = MetadataFactory::new_array<AnnotationArray*>( |
1144 _fields_annotations = MetadataFactory::new_array<AnnotationArray*>( |
1198 loader_data, length, NULL, |
1145 _loader_data, length, NULL, |
1199 CHECK_NULL); |
1146 CHECK_NULL); |
1200 } |
1147 } |
1201 (*fields_annotations)->at_put(n, field_annotations); |
1148 _fields_annotations->at_put(n, parsed_annotations.field_annotations()); |
1202 } |
1149 parsed_annotations.set_field_annotations(NULL); |
1203 if (field_type_annotations != NULL) { |
1150 } |
1204 if (*fields_type_annotations == NULL) { |
1151 if (parsed_annotations.field_type_annotations() != NULL) { |
1205 *fields_type_annotations = MetadataFactory::new_array<AnnotationArray*>( |
1152 if (_fields_type_annotations == NULL) { |
1206 loader_data, length, NULL, |
1153 _fields_type_annotations = MetadataFactory::new_array<AnnotationArray*>( |
1154 _loader_data, length, NULL, |
|
1207 CHECK_NULL); |
1155 CHECK_NULL); |
1208 } |
1156 } |
1209 (*fields_type_annotations)->at_put(n, field_type_annotations); |
1157 _fields_type_annotations->at_put(n, parsed_annotations.field_type_annotations()); |
1210 } |
1158 parsed_annotations.set_field_type_annotations(NULL); |
1159 } |
|
1160 |
|
1211 if (is_synthetic) { |
1161 if (is_synthetic) { |
1212 access_flags.set_is_synthetic(); |
1162 access_flags.set_is_synthetic(); |
1213 } |
1163 } |
1214 if (generic_signature_index != 0) { |
1164 if (generic_signature_index != 0) { |
1215 access_flags.set_field_has_generic_signature(); |
1165 access_flags.set_field_has_generic_signature(); |
1222 FieldInfo* field = FieldInfo::from_field_array(fa, n); |
1172 FieldInfo* field = FieldInfo::from_field_array(fa, n); |
1223 field->initialize(access_flags.as_short(), |
1173 field->initialize(access_flags.as_short(), |
1224 name_index, |
1174 name_index, |
1225 signature_index, |
1175 signature_index, |
1226 constantvalue_index); |
1176 constantvalue_index); |
1227 BasicType type = cp->basic_type_for_signature_at(signature_index); |
1177 BasicType type = _cp->basic_type_for_signature_at(signature_index); |
1228 |
1178 |
1229 // Remember how many oops we encountered and compute allocation type |
1179 // Remember how many oops we encountered and compute allocation type |
1230 FieldAllocationType atype = fac->update(is_static, type); |
1180 FieldAllocationType atype = fac->update(is_static, type); |
1231 field->set_allocation_type(atype); |
1181 field->set_allocation_type(atype); |
1232 |
1182 |
1243 Symbol* name = injected[n].name(); |
1193 Symbol* name = injected[n].name(); |
1244 Symbol* signature = injected[n].signature(); |
1194 Symbol* signature = injected[n].signature(); |
1245 bool duplicate = false; |
1195 bool duplicate = false; |
1246 for (int i = 0; i < length; i++) { |
1196 for (int i = 0; i < length; i++) { |
1247 FieldInfo* f = FieldInfo::from_field_array(fa, i); |
1197 FieldInfo* f = FieldInfo::from_field_array(fa, i); |
1248 if (name == cp->symbol_at(f->name_index()) && |
1198 if (name == _cp->symbol_at(f->name_index()) && |
1249 signature == cp->symbol_at(f->signature_index())) { |
1199 signature == _cp->symbol_at(f->signature_index())) { |
1250 // Symbol is desclared in Java so skip this one |
1200 // Symbol is desclared in Java so skip this one |
1251 duplicate = true; |
1201 duplicate = true; |
1252 break; |
1202 break; |
1253 } |
1203 } |
1254 } |
1204 } |
1278 // Sometimes injected fields already exist in the Java source so |
1228 // Sometimes injected fields already exist in the Java source so |
1279 // the fields array could be too long. In that case the |
1229 // the fields array could be too long. In that case the |
1280 // fields array is trimed. Also unused slots that were reserved |
1230 // fields array is trimed. Also unused slots that were reserved |
1281 // for generic signature indexes are discarded. |
1231 // for generic signature indexes are discarded. |
1282 Array<u2>* fields = MetadataFactory::new_array<u2>( |
1232 Array<u2>* fields = MetadataFactory::new_array<u2>( |
1283 loader_data, index * FieldInfo::field_slots + num_generic_signature, |
1233 _loader_data, index * FieldInfo::field_slots + num_generic_signature, |
1284 CHECK_NULL); |
1234 CHECK_NULL); |
1235 _fields = fields; // save in case of error |
|
1285 { |
1236 { |
1286 int i = 0; |
1237 int i = 0; |
1287 for (; i < index * FieldInfo::field_slots; i++) { |
1238 for (; i < index * FieldInfo::field_slots; i++) { |
1288 fields->at_put(i, fa[i]); |
1239 fields->at_put(i, fa[i]); |
1289 } |
1240 } |
1301 THREAD, NameSigHash*, HASH_ROW_SIZE); |
1252 THREAD, NameSigHash*, HASH_ROW_SIZE); |
1302 initialize_hashtable(names_and_sigs); |
1253 initialize_hashtable(names_and_sigs); |
1303 bool dup = false; |
1254 bool dup = false; |
1304 { |
1255 { |
1305 debug_only(No_Safepoint_Verifier nsv;) |
1256 debug_only(No_Safepoint_Verifier nsv;) |
1306 for (AllFieldStream fs(fields, cp); !fs.done(); fs.next()) { |
1257 for (AllFieldStream fs(fields, _cp); !fs.done(); fs.next()) { |
1307 Symbol* name = fs.name(); |
1258 Symbol* name = fs.name(); |
1308 Symbol* sig = fs.signature(); |
1259 Symbol* sig = fs.signature(); |
1309 // If no duplicates, add name/signature in hashtable names_and_sigs. |
1260 // If no duplicates, add name/signature in hashtable names_and_sigs. |
1310 if (!put_after_lookup(name, sig, names_and_sigs)) { |
1261 if (!put_after_lookup(name, sig, names_and_sigs)) { |
1311 dup = true; |
1262 dup = true; |
1328 *dest++ = Bytes::get_Java_u2((u1*) (src++)); |
1279 *dest++ = Bytes::get_Java_u2((u1*) (src++)); |
1329 } |
1280 } |
1330 } |
1281 } |
1331 |
1282 |
1332 |
1283 |
1333 u2* ClassFileParser::parse_exception_table(ClassLoaderData* loader_data, |
1284 u2* ClassFileParser::parse_exception_table(u4 code_length, |
1334 u4 code_length, |
|
1335 u4 exception_table_length, |
1285 u4 exception_table_length, |
1336 constantPoolHandle cp, |
|
1337 TRAPS) { |
1286 TRAPS) { |
1338 ClassFileStream* cfs = stream(); |
1287 ClassFileStream* cfs = stream(); |
1339 |
1288 |
1340 u2* exception_table_start = cfs->get_u2_buffer(); |
1289 u2* exception_table_start = cfs->get_u2_buffer(); |
1341 assert(exception_table_start != NULL, "null exception table"); |
1290 assert(exception_table_start != NULL, "null exception table"); |
1352 CHECK_NULL); |
1301 CHECK_NULL); |
1353 guarantee_property(handler_pc < code_length, |
1302 guarantee_property(handler_pc < code_length, |
1354 "Illegal exception table handler in class file %s", |
1303 "Illegal exception table handler in class file %s", |
1355 CHECK_NULL); |
1304 CHECK_NULL); |
1356 if (catch_type_index != 0) { |
1305 if (catch_type_index != 0) { |
1357 guarantee_property(valid_cp_range(catch_type_index, cp->length()) && |
1306 guarantee_property(valid_klass_reference_at(catch_type_index), |
1358 is_klass_reference(cp, catch_type_index), |
|
1359 "Catch type in exception table has bad constant type in class file %s", CHECK_NULL); |
1307 "Catch type in exception table has bad constant type in class file %s", CHECK_NULL); |
1360 } |
1308 } |
1361 } |
1309 } |
1362 } else { |
1310 } else { |
1363 cfs->skip_u2_fast(exception_table_length * 4); |
1311 cfs->skip_u2_fast(exception_table_length * 4); |
1504 // Function is used to parse both attributes: |
1452 // Function is used to parse both attributes: |
1505 // LocalVariableTable (LVT) and LocalVariableTypeTable (LVTT) |
1453 // LocalVariableTable (LVT) and LocalVariableTypeTable (LVTT) |
1506 u2* ClassFileParser::parse_localvariable_table(u4 code_length, |
1454 u2* ClassFileParser::parse_localvariable_table(u4 code_length, |
1507 u2 max_locals, |
1455 u2 max_locals, |
1508 u4 code_attribute_length, |
1456 u4 code_attribute_length, |
1509 constantPoolHandle cp, |
|
1510 u2* localvariable_table_length, |
1457 u2* localvariable_table_length, |
1511 bool isLVTT, |
1458 bool isLVTT, |
1512 TRAPS) { |
1459 TRAPS) { |
1513 ClassFileStream* cfs = stream(); |
1460 ClassFileStream* cfs = stream(); |
1514 const char * tbl_name = (isLVTT) ? "LocalVariableTypeTable" : "LocalVariableTable"; |
1461 const char * tbl_name = (isLVTT) ? "LocalVariableTypeTable" : "LocalVariableTable"; |
1542 if (end_pc > code_length) { |
1489 if (end_pc > code_length) { |
1543 classfile_parse_error( |
1490 classfile_parse_error( |
1544 "Invalid length %u in %s in class file %s", |
1491 "Invalid length %u in %s in class file %s", |
1545 length, tbl_name, CHECK_NULL); |
1492 length, tbl_name, CHECK_NULL); |
1546 } |
1493 } |
1547 int cp_size = cp->length(); |
1494 int cp_size = _cp->length(); |
1548 guarantee_property( |
1495 guarantee_property(valid_symbol_at(name_index), |
1549 valid_cp_range(name_index, cp_size) && |
|
1550 cp->tag_at(name_index).is_utf8(), |
|
1551 "Name index %u in %s has bad constant type in class file %s", |
1496 "Name index %u in %s has bad constant type in class file %s", |
1552 name_index, tbl_name, CHECK_NULL); |
1497 name_index, tbl_name, CHECK_NULL); |
1553 guarantee_property( |
1498 guarantee_property(valid_symbol_at(descriptor_index), |
1554 valid_cp_range(descriptor_index, cp_size) && |
|
1555 cp->tag_at(descriptor_index).is_utf8(), |
|
1556 "Signature index %u in %s has bad constant type in class file %s", |
1499 "Signature index %u in %s has bad constant type in class file %s", |
1557 descriptor_index, tbl_name, CHECK_NULL); |
1500 descriptor_index, tbl_name, CHECK_NULL); |
1558 |
1501 |
1559 Symbol* name = cp->symbol_at(name_index); |
1502 Symbol* name = _cp->symbol_at(name_index); |
1560 Symbol* sig = cp->symbol_at(descriptor_index); |
1503 Symbol* sig = _cp->symbol_at(descriptor_index); |
1561 verify_legal_field_name(name, CHECK_NULL); |
1504 verify_legal_field_name(name, CHECK_NULL); |
1562 u2 extra_slot = 0; |
1505 u2 extra_slot = 0; |
1563 if (!isLVTT) { |
1506 if (!isLVTT) { |
1564 verify_legal_field_signature(name, sig, CHECK_NULL); |
1507 verify_legal_field_signature(name, sig, CHECK_NULL); |
1565 |
1508 |
1577 return localvariable_table_start; |
1520 return localvariable_table_start; |
1578 } |
1521 } |
1579 |
1522 |
1580 |
1523 |
1581 void ClassFileParser::parse_type_array(u2 array_length, u4 code_length, u4* u1_index, u4* u2_index, |
1524 void ClassFileParser::parse_type_array(u2 array_length, u4 code_length, u4* u1_index, u4* u2_index, |
1582 u1* u1_array, u2* u2_array, constantPoolHandle cp, TRAPS) { |
1525 u1* u1_array, u2* u2_array, TRAPS) { |
1583 ClassFileStream* cfs = stream(); |
1526 ClassFileStream* cfs = stream(); |
1584 u2 index = 0; // index in the array with long/double occupying two slots |
1527 u2 index = 0; // index in the array with long/double occupying two slots |
1585 u4 i1 = *u1_index; |
1528 u4 i1 = *u1_index; |
1586 u4 i2 = *u2_index + 1; |
1529 u4 i2 = *u2_index + 1; |
1587 for(int i = 0; i < array_length; i++) { |
1530 for(int i = 0; i < array_length; i++) { |
1589 index++; |
1532 index++; |
1590 if (tag == ITEM_Long || tag == ITEM_Double) { |
1533 if (tag == ITEM_Long || tag == ITEM_Double) { |
1591 index++; |
1534 index++; |
1592 } else if (tag == ITEM_Object) { |
1535 } else if (tag == ITEM_Object) { |
1593 u2 class_index = u2_array[i2++] = cfs->get_u2(CHECK); |
1536 u2 class_index = u2_array[i2++] = cfs->get_u2(CHECK); |
1594 guarantee_property(valid_cp_range(class_index, cp->length()) && |
1537 guarantee_property(valid_klass_reference_at(class_index), |
1595 is_klass_reference(cp, class_index), |
|
1596 "Bad class index %u in StackMap in class file %s", |
1538 "Bad class index %u in StackMap in class file %s", |
1597 class_index, CHECK); |
1539 class_index, CHECK); |
1598 } else if (tag == ITEM_Uninitialized) { |
1540 } else if (tag == ITEM_Uninitialized) { |
1599 u2 offset = u2_array[i2++] = cfs->get_u2(CHECK); |
1541 u2 offset = u2_array[i2++] = cfs->get_u2(CHECK); |
1600 guarantee_property( |
1542 guarantee_property( |
1611 u2_array[*u2_index] = index; |
1553 u2_array[*u2_index] = index; |
1612 *u1_index = i1; |
1554 *u1_index = i1; |
1613 *u2_index = i2; |
1555 *u2_index = i2; |
1614 } |
1556 } |
1615 |
1557 |
1616 Array<u1>* ClassFileParser::parse_stackmap_table( |
1558 u1* ClassFileParser::parse_stackmap_table( |
1617 ClassLoaderData* loader_data, |
|
1618 u4 code_attribute_length, TRAPS) { |
1559 u4 code_attribute_length, TRAPS) { |
1619 if (code_attribute_length == 0) |
1560 if (code_attribute_length == 0) |
1620 return NULL; |
1561 return NULL; |
1621 |
1562 |
1622 ClassFileStream* cfs = stream(); |
1563 ClassFileStream* cfs = stream(); |
1627 stream()->skip_u1(code_attribute_length, CHECK_NULL); |
1568 stream()->skip_u1(code_attribute_length, CHECK_NULL); |
1628 |
1569 |
1629 if (!_need_verify && !DumpSharedSpaces) { |
1570 if (!_need_verify && !DumpSharedSpaces) { |
1630 return NULL; |
1571 return NULL; |
1631 } |
1572 } |
1632 |
1573 return stackmap_table_start; |
1633 Array<u1>* stackmap_data = |
|
1634 MetadataFactory::new_array<u1>(loader_data, code_attribute_length, 0, CHECK_NULL); |
|
1635 |
|
1636 memcpy((void*)stackmap_data->adr_at(0), |
|
1637 (void*)stackmap_table_start, code_attribute_length); |
|
1638 return stackmap_data; |
|
1639 } |
1574 } |
1640 |
1575 |
1641 u2* ClassFileParser::parse_checked_exceptions(u2* checked_exceptions_length, |
1576 u2* ClassFileParser::parse_checked_exceptions(u2* checked_exceptions_length, |
1642 u4 method_attribute_length, |
1577 u4 method_attribute_length, |
1643 constantPoolHandle cp, TRAPS) { |
1578 TRAPS) { |
1644 ClassFileStream* cfs = stream(); |
1579 ClassFileStream* cfs = stream(); |
1645 cfs->guarantee_more(2, CHECK_NULL); // checked_exceptions_length |
1580 cfs->guarantee_more(2, CHECK_NULL); // checked_exceptions_length |
1646 *checked_exceptions_length = cfs->get_u2_fast(); |
1581 *checked_exceptions_length = cfs->get_u2_fast(); |
1647 unsigned int size = (*checked_exceptions_length) * sizeof(CheckedExceptionElement) / sizeof(u2); |
1582 unsigned int size = (*checked_exceptions_length) * sizeof(CheckedExceptionElement) / sizeof(u2); |
1648 u2* checked_exceptions_start = cfs->get_u2_buffer(); |
1583 u2* checked_exceptions_start = cfs->get_u2_buffer(); |
1655 u2 len = *checked_exceptions_length; |
1590 u2 len = *checked_exceptions_length; |
1656 cfs->guarantee_more(2 * len, CHECK_NULL); |
1591 cfs->guarantee_more(2 * len, CHECK_NULL); |
1657 for (int i = 0; i < len; i++) { |
1592 for (int i = 0; i < len; i++) { |
1658 checked_exception = cfs->get_u2_fast(); |
1593 checked_exception = cfs->get_u2_fast(); |
1659 check_property( |
1594 check_property( |
1660 valid_cp_range(checked_exception, cp->length()) && |
1595 valid_klass_reference_at(checked_exception), |
1661 is_klass_reference(cp, checked_exception), |
|
1662 "Exception name has bad type at constant pool %u in class file %s", |
1596 "Exception name has bad type at constant pool %u in class file %s", |
1663 checked_exception, CHECK_NULL); |
1597 checked_exception, CHECK_NULL); |
1664 } |
1598 } |
1665 } |
1599 } |
1666 // check exceptions attribute length |
1600 // check exceptions attribute length |
1733 } |
1667 } |
1734 return index; |
1668 return index; |
1735 } |
1669 } |
1736 |
1670 |
1737 // Sift through annotations, looking for those significant to the VM: |
1671 // Sift through annotations, looking for those significant to the VM: |
1738 void ClassFileParser::parse_annotations(ClassLoaderData* loader_data, |
1672 void ClassFileParser::parse_annotations(u1* buffer, int limit, |
1739 u1* buffer, int limit, |
|
1740 constantPoolHandle cp, |
|
1741 ClassFileParser::AnnotationCollector* coll, |
1673 ClassFileParser::AnnotationCollector* coll, |
1742 TRAPS) { |
1674 TRAPS) { |
1743 // annotations := do(nann:u2) {annotation} |
1675 // annotations := do(nann:u2) {annotation} |
1744 int index = 0; |
1676 int index = 0; |
1745 if ((index += 2) >= limit) return; // read nann |
1677 if ((index += 2) >= limit) return; // read nann |
1765 int index0 = index; |
1697 int index0 = index; |
1766 index = skip_annotation(buffer, limit, index); |
1698 index = skip_annotation(buffer, limit, index); |
1767 u1* abase = buffer + index0; |
1699 u1* abase = buffer + index0; |
1768 int atype = Bytes::get_Java_u2(abase + atype_off); |
1700 int atype = Bytes::get_Java_u2(abase + atype_off); |
1769 int count = Bytes::get_Java_u2(abase + count_off); |
1701 int count = Bytes::get_Java_u2(abase + count_off); |
1770 Symbol* aname = check_symbol_at(cp, atype); |
1702 Symbol* aname = check_symbol_at(_cp, atype); |
1771 if (aname == NULL) break; // invalid annotation name |
1703 if (aname == NULL) break; // invalid annotation name |
1772 Symbol* member = NULL; |
1704 Symbol* member = NULL; |
1773 if (count >= 1) { |
1705 if (count >= 1) { |
1774 int member_index = Bytes::get_Java_u2(abase + member_off); |
1706 int member_index = Bytes::get_Java_u2(abase + member_off); |
1775 member = check_symbol_at(cp, member_index); |
1707 member = check_symbol_at(_cp, member_index); |
1776 if (member == NULL) break; // invalid member name |
1708 if (member == NULL) break; // invalid member name |
1777 } |
1709 } |
1778 |
1710 |
1779 // Here is where parsing particular annotations will take place. |
1711 // Here is where parsing particular annotations will take place. |
1780 AnnotationCollector::ID id = coll->annotation_index(loader_data, aname); |
1712 AnnotationCollector::ID id = coll->annotation_index(_loader_data, aname); |
1781 if (id == AnnotationCollector::_unknown) continue; |
1713 if (id == AnnotationCollector::_unknown) continue; |
1782 coll->set_annotation(id); |
1714 coll->set_annotation(id); |
1783 |
1715 |
1784 if (id == AnnotationCollector::_sun_misc_Contended) { |
1716 if (id == AnnotationCollector::_sun_misc_Contended) { |
1785 if (count == 1 |
1717 if (count == 1 |
1834 void ClassFileParser::FieldAnnotationCollector::apply_to(FieldInfo* f) { |
1766 void ClassFileParser::FieldAnnotationCollector::apply_to(FieldInfo* f) { |
1835 if (is_contended()) |
1767 if (is_contended()) |
1836 f->set_contended_group(contended_group()); |
1768 f->set_contended_group(contended_group()); |
1837 } |
1769 } |
1838 |
1770 |
1771 ClassFileParser::FieldAnnotationCollector::~FieldAnnotationCollector() { |
|
1772 // If there's an error deallocate metadata for field annotations |
|
1773 MetadataFactory::free_array<u1>(_loader_data, _field_annotations); |
|
1774 MetadataFactory::free_array<u1>(_loader_data, _field_type_annotations); |
|
1775 } |
|
1776 |
|
1839 void ClassFileParser::MethodAnnotationCollector::apply_to(methodHandle m) { |
1777 void ClassFileParser::MethodAnnotationCollector::apply_to(methodHandle m) { |
1840 if (has_annotation(_method_ForceInline)) |
1778 if (has_annotation(_method_ForceInline)) |
1841 m->set_force_inline(true); |
1779 m->set_force_inline(true); |
1842 if (has_annotation(_method_DontInline)) |
1780 if (has_annotation(_method_DontInline)) |
1843 m->set_dont_inline(true); |
1781 m->set_dont_inline(true); |
1892 // If no duplicates, add LVT elem in hashtable lvt_Hash. |
1830 // If no duplicates, add LVT elem in hashtable lvt_Hash. |
1893 if (LVT_put_after_lookup(lvt, lvt_Hash) == false |
1831 if (LVT_put_after_lookup(lvt, lvt_Hash) == false |
1894 && _need_verify |
1832 && _need_verify |
1895 && _major_version >= JAVA_1_5_VERSION) { |
1833 && _major_version >= JAVA_1_5_VERSION) { |
1896 clear_hashtable(lvt_Hash); |
1834 clear_hashtable(lvt_Hash); |
1897 ConstantPool* cp = cm->constants(); |
|
1898 classfile_parse_error("Duplicated LocalVariableTable attribute " |
1835 classfile_parse_error("Duplicated LocalVariableTable attribute " |
1899 "entry for '%s' in class file %s", |
1836 "entry for '%s' in class file %s", |
1900 cp->symbol_at(lvt->name_cp_index)->as_utf8(), |
1837 _cp->symbol_at(lvt->name_cp_index)->as_utf8(), |
1901 CHECK); |
1838 CHECK); |
1902 } |
1839 } |
1903 } |
1840 } |
1904 } |
1841 } |
1905 |
1842 |
1914 int index = hash(&lvtt_elem); |
1851 int index = hash(&lvtt_elem); |
1915 LVT_Hash* entry = LVT_lookup(&lvtt_elem, index, lvt_Hash); |
1852 LVT_Hash* entry = LVT_lookup(&lvtt_elem, index, lvt_Hash); |
1916 if (entry == NULL) { |
1853 if (entry == NULL) { |
1917 if (_need_verify) { |
1854 if (_need_verify) { |
1918 clear_hashtable(lvt_Hash); |
1855 clear_hashtable(lvt_Hash); |
1919 ConstantPool* cp = cm->constants(); |
|
1920 classfile_parse_error("LVTT entry for '%s' in class file %s " |
1856 classfile_parse_error("LVTT entry for '%s' in class file %s " |
1921 "does not match any LVT entry", |
1857 "does not match any LVT entry", |
1922 cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(), |
1858 _cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(), |
1923 CHECK); |
1859 CHECK); |
1924 } |
1860 } |
1925 } else if (entry->_elem->signature_cp_index != 0 && _need_verify) { |
1861 } else if (entry->_elem->signature_cp_index != 0 && _need_verify) { |
1926 clear_hashtable(lvt_Hash); |
1862 clear_hashtable(lvt_Hash); |
1927 ConstantPool* cp = cm->constants(); |
|
1928 classfile_parse_error("Duplicated LocalVariableTypeTable attribute " |
1863 classfile_parse_error("Duplicated LocalVariableTypeTable attribute " |
1929 "entry for '%s' in class file %s", |
1864 "entry for '%s' in class file %s", |
1930 cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(), |
1865 _cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(), |
1931 CHECK); |
1866 CHECK); |
1932 } else { |
1867 } else { |
1933 // to add generic signatures into LocalVariableTable |
1868 // to add generic signatures into LocalVariableTable |
1934 entry->_elem->signature_cp_index = lvtt_elem.descriptor_cp_index; |
1869 entry->_elem->signature_cp_index = lvtt_elem.descriptor_cp_index; |
1935 } |
1870 } |
1937 } |
1872 } |
1938 clear_hashtable(lvt_Hash); |
1873 clear_hashtable(lvt_Hash); |
1939 } |
1874 } |
1940 |
1875 |
1941 |
1876 |
1942 void ClassFileParser::copy_method_annotations(ClassLoaderData* loader_data, |
1877 void ClassFileParser::copy_method_annotations(ConstMethod* cm, |
1943 ConstMethod* cm, |
|
1944 u1* runtime_visible_annotations, |
1878 u1* runtime_visible_annotations, |
1945 int runtime_visible_annotations_length, |
1879 int runtime_visible_annotations_length, |
1946 u1* runtime_invisible_annotations, |
1880 u1* runtime_invisible_annotations, |
1947 int runtime_invisible_annotations_length, |
1881 int runtime_invisible_annotations_length, |
1948 u1* runtime_visible_parameter_annotations, |
1882 u1* runtime_visible_parameter_annotations, |
1959 |
1893 |
1960 AnnotationArray* a; |
1894 AnnotationArray* a; |
1961 |
1895 |
1962 if (runtime_visible_annotations_length + |
1896 if (runtime_visible_annotations_length + |
1963 runtime_invisible_annotations_length > 0) { |
1897 runtime_invisible_annotations_length > 0) { |
1964 a = assemble_annotations(loader_data, |
1898 a = assemble_annotations(runtime_visible_annotations, |
1965 runtime_visible_annotations, |
|
1966 runtime_visible_annotations_length, |
1899 runtime_visible_annotations_length, |
1967 runtime_invisible_annotations, |
1900 runtime_invisible_annotations, |
1968 runtime_invisible_annotations_length, |
1901 runtime_invisible_annotations_length, |
1969 CHECK); |
1902 CHECK); |
1970 cm->set_method_annotations(a); |
1903 cm->set_method_annotations(a); |
1971 } |
1904 } |
1972 |
1905 |
1973 if (runtime_visible_parameter_annotations_length + |
1906 if (runtime_visible_parameter_annotations_length + |
1974 runtime_invisible_parameter_annotations_length > 0) { |
1907 runtime_invisible_parameter_annotations_length > 0) { |
1975 a = assemble_annotations(loader_data, |
1908 a = assemble_annotations(runtime_visible_parameter_annotations, |
1976 runtime_visible_parameter_annotations, |
|
1977 runtime_visible_parameter_annotations_length, |
1909 runtime_visible_parameter_annotations_length, |
1978 runtime_invisible_parameter_annotations, |
1910 runtime_invisible_parameter_annotations, |
1979 runtime_invisible_parameter_annotations_length, |
1911 runtime_invisible_parameter_annotations_length, |
1980 CHECK); |
1912 CHECK); |
1981 cm->set_parameter_annotations(a); |
1913 cm->set_parameter_annotations(a); |
1982 } |
1914 } |
1983 |
1915 |
1984 if (annotation_default_length > 0) { |
1916 if (annotation_default_length > 0) { |
1985 a = assemble_annotations(loader_data, |
1917 a = assemble_annotations(annotation_default, |
1986 annotation_default, |
|
1987 annotation_default_length, |
1918 annotation_default_length, |
1988 NULL, |
1919 NULL, |
1989 0, |
1920 0, |
1990 CHECK); |
1921 CHECK); |
1991 cm->set_default_annotations(a); |
1922 cm->set_default_annotations(a); |
1992 } |
1923 } |
1993 |
1924 |
1994 if (runtime_visible_type_annotations_length + |
1925 if (runtime_visible_type_annotations_length + |
1995 runtime_invisible_type_annotations_length > 0) { |
1926 runtime_invisible_type_annotations_length > 0) { |
1996 a = assemble_annotations(loader_data, |
1927 a = assemble_annotations(runtime_visible_type_annotations, |
1997 runtime_visible_type_annotations, |
|
1998 runtime_visible_type_annotations_length, |
1928 runtime_visible_type_annotations_length, |
1999 runtime_invisible_type_annotations, |
1929 runtime_invisible_type_annotations, |
2000 runtime_invisible_type_annotations_length, |
1930 runtime_invisible_type_annotations_length, |
2001 CHECK); |
1931 CHECK); |
2002 cm->set_type_annotations(a); |
1932 cm->set_type_annotations(a); |
2011 // |
1941 // |
2012 // The promoted_flags parameter is used to pass relevant access_flags |
1942 // The promoted_flags parameter is used to pass relevant access_flags |
2013 // from the method back up to the containing klass. These flag values |
1943 // from the method back up to the containing klass. These flag values |
2014 // are added to klass's access_flags. |
1944 // are added to klass's access_flags. |
2015 |
1945 |
2016 methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data, |
1946 methodHandle ClassFileParser::parse_method(bool is_interface, |
2017 constantPoolHandle cp, |
|
2018 bool is_interface, |
|
2019 AccessFlags *promoted_flags, |
1947 AccessFlags *promoted_flags, |
2020 TRAPS) { |
1948 TRAPS) { |
2021 ClassFileStream* cfs = stream(); |
1949 ClassFileStream* cfs = stream(); |
2022 methodHandle nullHandle; |
1950 methodHandle nullHandle; |
2023 ResourceMark rm(THREAD); |
1951 ResourceMark rm(THREAD); |
2024 // Parse fixed parts |
1952 // Parse fixed parts |
2025 cfs->guarantee_more(8, CHECK_(nullHandle)); // access_flags, name_index, descriptor_index, attributes_count |
1953 cfs->guarantee_more(8, CHECK_(nullHandle)); // access_flags, name_index, descriptor_index, attributes_count |
2026 |
1954 |
2027 int flags = cfs->get_u2_fast(); |
1955 int flags = cfs->get_u2_fast(); |
2028 u2 name_index = cfs->get_u2_fast(); |
1956 u2 name_index = cfs->get_u2_fast(); |
2029 int cp_size = cp->length(); |
1957 int cp_size = _cp->length(); |
2030 check_property( |
1958 check_property( |
2031 valid_cp_range(name_index, cp_size) && |
1959 valid_symbol_at(name_index), |
2032 cp->tag_at(name_index).is_utf8(), |
|
2033 "Illegal constant pool index %u for method name in class file %s", |
1960 "Illegal constant pool index %u for method name in class file %s", |
2034 name_index, CHECK_(nullHandle)); |
1961 name_index, CHECK_(nullHandle)); |
2035 Symbol* name = cp->symbol_at(name_index); |
1962 Symbol* name = _cp->symbol_at(name_index); |
2036 verify_legal_method_name(name, CHECK_(nullHandle)); |
1963 verify_legal_method_name(name, CHECK_(nullHandle)); |
2037 |
1964 |
2038 u2 signature_index = cfs->get_u2_fast(); |
1965 u2 signature_index = cfs->get_u2_fast(); |
2039 guarantee_property( |
1966 guarantee_property( |
2040 valid_cp_range(signature_index, cp_size) && |
1967 valid_symbol_at(signature_index), |
2041 cp->tag_at(signature_index).is_utf8(), |
|
2042 "Illegal constant pool index %u for method signature in class file %s", |
1968 "Illegal constant pool index %u for method signature in class file %s", |
2043 signature_index, CHECK_(nullHandle)); |
1969 signature_index, CHECK_(nullHandle)); |
2044 Symbol* signature = cp->symbol_at(signature_index); |
1970 Symbol* signature = _cp->symbol_at(signature_index); |
2045 |
1971 |
2046 AccessFlags access_flags; |
1972 AccessFlags access_flags; |
2047 if (name == vmSymbols::class_initializer_name()) { |
1973 if (name == vmSymbols::class_initializer_name()) { |
2048 // We ignore the other access flags for a valid class initializer. |
1974 // We ignore the other access flags for a valid class initializer. |
2049 // (JVM Spec 2nd ed., chapter 4.6) |
1975 // (JVM Spec 2nd ed., chapter 4.6) |
2095 bool method_parameters_four_byte_flags; |
2021 bool method_parameters_four_byte_flags; |
2096 bool parsed_code_attribute = false; |
2022 bool parsed_code_attribute = false; |
2097 bool parsed_checked_exceptions_attribute = false; |
2023 bool parsed_checked_exceptions_attribute = false; |
2098 bool parsed_stackmap_attribute = false; |
2024 bool parsed_stackmap_attribute = false; |
2099 // stackmap attribute - JDK1.5 |
2025 // stackmap attribute - JDK1.5 |
2100 Array<u1>* stackmap_data = NULL; |
2026 u1* stackmap_data = NULL; |
2027 int stackmap_data_length = 0; |
|
2101 u2 generic_signature_index = 0; |
2028 u2 generic_signature_index = 0; |
2102 MethodAnnotationCollector parsed_annotations; |
2029 MethodAnnotationCollector parsed_annotations; |
2103 u1* runtime_visible_annotations = NULL; |
2030 u1* runtime_visible_annotations = NULL; |
2104 int runtime_visible_annotations_length = 0; |
2031 int runtime_visible_annotations_length = 0; |
2105 u1* runtime_invisible_annotations = NULL; |
2032 u1* runtime_invisible_annotations = NULL; |
2120 while (method_attributes_count--) { |
2047 while (method_attributes_count--) { |
2121 cfs->guarantee_more(6, CHECK_(nullHandle)); // method_attribute_name_index, method_attribute_length |
2048 cfs->guarantee_more(6, CHECK_(nullHandle)); // method_attribute_name_index, method_attribute_length |
2122 u2 method_attribute_name_index = cfs->get_u2_fast(); |
2049 u2 method_attribute_name_index = cfs->get_u2_fast(); |
2123 u4 method_attribute_length = cfs->get_u4_fast(); |
2050 u4 method_attribute_length = cfs->get_u4_fast(); |
2124 check_property( |
2051 check_property( |
2125 valid_cp_range(method_attribute_name_index, cp_size) && |
2052 valid_symbol_at(method_attribute_name_index), |
2126 cp->tag_at(method_attribute_name_index).is_utf8(), |
|
2127 "Invalid method attribute name index %u in class file %s", |
2053 "Invalid method attribute name index %u in class file %s", |
2128 method_attribute_name_index, CHECK_(nullHandle)); |
2054 method_attribute_name_index, CHECK_(nullHandle)); |
2129 |
2055 |
2130 Symbol* method_attribute_name = cp->symbol_at(method_attribute_name_index); |
2056 Symbol* method_attribute_name = _cp->symbol_at(method_attribute_name_index); |
2131 if (method_attribute_name == vmSymbols::tag_code()) { |
2057 if (method_attribute_name == vmSymbols::tag_code()) { |
2132 // Parse Code attribute |
2058 // Parse Code attribute |
2133 if (_need_verify) { |
2059 if (_need_verify) { |
2134 guarantee_property( |
2060 guarantee_property( |
2135 !access_flags.is_native() && !access_flags.is_abstract(), |
2061 !access_flags.is_native() && !access_flags.is_abstract(), |
2169 // Exception handler table |
2095 // Exception handler table |
2170 cfs->guarantee_more(2, CHECK_(nullHandle)); // exception_table_length |
2096 cfs->guarantee_more(2, CHECK_(nullHandle)); // exception_table_length |
2171 exception_table_length = cfs->get_u2_fast(); |
2097 exception_table_length = cfs->get_u2_fast(); |
2172 if (exception_table_length > 0) { |
2098 if (exception_table_length > 0) { |
2173 exception_table_start = |
2099 exception_table_start = |
2174 parse_exception_table(loader_data, code_length, exception_table_length, cp, CHECK_(nullHandle)); |
2100 parse_exception_table(code_length, exception_table_length, CHECK_(nullHandle)); |
2175 } |
2101 } |
2176 |
2102 |
2177 // Parse additional attributes in code attribute |
2103 // Parse additional attributes in code attribute |
2178 cfs->guarantee_more(2, CHECK_(nullHandle)); // code_attributes_count |
2104 cfs->guarantee_more(2, CHECK_(nullHandle)); // code_attributes_count |
2179 u2 code_attributes_count = cfs->get_u2_fast(); |
2105 u2 code_attributes_count = cfs->get_u2_fast(); |
2202 u2 code_attribute_name_index = cfs->get_u2_fast(); |
2128 u2 code_attribute_name_index = cfs->get_u2_fast(); |
2203 u4 code_attribute_length = cfs->get_u4_fast(); |
2129 u4 code_attribute_length = cfs->get_u4_fast(); |
2204 calculated_attribute_length += code_attribute_length + |
2130 calculated_attribute_length += code_attribute_length + |
2205 sizeof(code_attribute_name_index) + |
2131 sizeof(code_attribute_name_index) + |
2206 sizeof(code_attribute_length); |
2132 sizeof(code_attribute_length); |
2207 check_property(valid_cp_range(code_attribute_name_index, cp_size) && |
2133 check_property(valid_symbol_at(code_attribute_name_index), |
2208 cp->tag_at(code_attribute_name_index).is_utf8(), |
|
2209 "Invalid code attribute name index %u in class file %s", |
2134 "Invalid code attribute name index %u in class file %s", |
2210 code_attribute_name_index, |
2135 code_attribute_name_index, |
2211 CHECK_(nullHandle)); |
2136 CHECK_(nullHandle)); |
2212 if (LoadLineNumberTables && |
2137 if (LoadLineNumberTables && |
2213 cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_line_number_table()) { |
2138 _cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_line_number_table()) { |
2214 // Parse and compress line number table |
2139 // Parse and compress line number table |
2215 parse_linenumber_table(code_attribute_length, code_length, |
2140 parse_linenumber_table(code_attribute_length, code_length, |
2216 &linenumber_table, CHECK_(nullHandle)); |
2141 &linenumber_table, CHECK_(nullHandle)); |
2217 |
2142 |
2218 } else if (LoadLocalVariableTables && |
2143 } else if (LoadLocalVariableTables && |
2219 cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_local_variable_table()) { |
2144 _cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_local_variable_table()) { |
2220 // Parse local variable table |
2145 // Parse local variable table |
2221 if (!lvt_allocated) { |
2146 if (!lvt_allocated) { |
2222 localvariable_table_length = NEW_RESOURCE_ARRAY_IN_THREAD( |
2147 localvariable_table_length = NEW_RESOURCE_ARRAY_IN_THREAD( |
2223 THREAD, u2, INITIAL_MAX_LVT_NUMBER); |
2148 THREAD, u2, INITIAL_MAX_LVT_NUMBER); |
2224 localvariable_table_start = NEW_RESOURCE_ARRAY_IN_THREAD( |
2149 localvariable_table_start = NEW_RESOURCE_ARRAY_IN_THREAD( |
2236 } |
2161 } |
2237 localvariable_table_start[lvt_cnt] = |
2162 localvariable_table_start[lvt_cnt] = |
2238 parse_localvariable_table(code_length, |
2163 parse_localvariable_table(code_length, |
2239 max_locals, |
2164 max_locals, |
2240 code_attribute_length, |
2165 code_attribute_length, |
2241 cp, |
|
2242 &localvariable_table_length[lvt_cnt], |
2166 &localvariable_table_length[lvt_cnt], |
2243 false, // is not LVTT |
2167 false, // is not LVTT |
2244 CHECK_(nullHandle)); |
2168 CHECK_(nullHandle)); |
2245 total_lvt_length += localvariable_table_length[lvt_cnt]; |
2169 total_lvt_length += localvariable_table_length[lvt_cnt]; |
2246 lvt_cnt++; |
2170 lvt_cnt++; |
2247 } else if (LoadLocalVariableTypeTables && |
2171 } else if (LoadLocalVariableTypeTables && |
2248 _major_version >= JAVA_1_5_VERSION && |
2172 _major_version >= JAVA_1_5_VERSION && |
2249 cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_local_variable_type_table()) { |
2173 _cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_local_variable_type_table()) { |
2250 if (!lvt_allocated) { |
2174 if (!lvt_allocated) { |
2251 localvariable_table_length = NEW_RESOURCE_ARRAY_IN_THREAD( |
2175 localvariable_table_length = NEW_RESOURCE_ARRAY_IN_THREAD( |
2252 THREAD, u2, INITIAL_MAX_LVT_NUMBER); |
2176 THREAD, u2, INITIAL_MAX_LVT_NUMBER); |
2253 localvariable_table_start = NEW_RESOURCE_ARRAY_IN_THREAD( |
2177 localvariable_table_start = NEW_RESOURCE_ARRAY_IN_THREAD( |
2254 THREAD, u2*, INITIAL_MAX_LVT_NUMBER); |
2178 THREAD, u2*, INITIAL_MAX_LVT_NUMBER); |
2266 } |
2190 } |
2267 localvariable_type_table_start[lvtt_cnt] = |
2191 localvariable_type_table_start[lvtt_cnt] = |
2268 parse_localvariable_table(code_length, |
2192 parse_localvariable_table(code_length, |
2269 max_locals, |
2193 max_locals, |
2270 code_attribute_length, |
2194 code_attribute_length, |
2271 cp, |
|
2272 &localvariable_type_table_length[lvtt_cnt], |
2195 &localvariable_type_table_length[lvtt_cnt], |
2273 true, // is LVTT |
2196 true, // is LVTT |
2274 CHECK_(nullHandle)); |
2197 CHECK_(nullHandle)); |
2275 lvtt_cnt++; |
2198 lvtt_cnt++; |
2276 } else if (UseSplitVerifier && |
2199 } else if (UseSplitVerifier && |
2277 _major_version >= Verifier::STACKMAP_ATTRIBUTE_MAJOR_VERSION && |
2200 _major_version >= Verifier::STACKMAP_ATTRIBUTE_MAJOR_VERSION && |
2278 cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_stack_map_table()) { |
2201 _cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_stack_map_table()) { |
2279 // Stack map is only needed by the new verifier in JDK1.5. |
2202 // Stack map is only needed by the new verifier in JDK1.5. |
2280 if (parsed_stackmap_attribute) { |
2203 if (parsed_stackmap_attribute) { |
2281 classfile_parse_error("Multiple StackMapTable attributes in class file %s", CHECK_(nullHandle)); |
2204 classfile_parse_error("Multiple StackMapTable attributes in class file %s", CHECK_(nullHandle)); |
2282 } |
2205 } |
2283 stackmap_data = parse_stackmap_table(loader_data, code_attribute_length, CHECK_(nullHandle)); |
2206 stackmap_data = parse_stackmap_table(code_attribute_length, CHECK_(nullHandle)); |
2207 stackmap_data_length = code_attribute_length; |
|
2284 parsed_stackmap_attribute = true; |
2208 parsed_stackmap_attribute = true; |
2285 } else { |
2209 } else { |
2286 // Skip unknown attributes |
2210 // Skip unknown attributes |
2287 cfs->skip_u1(code_attribute_length, CHECK_(nullHandle)); |
2211 cfs->skip_u1(code_attribute_length, CHECK_(nullHandle)); |
2288 } |
2212 } |
2299 } |
2223 } |
2300 parsed_checked_exceptions_attribute = true; |
2224 parsed_checked_exceptions_attribute = true; |
2301 checked_exceptions_start = |
2225 checked_exceptions_start = |
2302 parse_checked_exceptions(&checked_exceptions_length, |
2226 parse_checked_exceptions(&checked_exceptions_length, |
2303 method_attribute_length, |
2227 method_attribute_length, |
2304 cp, CHECK_(nullHandle)); |
2228 CHECK_(nullHandle)); |
2305 } else if (method_attribute_name == vmSymbols::tag_method_parameters()) { |
2229 } else if (method_attribute_name == vmSymbols::tag_method_parameters()) { |
2306 // reject multiple method parameters |
2230 // reject multiple method parameters |
2307 if (method_parameters_seen) { |
2231 if (method_parameters_seen) { |
2308 classfile_parse_error("Multiple MethodParameters attributes in class file %s", CHECK_(nullHandle)); |
2232 classfile_parse_error("Multiple MethodParameters attributes in class file %s", CHECK_(nullHandle)); |
2309 } |
2233 } |
2357 generic_signature_index = cfs->get_u2_fast(); |
2281 generic_signature_index = cfs->get_u2_fast(); |
2358 } else if (method_attribute_name == vmSymbols::tag_runtime_visible_annotations()) { |
2282 } else if (method_attribute_name == vmSymbols::tag_runtime_visible_annotations()) { |
2359 runtime_visible_annotations_length = method_attribute_length; |
2283 runtime_visible_annotations_length = method_attribute_length; |
2360 runtime_visible_annotations = cfs->get_u1_buffer(); |
2284 runtime_visible_annotations = cfs->get_u1_buffer(); |
2361 assert(runtime_visible_annotations != NULL, "null visible annotations"); |
2285 assert(runtime_visible_annotations != NULL, "null visible annotations"); |
2362 parse_annotations(loader_data, |
2286 parse_annotations(runtime_visible_annotations, |
2363 runtime_visible_annotations, |
2287 runtime_visible_annotations_length, &parsed_annotations, |
2364 runtime_visible_annotations_length, cp, &parsed_annotations, |
|
2365 CHECK_(nullHandle)); |
2288 CHECK_(nullHandle)); |
2366 cfs->skip_u1(runtime_visible_annotations_length, CHECK_(nullHandle)); |
2289 cfs->skip_u1(runtime_visible_annotations_length, CHECK_(nullHandle)); |
2367 } else if (PreserveAllAnnotations && method_attribute_name == vmSymbols::tag_runtime_invisible_annotations()) { |
2290 } else if (PreserveAllAnnotations && method_attribute_name == vmSymbols::tag_runtime_invisible_annotations()) { |
2368 runtime_invisible_annotations_length = method_attribute_length; |
2291 runtime_invisible_annotations_length = method_attribute_length; |
2369 runtime_invisible_annotations = cfs->get_u1_buffer(); |
2292 runtime_invisible_annotations = cfs->get_u1_buffer(); |
2432 runtime_invisible_type_annotations_length, |
2355 runtime_invisible_type_annotations_length, |
2433 annotation_default_length, |
2356 annotation_default_length, |
2434 0); |
2357 0); |
2435 |
2358 |
2436 Method* m = Method::allocate( |
2359 Method* m = Method::allocate( |
2437 loader_data, code_length, access_flags, &sizes, |
2360 _loader_data, code_length, access_flags, &sizes, |
2438 ConstMethod::NORMAL, CHECK_(nullHandle)); |
2361 ConstMethod::NORMAL, CHECK_(nullHandle)); |
2439 |
2362 |
2440 ClassLoadingService::add_class_method_size(m->size()*HeapWordSize); |
2363 ClassLoadingService::add_class_method_size(m->size()*HeapWordSize); |
2441 |
2364 |
2442 // Fill in information from fixed part (access_flags already set) |
2365 // Fill in information from fixed part (access_flags already set) |
2443 m->set_constants(cp()); |
2366 m->set_constants(_cp); |
2444 m->set_name_index(name_index); |
2367 m->set_name_index(name_index); |
2445 m->set_signature_index(signature_index); |
2368 m->set_signature_index(signature_index); |
2446 #ifdef CC_INTERP |
2369 #ifdef CC_INTERP |
2447 // hmm is there a gc issue here?? |
2370 // hmm is there a gc issue here?? |
2448 ResultTypeFinder rtf(cp->symbol_at(signature_index)); |
2371 ResultTypeFinder rtf(_cp->symbol_at(signature_index)); |
2449 m->set_result_index(rtf.type()); |
2372 m->set_result_index(rtf.type()); |
2450 #endif |
2373 #endif |
2451 |
2374 |
2452 if (args_size >= 0) { |
2375 if (args_size >= 0) { |
2453 m->set_size_of_parameters(args_size); |
2376 m->set_size_of_parameters(args_size); |
2462 #endif |
2385 #endif |
2463 |
2386 |
2464 // Fill in code attribute information |
2387 // Fill in code attribute information |
2465 m->set_max_stack(max_stack); |
2388 m->set_max_stack(max_stack); |
2466 m->set_max_locals(max_locals); |
2389 m->set_max_locals(max_locals); |
2467 m->constMethod()->set_stackmap_data(stackmap_data); |
2390 if (stackmap_data != NULL) { |
2391 m->constMethod()->copy_stackmap_data(_loader_data, stackmap_data, |
|
2392 stackmap_data_length, CHECK_NULL); |
|
2393 } |
|
2468 |
2394 |
2469 // Copy byte codes |
2395 // Copy byte codes |
2470 m->set_code(code_start); |
2396 m->set_code(code_start); |
2471 |
2397 |
2472 // Copy line number table |
2398 // Copy line number table |
2518 |
2444 |
2519 if (parsed_annotations.has_any_annotations()) |
2445 if (parsed_annotations.has_any_annotations()) |
2520 parsed_annotations.apply_to(m); |
2446 parsed_annotations.apply_to(m); |
2521 |
2447 |
2522 // Copy annotations |
2448 // Copy annotations |
2523 copy_method_annotations(loader_data, m->constMethod(), |
2449 copy_method_annotations(m->constMethod(), |
2524 runtime_visible_annotations, |
2450 runtime_visible_annotations, |
2525 runtime_visible_annotations_length, |
2451 runtime_visible_annotations_length, |
2526 runtime_invisible_annotations, |
2452 runtime_invisible_annotations, |
2527 runtime_invisible_annotations_length, |
2453 runtime_invisible_annotations_length, |
2528 runtime_visible_parameter_annotations, |
2454 runtime_visible_parameter_annotations, |
2558 |
2484 |
2559 // The promoted_flags parameter is used to pass relevant access_flags |
2485 // The promoted_flags parameter is used to pass relevant access_flags |
2560 // from the methods back up to the containing klass. These flag values |
2486 // from the methods back up to the containing klass. These flag values |
2561 // are added to klass's access_flags. |
2487 // are added to klass's access_flags. |
2562 |
2488 |
2563 Array<Method*>* ClassFileParser::parse_methods(ClassLoaderData* loader_data, |
2489 Array<Method*>* ClassFileParser::parse_methods(bool is_interface, |
2564 constantPoolHandle cp, |
|
2565 bool is_interface, |
|
2566 AccessFlags* promoted_flags, |
2490 AccessFlags* promoted_flags, |
2567 bool* has_final_method, |
2491 bool* has_final_method, |
2568 bool* has_default_methods, |
2492 bool* has_default_methods, |
2569 TRAPS) { |
2493 TRAPS) { |
2570 ClassFileStream* cfs = stream(); |
2494 ClassFileStream* cfs = stream(); |
2571 cfs->guarantee_more(2, CHECK_NULL); // length |
2495 cfs->guarantee_more(2, CHECK_NULL); // length |
2572 u2 length = cfs->get_u2_fast(); |
2496 u2 length = cfs->get_u2_fast(); |
2573 if (length == 0) { |
2497 if (length == 0) { |
2574 return Universe::the_empty_method_array(); |
2498 _methods = Universe::the_empty_method_array(); |
2575 } else { |
2499 } else { |
2576 // FIXME: Handle leaks at later failures. |
2500 _methods = MetadataFactory::new_array<Method*>(_loader_data, length, NULL, CHECK_NULL); |
2577 Array<Method*>* methods = MetadataFactory::new_array<Method*>(loader_data, length, NULL, CHECK_NULL); |
|
2578 |
2501 |
2579 HandleMark hm(THREAD); |
2502 HandleMark hm(THREAD); |
2580 for (int index = 0; index < length; index++) { |
2503 for (int index = 0; index < length; index++) { |
2581 methodHandle method = parse_method(loader_data, |
2504 methodHandle method = parse_method(is_interface, |
2582 cp, is_interface, |
|
2583 promoted_flags, |
2505 promoted_flags, |
2584 CHECK_NULL); |
2506 CHECK_NULL); |
2585 |
2507 |
2586 if (method->is_final()) { |
2508 if (method->is_final()) { |
2587 *has_final_method = true; |
2509 *has_final_method = true; |
2588 } |
2510 } |
2589 if (is_interface && !method->is_abstract() && !method->is_static()) { |
2511 if (is_interface && !method->is_abstract() && !method->is_static()) { |
2590 // default method |
2512 // default method |
2591 *has_default_methods = true; |
2513 *has_default_methods = true; |
2592 } |
2514 } |
2593 methods->at_put(index, method()); |
2515 _methods->at_put(index, method()); |
2594 } |
2516 } |
2595 |
2517 |
2596 if (_need_verify && length > 1) { |
2518 if (_need_verify && length > 1) { |
2597 // Check duplicated methods |
2519 // Check duplicated methods |
2598 ResourceMark rm(THREAD); |
2520 ResourceMark rm(THREAD); |
2601 initialize_hashtable(names_and_sigs); |
2523 initialize_hashtable(names_and_sigs); |
2602 bool dup = false; |
2524 bool dup = false; |
2603 { |
2525 { |
2604 debug_only(No_Safepoint_Verifier nsv;) |
2526 debug_only(No_Safepoint_Verifier nsv;) |
2605 for (int i = 0; i < length; i++) { |
2527 for (int i = 0; i < length; i++) { |
2606 Method* m = methods->at(i); |
2528 Method* m = _methods->at(i); |
2607 // If no duplicates, add name/signature in hashtable names_and_sigs. |
2529 // If no duplicates, add name/signature in hashtable names_and_sigs. |
2608 if (!put_after_lookup(m->name(), m->signature(), names_and_sigs)) { |
2530 if (!put_after_lookup(m->name(), m->signature(), names_and_sigs)) { |
2609 dup = true; |
2531 dup = true; |
2610 break; |
2532 break; |
2611 } |
2533 } |
2614 if (dup) { |
2536 if (dup) { |
2615 classfile_parse_error("Duplicate method name&signature in class file %s", |
2537 classfile_parse_error("Duplicate method name&signature in class file %s", |
2616 CHECK_NULL); |
2538 CHECK_NULL); |
2617 } |
2539 } |
2618 } |
2540 } |
2619 return methods; |
2541 } |
2620 } |
2542 return _methods; |
2621 } |
2543 } |
2622 |
2544 |
2623 |
2545 |
2624 Array<int>* ClassFileParser::sort_methods(ClassLoaderData* loader_data, |
2546 intArray* ClassFileParser::sort_methods(Array<Method*>* methods) { |
2625 Array<Method*>* methods, |
|
2626 TRAPS) { |
|
2627 int length = methods->length(); |
2547 int length = methods->length(); |
2628 // If JVMTI original method ordering or sharing is enabled we have to |
2548 // If JVMTI original method ordering or sharing is enabled we have to |
2629 // remember the original class file ordering. |
2549 // remember the original class file ordering. |
2630 // We temporarily use the vtable_index field in the Method* to store the |
2550 // We temporarily use the vtable_index field in the Method* to store the |
2631 // class file index, so we can read in after calling qsort. |
2551 // class file index, so we can read in after calling qsort. |
2639 } |
2559 } |
2640 // Sort method array by ascending method name (for faster lookups & vtable construction) |
2560 // Sort method array by ascending method name (for faster lookups & vtable construction) |
2641 // Note that the ordering is not alphabetical, see Symbol::fast_compare |
2561 // Note that the ordering is not alphabetical, see Symbol::fast_compare |
2642 Method::sort_methods(methods); |
2562 Method::sort_methods(methods); |
2643 |
2563 |
2564 intArray* method_ordering = NULL; |
|
2644 // If JVMTI original method ordering or sharing is enabled construct int |
2565 // If JVMTI original method ordering or sharing is enabled construct int |
2645 // array remembering the original ordering |
2566 // array remembering the original ordering |
2646 if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) { |
2567 if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) { |
2647 Array<int>* method_ordering = MetadataFactory::new_array<int>(loader_data, length, CHECK_NULL); |
2568 method_ordering = new intArray(length); |
2648 for (int index = 0; index < length; index++) { |
2569 for (int index = 0; index < length; index++) { |
2649 Method* m = methods->at(index); |
2570 Method* m = methods->at(index); |
2650 int old_index = m->vtable_index(); |
2571 int old_index = m->vtable_index(); |
2651 assert(old_index >= 0 && old_index < length, "invalid method index"); |
2572 assert(old_index >= 0 && old_index < length, "invalid method index"); |
2652 method_ordering->at_put(index, old_index); |
2573 method_ordering->at_put(index, old_index); |
2653 m->set_vtable_index(Method::invalid_vtable_index); |
2574 m->set_vtable_index(Method::invalid_vtable_index); |
2654 } |
2575 } |
2655 return method_ordering; |
2576 } |
2656 } else { |
2577 return method_ordering; |
2657 return Universe::the_empty_int_array(); |
2578 } |
2658 } |
2579 |
2659 } |
2580 |
2660 |
2581 void ClassFileParser::parse_classfile_sourcefile_attribute(TRAPS) { |
2661 |
|
2662 void ClassFileParser::parse_classfile_sourcefile_attribute(constantPoolHandle cp, TRAPS) { |
|
2663 ClassFileStream* cfs = stream(); |
2582 ClassFileStream* cfs = stream(); |
2664 cfs->guarantee_more(2, CHECK); // sourcefile_index |
2583 cfs->guarantee_more(2, CHECK); // sourcefile_index |
2665 u2 sourcefile_index = cfs->get_u2_fast(); |
2584 u2 sourcefile_index = cfs->get_u2_fast(); |
2666 check_property( |
2585 check_property( |
2667 valid_cp_range(sourcefile_index, cp->length()) && |
2586 valid_symbol_at(sourcefile_index), |
2668 cp->tag_at(sourcefile_index).is_utf8(), |
|
2669 "Invalid SourceFile attribute at constant pool index %u in class file %s", |
2587 "Invalid SourceFile attribute at constant pool index %u in class file %s", |
2670 sourcefile_index, CHECK); |
2588 sourcefile_index, CHECK); |
2671 set_class_sourcefile(cp->symbol_at(sourcefile_index)); |
2589 set_class_sourcefile(_cp->symbol_at(sourcefile_index)); |
2672 } |
2590 } |
2673 |
2591 |
2674 |
2592 |
2675 |
2593 |
2676 void ClassFileParser::parse_classfile_source_debug_extension_attribute(constantPoolHandle cp, |
2594 void ClassFileParser::parse_classfile_source_debug_extension_attribute(int length, TRAPS) { |
2677 int length, TRAPS) { |
|
2678 ClassFileStream* cfs = stream(); |
2595 ClassFileStream* cfs = stream(); |
2679 u1* sde_buffer = cfs->get_u1_buffer(); |
2596 u1* sde_buffer = cfs->get_u1_buffer(); |
2680 assert(sde_buffer != NULL, "null sde buffer"); |
2597 assert(sde_buffer != NULL, "null sde buffer"); |
2681 |
2598 |
2682 // Don't bother storing it if there is no way to retrieve it |
2599 // Don't bother storing it if there is no way to retrieve it |
2696 |
2613 |
2697 // Inner classes can be static, private or protected (classic VM does this) |
2614 // Inner classes can be static, private or protected (classic VM does this) |
2698 #define RECOGNIZED_INNER_CLASS_MODIFIERS (JVM_RECOGNIZED_CLASS_MODIFIERS | JVM_ACC_PRIVATE | JVM_ACC_PROTECTED | JVM_ACC_STATIC) |
2615 #define RECOGNIZED_INNER_CLASS_MODIFIERS (JVM_RECOGNIZED_CLASS_MODIFIERS | JVM_ACC_PRIVATE | JVM_ACC_PROTECTED | JVM_ACC_STATIC) |
2699 |
2616 |
2700 // Return number of classes in the inner classes attribute table |
2617 // Return number of classes in the inner classes attribute table |
2701 u2 ClassFileParser::parse_classfile_inner_classes_attribute(ClassLoaderData* loader_data, |
2618 u2 ClassFileParser::parse_classfile_inner_classes_attribute(u1* inner_classes_attribute_start, |
2702 u1* inner_classes_attribute_start, |
|
2703 bool parsed_enclosingmethod_attribute, |
2619 bool parsed_enclosingmethod_attribute, |
2704 u2 enclosing_method_class_index, |
2620 u2 enclosing_method_class_index, |
2705 u2 enclosing_method_method_index, |
2621 u2 enclosing_method_method_index, |
2706 constantPoolHandle cp, |
|
2707 TRAPS) { |
2622 TRAPS) { |
2708 ClassFileStream* cfs = stream(); |
2623 ClassFileStream* cfs = stream(); |
2709 u1* current_mark = cfs->current(); |
2624 u1* current_mark = cfs->current(); |
2710 u2 length = 0; |
2625 u2 length = 0; |
2711 if (inner_classes_attribute_start != NULL) { |
2626 if (inner_classes_attribute_start != NULL) { |
2722 // inner_class_access_flags, |
2637 // inner_class_access_flags, |
2723 // ... |
2638 // ... |
2724 // enclosing_method_class_index, |
2639 // enclosing_method_class_index, |
2725 // enclosing_method_method_index] |
2640 // enclosing_method_method_index] |
2726 int size = length * 4 + (parsed_enclosingmethod_attribute ? 2 : 0); |
2641 int size = length * 4 + (parsed_enclosingmethod_attribute ? 2 : 0); |
2727 // FIXME: Will leak on exceptions. |
2642 Array<u2>* inner_classes = MetadataFactory::new_array<u2>(_loader_data, size, CHECK_0); |
2728 Array<u2>* inner_classes = MetadataFactory::new_array<u2>(loader_data, size, CHECK_0); |
2643 _inner_classes = inner_classes; |
2644 |
|
2729 int index = 0; |
2645 int index = 0; |
2730 int cp_size = cp->length(); |
2646 int cp_size = _cp->length(); |
2731 cfs->guarantee_more(8 * length, CHECK_0); // 4-tuples of u2 |
2647 cfs->guarantee_more(8 * length, CHECK_0); // 4-tuples of u2 |
2732 for (int n = 0; n < length; n++) { |
2648 for (int n = 0; n < length; n++) { |
2733 // Inner class index |
2649 // Inner class index |
2734 u2 inner_class_info_index = cfs->get_u2_fast(); |
2650 u2 inner_class_info_index = cfs->get_u2_fast(); |
2735 check_property( |
2651 check_property( |
2736 inner_class_info_index == 0 || |
2652 inner_class_info_index == 0 || |
2737 (valid_cp_range(inner_class_info_index, cp_size) && |
2653 valid_klass_reference_at(inner_class_info_index), |
2738 is_klass_reference(cp, inner_class_info_index)), |
|
2739 "inner_class_info_index %u has bad constant type in class file %s", |
2654 "inner_class_info_index %u has bad constant type in class file %s", |
2740 inner_class_info_index, CHECK_0); |
2655 inner_class_info_index, CHECK_0); |
2741 // Outer class index |
2656 // Outer class index |
2742 u2 outer_class_info_index = cfs->get_u2_fast(); |
2657 u2 outer_class_info_index = cfs->get_u2_fast(); |
2743 check_property( |
2658 check_property( |
2744 outer_class_info_index == 0 || |
2659 outer_class_info_index == 0 || |
2745 (valid_cp_range(outer_class_info_index, cp_size) && |
2660 valid_klass_reference_at(outer_class_info_index), |
2746 is_klass_reference(cp, outer_class_info_index)), |
|
2747 "outer_class_info_index %u has bad constant type in class file %s", |
2661 "outer_class_info_index %u has bad constant type in class file %s", |
2748 outer_class_info_index, CHECK_0); |
2662 outer_class_info_index, CHECK_0); |
2749 // Inner class name |
2663 // Inner class name |
2750 u2 inner_name_index = cfs->get_u2_fast(); |
2664 u2 inner_name_index = cfs->get_u2_fast(); |
2751 check_property( |
2665 check_property( |
2752 inner_name_index == 0 || (valid_cp_range(inner_name_index, cp_size) && |
2666 inner_name_index == 0 || valid_symbol_at(inner_name_index), |
2753 cp->tag_at(inner_name_index).is_utf8()), |
|
2754 "inner_name_index %u has bad constant type in class file %s", |
2667 "inner_name_index %u has bad constant type in class file %s", |
2755 inner_name_index, CHECK_0); |
2668 inner_name_index, CHECK_0); |
2756 if (_need_verify) { |
2669 if (_need_verify) { |
2757 guarantee_property(inner_class_info_index != outer_class_info_index, |
2670 guarantee_property(inner_class_info_index != outer_class_info_index, |
2758 "Class is both outer and inner class in class file %s", CHECK_0); |
2671 "Class is both outer and inner class in class file %s", CHECK_0); |
2792 inner_classes->at_put(index++, enclosing_method_class_index); |
2705 inner_classes->at_put(index++, enclosing_method_class_index); |
2793 inner_classes->at_put(index++, enclosing_method_method_index); |
2706 inner_classes->at_put(index++, enclosing_method_method_index); |
2794 } |
2707 } |
2795 assert(index == size, "wrong size"); |
2708 assert(index == size, "wrong size"); |
2796 |
2709 |
2797 // Update InstanceKlass with inner class info. |
|
2798 set_class_inner_classes(inner_classes); |
|
2799 |
|
2800 // Restore buffer's current position. |
2710 // Restore buffer's current position. |
2801 cfs->set_current(current_mark); |
2711 cfs->set_current(current_mark); |
2802 |
2712 |
2803 return length; |
2713 return length; |
2804 } |
2714 } |
2805 |
2715 |
2806 void ClassFileParser::parse_classfile_synthetic_attribute(constantPoolHandle cp, TRAPS) { |
2716 void ClassFileParser::parse_classfile_synthetic_attribute(TRAPS) { |
2807 set_class_synthetic_flag(true); |
2717 set_class_synthetic_flag(true); |
2808 } |
2718 } |
2809 |
2719 |
2810 void ClassFileParser::parse_classfile_signature_attribute(constantPoolHandle cp, TRAPS) { |
2720 void ClassFileParser::parse_classfile_signature_attribute(TRAPS) { |
2811 ClassFileStream* cfs = stream(); |
2721 ClassFileStream* cfs = stream(); |
2812 u2 signature_index = cfs->get_u2(CHECK); |
2722 u2 signature_index = cfs->get_u2(CHECK); |
2813 check_property( |
2723 check_property( |
2814 valid_cp_range(signature_index, cp->length()) && |
2724 valid_symbol_at(signature_index), |
2815 cp->tag_at(signature_index).is_utf8(), |
|
2816 "Invalid constant pool index %u in Signature attribute in class file %s", |
2725 "Invalid constant pool index %u in Signature attribute in class file %s", |
2817 signature_index, CHECK); |
2726 signature_index, CHECK); |
2818 set_class_generic_signature(cp->symbol_at(signature_index)); |
2727 set_class_generic_signature(_cp->symbol_at(signature_index)); |
2819 } |
2728 } |
2820 |
2729 |
2821 void ClassFileParser::parse_classfile_bootstrap_methods_attribute(ClassLoaderData* loader_data, |
2730 void ClassFileParser::parse_classfile_bootstrap_methods_attribute(u4 attribute_byte_length, TRAPS) { |
2822 constantPoolHandle cp, |
|
2823 u4 attribute_byte_length, TRAPS) { |
|
2824 ClassFileStream* cfs = stream(); |
2731 ClassFileStream* cfs = stream(); |
2825 u1* current_start = cfs->current(); |
2732 u1* current_start = cfs->current(); |
2826 |
2733 |
2827 cfs->guarantee_more(2, CHECK); // length |
2734 cfs->guarantee_more(2, CHECK); // length |
2828 int attribute_array_length = cfs->get_u2_fast(); |
2735 int attribute_array_length = cfs->get_u2_fast(); |
2839 |
2746 |
2840 // The attribute is copied into a short[] array. |
2747 // The attribute is copied into a short[] array. |
2841 // The array begins with a series of short[2] pairs, one for each tuple. |
2748 // The array begins with a series of short[2] pairs, one for each tuple. |
2842 int index_size = (attribute_array_length * 2); |
2749 int index_size = (attribute_array_length * 2); |
2843 |
2750 |
2844 Array<u2>* operands = MetadataFactory::new_array<u2>(loader_data, index_size + operand_count, CHECK); |
2751 Array<u2>* operands = MetadataFactory::new_array<u2>(_loader_data, index_size + operand_count, CHECK); |
2752 |
|
2753 // Eagerly assign operands so they will be deallocated with the constant |
|
2754 // pool if there is an error. |
|
2755 _cp->set_operands(operands); |
|
2845 |
2756 |
2846 int operand_fill_index = index_size; |
2757 int operand_fill_index = index_size; |
2847 int cp_size = cp->length(); |
2758 int cp_size = _cp->length(); |
2848 |
2759 |
2849 for (int n = 0; n < attribute_array_length; n++) { |
2760 for (int n = 0; n < attribute_array_length; n++) { |
2850 // Store a 32-bit offset into the header of the operand array. |
2761 // Store a 32-bit offset into the header of the operand array. |
2851 ConstantPool::operand_offset_at_put(operands, n, operand_fill_index); |
2762 ConstantPool::operand_offset_at_put(operands, n, operand_fill_index); |
2852 |
2763 |
2854 cfs->guarantee_more(sizeof(u2) * 2, CHECK); // bsm, argc |
2765 cfs->guarantee_more(sizeof(u2) * 2, CHECK); // bsm, argc |
2855 u2 bootstrap_method_index = cfs->get_u2_fast(); |
2766 u2 bootstrap_method_index = cfs->get_u2_fast(); |
2856 u2 argument_count = cfs->get_u2_fast(); |
2767 u2 argument_count = cfs->get_u2_fast(); |
2857 check_property( |
2768 check_property( |
2858 valid_cp_range(bootstrap_method_index, cp_size) && |
2769 valid_cp_range(bootstrap_method_index, cp_size) && |
2859 cp->tag_at(bootstrap_method_index).is_method_handle(), |
2770 _cp->tag_at(bootstrap_method_index).is_method_handle(), |
2860 "bootstrap_method_index %u has bad constant type in class file %s", |
2771 "bootstrap_method_index %u has bad constant type in class file %s", |
2861 bootstrap_method_index, |
2772 bootstrap_method_index, |
2862 CHECK); |
2773 CHECK); |
2863 operands->at_put(operand_fill_index++, bootstrap_method_index); |
2774 operands->at_put(operand_fill_index++, bootstrap_method_index); |
2864 operands->at_put(operand_fill_index++, argument_count); |
2775 operands->at_put(operand_fill_index++, argument_count); |
2866 cfs->guarantee_more(sizeof(u2) * argument_count, CHECK); // argv[argc] |
2777 cfs->guarantee_more(sizeof(u2) * argument_count, CHECK); // argv[argc] |
2867 for (int j = 0; j < argument_count; j++) { |
2778 for (int j = 0; j < argument_count; j++) { |
2868 u2 argument_index = cfs->get_u2_fast(); |
2779 u2 argument_index = cfs->get_u2_fast(); |
2869 check_property( |
2780 check_property( |
2870 valid_cp_range(argument_index, cp_size) && |
2781 valid_cp_range(argument_index, cp_size) && |
2871 cp->tag_at(argument_index).is_loadable_constant(), |
2782 _cp->tag_at(argument_index).is_loadable_constant(), |
2872 "argument_index %u has bad constant type in class file %s", |
2783 "argument_index %u has bad constant type in class file %s", |
2873 argument_index, |
2784 argument_index, |
2874 CHECK); |
2785 CHECK); |
2875 operands->at_put(operand_fill_index++, argument_index); |
2786 operands->at_put(operand_fill_index++, argument_index); |
2876 } |
2787 } |
2881 |
2792 |
2882 u1* current_end = cfs->current(); |
2793 u1* current_end = cfs->current(); |
2883 guarantee_property(current_end == current_start + attribute_byte_length, |
2794 guarantee_property(current_end == current_start + attribute_byte_length, |
2884 "Bad length on BootstrapMethods in class file %s", |
2795 "Bad length on BootstrapMethods in class file %s", |
2885 CHECK); |
2796 CHECK); |
2886 |
2797 } |
2887 cp->set_operands(operands); |
2798 |
2888 } |
2799 void ClassFileParser::parse_classfile_attributes(ClassFileParser::ClassAnnotationCollector* parsed_annotations, |
2889 |
|
2890 void ClassFileParser::parse_classfile_attributes(ClassLoaderData* loader_data, |
|
2891 constantPoolHandle cp, |
|
2892 ClassFileParser::ClassAnnotationCollector* parsed_annotations, |
|
2893 TRAPS) { |
2800 TRAPS) { |
2894 ClassFileStream* cfs = stream(); |
2801 ClassFileStream* cfs = stream(); |
2895 // Set inner classes attribute to default sentinel |
2802 // Set inner classes attribute to default sentinel |
2896 set_class_inner_classes(Universe::the_empty_short_array()); |
2803 _inner_classes = Universe::the_empty_short_array(); |
2897 cfs->guarantee_more(2, CHECK); // attributes_count |
2804 cfs->guarantee_more(2, CHECK); // attributes_count |
2898 u2 attributes_count = cfs->get_u2_fast(); |
2805 u2 attributes_count = cfs->get_u2_fast(); |
2899 bool parsed_sourcefile_attribute = false; |
2806 bool parsed_sourcefile_attribute = false; |
2900 bool parsed_innerclasses_attribute = false; |
2807 bool parsed_innerclasses_attribute = false; |
2901 bool parsed_enclosingmethod_attribute = false; |
2808 bool parsed_enclosingmethod_attribute = false; |
2916 while (attributes_count--) { |
2823 while (attributes_count--) { |
2917 cfs->guarantee_more(6, CHECK); // attribute_name_index, attribute_length |
2824 cfs->guarantee_more(6, CHECK); // attribute_name_index, attribute_length |
2918 u2 attribute_name_index = cfs->get_u2_fast(); |
2825 u2 attribute_name_index = cfs->get_u2_fast(); |
2919 u4 attribute_length = cfs->get_u4_fast(); |
2826 u4 attribute_length = cfs->get_u4_fast(); |
2920 check_property( |
2827 check_property( |
2921 valid_cp_range(attribute_name_index, cp->length()) && |
2828 valid_symbol_at(attribute_name_index), |
2922 cp->tag_at(attribute_name_index).is_utf8(), |
|
2923 "Attribute name has bad constant pool index %u in class file %s", |
2829 "Attribute name has bad constant pool index %u in class file %s", |
2924 attribute_name_index, CHECK); |
2830 attribute_name_index, CHECK); |
2925 Symbol* tag = cp->symbol_at(attribute_name_index); |
2831 Symbol* tag = _cp->symbol_at(attribute_name_index); |
2926 if (tag == vmSymbols::tag_source_file()) { |
2832 if (tag == vmSymbols::tag_source_file()) { |
2927 // Check for SourceFile tag |
2833 // Check for SourceFile tag |
2928 if (_need_verify) { |
2834 if (_need_verify) { |
2929 guarantee_property(attribute_length == 2, "Wrong SourceFile attribute length in class file %s", CHECK); |
2835 guarantee_property(attribute_length == 2, "Wrong SourceFile attribute length in class file %s", CHECK); |
2930 } |
2836 } |
2931 if (parsed_sourcefile_attribute) { |
2837 if (parsed_sourcefile_attribute) { |
2932 classfile_parse_error("Multiple SourceFile attributes in class file %s", CHECK); |
2838 classfile_parse_error("Multiple SourceFile attributes in class file %s", CHECK); |
2933 } else { |
2839 } else { |
2934 parsed_sourcefile_attribute = true; |
2840 parsed_sourcefile_attribute = true; |
2935 } |
2841 } |
2936 parse_classfile_sourcefile_attribute(cp, CHECK); |
2842 parse_classfile_sourcefile_attribute(CHECK); |
2937 } else if (tag == vmSymbols::tag_source_debug_extension()) { |
2843 } else if (tag == vmSymbols::tag_source_debug_extension()) { |
2938 // Check for SourceDebugExtension tag |
2844 // Check for SourceDebugExtension tag |
2939 parse_classfile_source_debug_extension_attribute(cp, (int)attribute_length, CHECK); |
2845 parse_classfile_source_debug_extension_attribute((int)attribute_length, CHECK); |
2940 } else if (tag == vmSymbols::tag_inner_classes()) { |
2846 } else if (tag == vmSymbols::tag_inner_classes()) { |
2941 // Check for InnerClasses tag |
2847 // Check for InnerClasses tag |
2942 if (parsed_innerclasses_attribute) { |
2848 if (parsed_innerclasses_attribute) { |
2943 classfile_parse_error("Multiple InnerClasses attributes in class file %s", CHECK); |
2849 classfile_parse_error("Multiple InnerClasses attributes in class file %s", CHECK); |
2944 } else { |
2850 } else { |
2953 if (attribute_length != 0) { |
2859 if (attribute_length != 0) { |
2954 classfile_parse_error( |
2860 classfile_parse_error( |
2955 "Invalid Synthetic classfile attribute length %u in class file %s", |
2861 "Invalid Synthetic classfile attribute length %u in class file %s", |
2956 attribute_length, CHECK); |
2862 attribute_length, CHECK); |
2957 } |
2863 } |
2958 parse_classfile_synthetic_attribute(cp, CHECK); |
2864 parse_classfile_synthetic_attribute(CHECK); |
2959 } else if (tag == vmSymbols::tag_deprecated()) { |
2865 } else if (tag == vmSymbols::tag_deprecated()) { |
2960 // Check for Deprecatd tag - 4276120 |
2866 // Check for Deprecatd tag - 4276120 |
2961 if (attribute_length != 0) { |
2867 if (attribute_length != 0) { |
2962 classfile_parse_error( |
2868 classfile_parse_error( |
2963 "Invalid Deprecated classfile attribute length %u in class file %s", |
2869 "Invalid Deprecated classfile attribute length %u in class file %s", |
2968 if (attribute_length != 2) { |
2874 if (attribute_length != 2) { |
2969 classfile_parse_error( |
2875 classfile_parse_error( |
2970 "Wrong Signature attribute length %u in class file %s", |
2876 "Wrong Signature attribute length %u in class file %s", |
2971 attribute_length, CHECK); |
2877 attribute_length, CHECK); |
2972 } |
2878 } |
2973 parse_classfile_signature_attribute(cp, CHECK); |
2879 parse_classfile_signature_attribute(CHECK); |
2974 } else if (tag == vmSymbols::tag_runtime_visible_annotations()) { |
2880 } else if (tag == vmSymbols::tag_runtime_visible_annotations()) { |
2975 runtime_visible_annotations_length = attribute_length; |
2881 runtime_visible_annotations_length = attribute_length; |
2976 runtime_visible_annotations = cfs->get_u1_buffer(); |
2882 runtime_visible_annotations = cfs->get_u1_buffer(); |
2977 assert(runtime_visible_annotations != NULL, "null visible annotations"); |
2883 assert(runtime_visible_annotations != NULL, "null visible annotations"); |
2978 parse_annotations(loader_data, |
2884 parse_annotations(runtime_visible_annotations, |
2979 runtime_visible_annotations, |
|
2980 runtime_visible_annotations_length, |
2885 runtime_visible_annotations_length, |
2981 cp, |
|
2982 parsed_annotations, |
2886 parsed_annotations, |
2983 CHECK); |
2887 CHECK); |
2984 cfs->skip_u1(runtime_visible_annotations_length, CHECK); |
2888 cfs->skip_u1(runtime_visible_annotations_length, CHECK); |
2985 } else if (PreserveAllAnnotations && tag == vmSymbols::tag_runtime_invisible_annotations()) { |
2889 } else if (PreserveAllAnnotations && tag == vmSymbols::tag_runtime_invisible_annotations()) { |
2986 runtime_invisible_annotations_length = attribute_length; |
2890 runtime_invisible_annotations_length = attribute_length; |
2998 enclosing_method_method_index = cfs->get_u2_fast(); |
2902 enclosing_method_method_index = cfs->get_u2_fast(); |
2999 if (enclosing_method_class_index == 0) { |
2903 if (enclosing_method_class_index == 0) { |
3000 classfile_parse_error("Invalid class index in EnclosingMethod attribute in class file %s", CHECK); |
2904 classfile_parse_error("Invalid class index in EnclosingMethod attribute in class file %s", CHECK); |
3001 } |
2905 } |
3002 // Validate the constant pool indices and types |
2906 // Validate the constant pool indices and types |
3003 if (!cp->is_within_bounds(enclosing_method_class_index) || |
2907 check_property(valid_klass_reference_at(enclosing_method_class_index), |
3004 !is_klass_reference(cp, enclosing_method_class_index)) { |
2908 "Invalid or out-of-bounds class index in EnclosingMethod attribute in class file %s", CHECK); |
3005 classfile_parse_error("Invalid or out-of-bounds class index in EnclosingMethod attribute in class file %s", CHECK); |
|
3006 } |
|
3007 if (enclosing_method_method_index != 0 && |
2909 if (enclosing_method_method_index != 0 && |
3008 (!cp->is_within_bounds(enclosing_method_method_index) || |
2910 (!_cp->is_within_bounds(enclosing_method_method_index) || |
3009 !cp->tag_at(enclosing_method_method_index).is_name_and_type())) { |
2911 !_cp->tag_at(enclosing_method_method_index).is_name_and_type())) { |
3010 classfile_parse_error("Invalid or out-of-bounds method index in EnclosingMethod attribute in class file %s", CHECK); |
2912 classfile_parse_error("Invalid or out-of-bounds method index in EnclosingMethod attribute in class file %s", CHECK); |
3011 } |
2913 } |
3012 } else if (tag == vmSymbols::tag_bootstrap_methods() && |
2914 } else if (tag == vmSymbols::tag_bootstrap_methods() && |
3013 _major_version >= Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { |
2915 _major_version >= Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { |
3014 if (parsed_bootstrap_methods_attribute) |
2916 if (parsed_bootstrap_methods_attribute) |
3015 classfile_parse_error("Multiple BootstrapMethods attributes in class file %s", CHECK); |
2917 classfile_parse_error("Multiple BootstrapMethods attributes in class file %s", CHECK); |
3016 parsed_bootstrap_methods_attribute = true; |
2918 parsed_bootstrap_methods_attribute = true; |
3017 parse_classfile_bootstrap_methods_attribute(loader_data, cp, attribute_length, CHECK); |
2919 parse_classfile_bootstrap_methods_attribute(attribute_length, CHECK); |
3018 } else if (tag == vmSymbols::tag_runtime_visible_type_annotations()) { |
2920 } else if (tag == vmSymbols::tag_runtime_visible_type_annotations()) { |
3019 runtime_visible_type_annotations_length = attribute_length; |
2921 runtime_visible_type_annotations_length = attribute_length; |
3020 runtime_visible_type_annotations = cfs->get_u1_buffer(); |
2922 runtime_visible_type_annotations = cfs->get_u1_buffer(); |
3021 assert(runtime_visible_type_annotations != NULL, "null visible type annotations"); |
2923 assert(runtime_visible_type_annotations != NULL, "null visible type annotations"); |
3022 // No need for the VM to parse Type annotations |
2924 // No need for the VM to parse Type annotations |
3033 } else { |
2935 } else { |
3034 // Unknown attribute |
2936 // Unknown attribute |
3035 cfs->skip_u1(attribute_length, CHECK); |
2937 cfs->skip_u1(attribute_length, CHECK); |
3036 } |
2938 } |
3037 } |
2939 } |
3038 AnnotationArray* annotations = assemble_annotations(loader_data, |
2940 _annotations = assemble_annotations(runtime_visible_annotations, |
3039 runtime_visible_annotations, |
2941 runtime_visible_annotations_length, |
3040 runtime_visible_annotations_length, |
2942 runtime_invisible_annotations, |
3041 runtime_invisible_annotations, |
2943 runtime_invisible_annotations_length, |
3042 runtime_invisible_annotations_length, |
2944 CHECK); |
3043 CHECK); |
2945 _type_annotations = assemble_annotations(runtime_visible_type_annotations, |
3044 set_class_annotations(annotations); |
2946 runtime_visible_type_annotations_length, |
3045 AnnotationArray* type_annotations = assemble_annotations(loader_data, |
2947 runtime_invisible_type_annotations, |
3046 runtime_visible_type_annotations, |
2948 runtime_invisible_type_annotations_length, |
3047 runtime_visible_type_annotations_length, |
2949 CHECK); |
3048 runtime_invisible_type_annotations, |
|
3049 runtime_invisible_type_annotations_length, |
|
3050 CHECK); |
|
3051 set_class_type_annotations(type_annotations); |
|
3052 |
2950 |
3053 if (parsed_innerclasses_attribute || parsed_enclosingmethod_attribute) { |
2951 if (parsed_innerclasses_attribute || parsed_enclosingmethod_attribute) { |
3054 u2 num_of_classes = parse_classfile_inner_classes_attribute( |
2952 u2 num_of_classes = parse_classfile_inner_classes_attribute( |
3055 loader_data, |
|
3056 inner_classes_attribute_start, |
2953 inner_classes_attribute_start, |
3057 parsed_innerclasses_attribute, |
2954 parsed_innerclasses_attribute, |
3058 enclosing_method_class_index, |
2955 enclosing_method_class_index, |
3059 enclosing_method_method_index, |
2956 enclosing_method_method_index, |
3060 cp, CHECK); |
2957 CHECK); |
3061 if (parsed_innerclasses_attribute &&_need_verify && _major_version >= JAVA_1_5_VERSION) { |
2958 if (parsed_innerclasses_attribute &&_need_verify && _major_version >= JAVA_1_5_VERSION) { |
3062 guarantee_property( |
2959 guarantee_property( |
3063 inner_classes_attribute_length == sizeof(num_of_classes) + 4 * sizeof(u2) * num_of_classes, |
2960 inner_classes_attribute_length == sizeof(num_of_classes) + 4 * sizeof(u2) * num_of_classes, |
3064 "Wrong InnerClasses attribute length in class file %s", CHECK); |
2961 "Wrong InnerClasses attribute length in class file %s", CHECK); |
3065 } |
2962 } |
3083 k->set_generic_signature(_generic_signature); |
2980 k->set_generic_signature(_generic_signature); |
3084 } |
2981 } |
3085 if (_sde_buffer != NULL) { |
2982 if (_sde_buffer != NULL) { |
3086 k->set_source_debug_extension(_sde_buffer, _sde_length); |
2983 k->set_source_debug_extension(_sde_buffer, _sde_length); |
3087 } |
2984 } |
3088 k->set_inner_classes(_inner_classes); |
2985 } |
3089 } |
2986 |
3090 |
2987 // Transfer ownership of metadata allocated to the InstanceKlass. |
3091 AnnotationArray* ClassFileParser::assemble_annotations(ClassLoaderData* loader_data, |
2988 void ClassFileParser::apply_parsed_class_metadata( |
3092 u1* runtime_visible_annotations, |
2989 instanceKlassHandle this_klass, |
2990 int java_fields_count, TRAPS) { |
|
2991 // Assign annotations if needed |
|
2992 if (_annotations != NULL || _type_annotations != NULL || |
|
2993 _fields_annotations != NULL || _fields_type_annotations != NULL) { |
|
2994 Annotations* annotations = Annotations::allocate(_loader_data, CHECK); |
|
2995 annotations->set_class_annotations(_annotations); |
|
2996 annotations->set_class_type_annotations(_type_annotations); |
|
2997 annotations->set_fields_annotations(_fields_annotations); |
|
2998 annotations->set_fields_type_annotations(_fields_type_annotations); |
|
2999 this_klass->set_annotations(annotations); |
|
3000 } |
|
3001 |
|
3002 _cp->set_pool_holder(this_klass()); |
|
3003 this_klass->set_constants(_cp); |
|
3004 this_klass->set_fields(_fields, java_fields_count); |
|
3005 this_klass->set_methods(_methods); |
|
3006 this_klass->set_inner_classes(_inner_classes); |
|
3007 this_klass->set_local_interfaces(_local_interfaces); |
|
3008 this_klass->set_transitive_interfaces(_transitive_interfaces); |
|
3009 |
|
3010 // Clear out these fields so they don't get deallocated by the destructor |
|
3011 clear_class_metadata(); |
|
3012 } |
|
3013 |
|
3014 AnnotationArray* ClassFileParser::assemble_annotations(u1* runtime_visible_annotations, |
|
3093 int runtime_visible_annotations_length, |
3015 int runtime_visible_annotations_length, |
3094 u1* runtime_invisible_annotations, |
3016 u1* runtime_invisible_annotations, |
3095 int runtime_invisible_annotations_length, TRAPS) { |
3017 int runtime_invisible_annotations_length, TRAPS) { |
3096 AnnotationArray* annotations = NULL; |
3018 AnnotationArray* annotations = NULL; |
3097 if (runtime_visible_annotations != NULL || |
3019 if (runtime_visible_annotations != NULL || |
3098 runtime_invisible_annotations != NULL) { |
3020 runtime_invisible_annotations != NULL) { |
3099 annotations = MetadataFactory::new_array<u1>(loader_data, |
3021 annotations = MetadataFactory::new_array<u1>(_loader_data, |
3100 runtime_visible_annotations_length + |
3022 runtime_visible_annotations_length + |
3101 runtime_invisible_annotations_length, |
3023 runtime_invisible_annotations_length, |
3102 CHECK_(annotations)); |
3024 CHECK_(annotations)); |
3103 if (runtime_visible_annotations != NULL) { |
3025 if (runtime_visible_annotations != NULL) { |
3104 for (int i = 0; i < runtime_visible_annotations_length; i++) { |
3026 for (int i = 0; i < runtime_visible_annotations_length; i++) { |
3140 method_spec->print_on(tty); |
3062 method_spec->print_on(tty); |
3141 } |
3063 } |
3142 } |
3064 } |
3143 } |
3065 } |
3144 #endif // ndef PRODUCT |
3066 #endif // ndef PRODUCT |
3067 |
|
3068 |
|
3069 instanceKlassHandle ClassFileParser::parse_super_class(int super_class_index, |
|
3070 TRAPS) { |
|
3071 instanceKlassHandle super_klass; |
|
3072 if (super_class_index == 0) { |
|
3073 check_property(_class_name == vmSymbols::java_lang_Object(), |
|
3074 "Invalid superclass index %u in class file %s", |
|
3075 super_class_index, |
|
3076 CHECK_NULL); |
|
3077 } else { |
|
3078 check_property(valid_klass_reference_at(super_class_index), |
|
3079 "Invalid superclass index %u in class file %s", |
|
3080 super_class_index, |
|
3081 CHECK_NULL); |
|
3082 // The class name should be legal because it is checked when parsing constant pool. |
|
3083 // However, make sure it is not an array type. |
|
3084 bool is_array = false; |
|
3085 if (_cp->tag_at(super_class_index).is_klass()) { |
|
3086 super_klass = instanceKlassHandle(THREAD, _cp->resolved_klass_at(super_class_index)); |
|
3087 if (_need_verify) |
|
3088 is_array = super_klass->oop_is_array(); |
|
3089 } else if (_need_verify) { |
|
3090 is_array = (_cp->unresolved_klass_at(super_class_index)->byte_at(0) == JVM_SIGNATURE_ARRAY); |
|
3091 } |
|
3092 if (_need_verify) { |
|
3093 guarantee_property(!is_array, |
|
3094 "Bad superclass name in class file %s", CHECK_NULL); |
|
3095 } |
|
3096 } |
|
3097 return super_klass; |
|
3098 } |
|
3099 |
|
3100 |
|
3101 // Values needed for oopmap and InstanceKlass creation |
|
3102 class FieldLayoutInfo : public StackObj { |
|
3103 public: |
|
3104 int* nonstatic_oop_offsets; |
|
3105 unsigned int* nonstatic_oop_counts; |
|
3106 unsigned int nonstatic_oop_map_count; |
|
3107 unsigned int total_oop_map_count; |
|
3108 int instance_size; |
|
3109 int nonstatic_field_size; |
|
3110 int static_field_size; |
|
3111 bool has_nonstatic_fields; |
|
3112 }; |
|
3113 |
|
3114 // Layout fields and fill in FieldLayoutInfo. Could use more refactoring! |
|
3115 void ClassFileParser::layout_fields(Handle class_loader, |
|
3116 FieldAllocationCount* fac, |
|
3117 ClassAnnotationCollector* parsed_annotations, |
|
3118 FieldLayoutInfo* info, |
|
3119 TRAPS) { |
|
3120 |
|
3121 // get the padding width from the option |
|
3122 // TODO: Ask VM about specific CPU we are running on |
|
3123 int pad_size = ContendedPaddingWidth; |
|
3124 |
|
3125 // Field size and offset computation |
|
3126 int nonstatic_field_size = _super_klass() == NULL ? 0 : _super_klass()->nonstatic_field_size(); |
|
3127 #ifndef PRODUCT |
|
3128 int orig_nonstatic_field_size = 0; |
|
3129 #endif |
|
3130 int next_static_oop_offset; |
|
3131 int next_static_double_offset; |
|
3132 int next_static_word_offset; |
|
3133 int next_static_short_offset; |
|
3134 int next_static_byte_offset; |
|
3135 int next_nonstatic_oop_offset; |
|
3136 int next_nonstatic_double_offset; |
|
3137 int next_nonstatic_word_offset; |
|
3138 int next_nonstatic_short_offset; |
|
3139 int next_nonstatic_byte_offset; |
|
3140 int next_nonstatic_type_offset; |
|
3141 int first_nonstatic_oop_offset; |
|
3142 int first_nonstatic_field_offset; |
|
3143 int next_nonstatic_field_offset; |
|
3144 int next_nonstatic_padded_offset; |
|
3145 |
|
3146 // Count the contended fields by type. |
|
3147 int nonstatic_contended_count = 0; |
|
3148 FieldAllocationCount fac_contended; |
|
3149 for (AllFieldStream fs(_fields, _cp); !fs.done(); fs.next()) { |
|
3150 FieldAllocationType atype = (FieldAllocationType) fs.allocation_type(); |
|
3151 if (fs.is_contended()) { |
|
3152 fac_contended.count[atype]++; |
|
3153 if (!fs.access_flags().is_static()) { |
|
3154 nonstatic_contended_count++; |
|
3155 } |
|
3156 } |
|
3157 } |
|
3158 int contended_count = nonstatic_contended_count; |
|
3159 |
|
3160 |
|
3161 // Calculate the starting byte offsets |
|
3162 next_static_oop_offset = InstanceMirrorKlass::offset_of_static_fields(); |
|
3163 next_static_double_offset = next_static_oop_offset + |
|
3164 ((fac->count[STATIC_OOP]) * heapOopSize); |
|
3165 if ( fac->count[STATIC_DOUBLE] && |
|
3166 (Universe::field_type_should_be_aligned(T_DOUBLE) || |
|
3167 Universe::field_type_should_be_aligned(T_LONG)) ) { |
|
3168 next_static_double_offset = align_size_up(next_static_double_offset, BytesPerLong); |
|
3169 } |
|
3170 |
|
3171 next_static_word_offset = next_static_double_offset + |
|
3172 ((fac->count[STATIC_DOUBLE]) * BytesPerLong); |
|
3173 next_static_short_offset = next_static_word_offset + |
|
3174 ((fac->count[STATIC_WORD]) * BytesPerInt); |
|
3175 next_static_byte_offset = next_static_short_offset + |
|
3176 ((fac->count[STATIC_SHORT]) * BytesPerShort); |
|
3177 |
|
3178 first_nonstatic_field_offset = instanceOopDesc::base_offset_in_bytes() + |
|
3179 nonstatic_field_size * heapOopSize; |
|
3180 |
|
3181 // class is contended, pad before all the fields |
|
3182 if (parsed_annotations->is_contended()) { |
|
3183 first_nonstatic_field_offset += pad_size; |
|
3184 } |
|
3185 |
|
3186 next_nonstatic_field_offset = first_nonstatic_field_offset; |
|
3187 |
|
3188 unsigned int nonstatic_double_count = fac->count[NONSTATIC_DOUBLE] - fac_contended.count[NONSTATIC_DOUBLE]; |
|
3189 unsigned int nonstatic_word_count = fac->count[NONSTATIC_WORD] - fac_contended.count[NONSTATIC_WORD]; |
|
3190 unsigned int nonstatic_short_count = fac->count[NONSTATIC_SHORT] - fac_contended.count[NONSTATIC_SHORT]; |
|
3191 unsigned int nonstatic_byte_count = fac->count[NONSTATIC_BYTE] - fac_contended.count[NONSTATIC_BYTE]; |
|
3192 unsigned int nonstatic_oop_count = fac->count[NONSTATIC_OOP] - fac_contended.count[NONSTATIC_OOP]; |
|
3193 |
|
3194 bool super_has_nonstatic_fields = |
|
3195 (_super_klass() != NULL && _super_klass->has_nonstatic_fields()); |
|
3196 bool has_nonstatic_fields = super_has_nonstatic_fields || |
|
3197 ((nonstatic_double_count + nonstatic_word_count + |
|
3198 nonstatic_short_count + nonstatic_byte_count + |
|
3199 nonstatic_oop_count) != 0); |
|
3200 |
|
3201 |
|
3202 // Prepare list of oops for oop map generation. |
|
3203 int* nonstatic_oop_offsets; |
|
3204 unsigned int* nonstatic_oop_counts; |
|
3205 unsigned int nonstatic_oop_map_count = 0; |
|
3206 |
|
3207 nonstatic_oop_offsets = NEW_RESOURCE_ARRAY_IN_THREAD( |
|
3208 THREAD, int, nonstatic_oop_count + 1); |
|
3209 nonstatic_oop_counts = NEW_RESOURCE_ARRAY_IN_THREAD( |
|
3210 THREAD, unsigned int, nonstatic_oop_count + 1); |
|
3211 |
|
3212 first_nonstatic_oop_offset = 0; // will be set for first oop field |
|
3213 |
|
3214 #ifndef PRODUCT |
|
3215 if( PrintCompactFieldsSavings ) { |
|
3216 next_nonstatic_double_offset = next_nonstatic_field_offset + |
|
3217 (nonstatic_oop_count * heapOopSize); |
|
3218 if ( nonstatic_double_count > 0 ) { |
|
3219 next_nonstatic_double_offset = align_size_up(next_nonstatic_double_offset, BytesPerLong); |
|
3220 } |
|
3221 next_nonstatic_word_offset = next_nonstatic_double_offset + |
|
3222 (nonstatic_double_count * BytesPerLong); |
|
3223 next_nonstatic_short_offset = next_nonstatic_word_offset + |
|
3224 (nonstatic_word_count * BytesPerInt); |
|
3225 next_nonstatic_byte_offset = next_nonstatic_short_offset + |
|
3226 (nonstatic_short_count * BytesPerShort); |
|
3227 next_nonstatic_type_offset = align_size_up((next_nonstatic_byte_offset + |
|
3228 nonstatic_byte_count ), heapOopSize ); |
|
3229 orig_nonstatic_field_size = nonstatic_field_size + |
|
3230 ((next_nonstatic_type_offset - first_nonstatic_field_offset)/heapOopSize); |
|
3231 } |
|
3232 #endif |
|
3233 bool compact_fields = CompactFields; |
|
3234 int allocation_style = FieldsAllocationStyle; |
|
3235 if( allocation_style < 0 || allocation_style > 2 ) { // Out of range? |
|
3236 assert(false, "0 <= FieldsAllocationStyle <= 2"); |
|
3237 allocation_style = 1; // Optimistic |
|
3238 } |
|
3239 |
|
3240 // The next classes have predefined hard-coded fields offsets |
|
3241 // (see in JavaClasses::compute_hard_coded_offsets()). |
|
3242 // Use default fields allocation order for them. |
|
3243 if( (allocation_style != 0 || compact_fields ) && class_loader.is_null() && |
|
3244 (_class_name == vmSymbols::java_lang_AssertionStatusDirectives() || |
|
3245 _class_name == vmSymbols::java_lang_Class() || |
|
3246 _class_name == vmSymbols::java_lang_ClassLoader() || |
|
3247 _class_name == vmSymbols::java_lang_ref_Reference() || |
|
3248 _class_name == vmSymbols::java_lang_ref_SoftReference() || |
|
3249 _class_name == vmSymbols::java_lang_StackTraceElement() || |
|
3250 _class_name == vmSymbols::java_lang_String() || |
|
3251 _class_name == vmSymbols::java_lang_Throwable() || |
|
3252 _class_name == vmSymbols::java_lang_Boolean() || |
|
3253 _class_name == vmSymbols::java_lang_Character() || |
|
3254 _class_name == vmSymbols::java_lang_Float() || |
|
3255 _class_name == vmSymbols::java_lang_Double() || |
|
3256 _class_name == vmSymbols::java_lang_Byte() || |
|
3257 _class_name == vmSymbols::java_lang_Short() || |
|
3258 _class_name == vmSymbols::java_lang_Integer() || |
|
3259 _class_name == vmSymbols::java_lang_Long())) { |
|
3260 allocation_style = 0; // Allocate oops first |
|
3261 compact_fields = false; // Don't compact fields |
|
3262 } |
|
3263 |
|
3264 if( allocation_style == 0 ) { |
|
3265 // Fields order: oops, longs/doubles, ints, shorts/chars, bytes, padded fields |
|
3266 next_nonstatic_oop_offset = next_nonstatic_field_offset; |
|
3267 next_nonstatic_double_offset = next_nonstatic_oop_offset + |
|
3268 (nonstatic_oop_count * heapOopSize); |
|
3269 } else if( allocation_style == 1 ) { |
|
3270 // Fields order: longs/doubles, ints, shorts/chars, bytes, oops, padded fields |
|
3271 next_nonstatic_double_offset = next_nonstatic_field_offset; |
|
3272 } else if( allocation_style == 2 ) { |
|
3273 // Fields allocation: oops fields in super and sub classes are together. |
|
3274 if( nonstatic_field_size > 0 && _super_klass() != NULL && |
|
3275 _super_klass->nonstatic_oop_map_size() > 0 ) { |
|
3276 unsigned int map_count = _super_klass->nonstatic_oop_map_count(); |
|
3277 OopMapBlock* first_map = _super_klass->start_of_nonstatic_oop_maps(); |
|
3278 OopMapBlock* last_map = first_map + map_count - 1; |
|
3279 int next_offset = last_map->offset() + (last_map->count() * heapOopSize); |
|
3280 if (next_offset == next_nonstatic_field_offset) { |
|
3281 allocation_style = 0; // allocate oops first |
|
3282 next_nonstatic_oop_offset = next_nonstatic_field_offset; |
|
3283 next_nonstatic_double_offset = next_nonstatic_oop_offset + |
|
3284 (nonstatic_oop_count * heapOopSize); |
|
3285 } |
|
3286 } |
|
3287 if( allocation_style == 2 ) { |
|
3288 allocation_style = 1; // allocate oops last |
|
3289 next_nonstatic_double_offset = next_nonstatic_field_offset; |
|
3290 } |
|
3291 } else { |
|
3292 ShouldNotReachHere(); |
|
3293 } |
|
3294 |
|
3295 int nonstatic_oop_space_count = 0; |
|
3296 int nonstatic_word_space_count = 0; |
|
3297 int nonstatic_short_space_count = 0; |
|
3298 int nonstatic_byte_space_count = 0; |
|
3299 int nonstatic_oop_space_offset; |
|
3300 int nonstatic_word_space_offset; |
|
3301 int nonstatic_short_space_offset; |
|
3302 int nonstatic_byte_space_offset; |
|
3303 |
|
3304 if( nonstatic_double_count > 0 ) { |
|
3305 int offset = next_nonstatic_double_offset; |
|
3306 next_nonstatic_double_offset = align_size_up(offset, BytesPerLong); |
|
3307 if( compact_fields && offset != next_nonstatic_double_offset ) { |
|
3308 // Allocate available fields into the gap before double field. |
|
3309 int length = next_nonstatic_double_offset - offset; |
|
3310 assert(length == BytesPerInt, ""); |
|
3311 nonstatic_word_space_offset = offset; |
|
3312 if( nonstatic_word_count > 0 ) { |
|
3313 nonstatic_word_count -= 1; |
|
3314 nonstatic_word_space_count = 1; // Only one will fit |
|
3315 length -= BytesPerInt; |
|
3316 offset += BytesPerInt; |
|
3317 } |
|
3318 nonstatic_short_space_offset = offset; |
|
3319 while( length >= BytesPerShort && nonstatic_short_count > 0 ) { |
|
3320 nonstatic_short_count -= 1; |
|
3321 nonstatic_short_space_count += 1; |
|
3322 length -= BytesPerShort; |
|
3323 offset += BytesPerShort; |
|
3324 } |
|
3325 nonstatic_byte_space_offset = offset; |
|
3326 while( length > 0 && nonstatic_byte_count > 0 ) { |
|
3327 nonstatic_byte_count -= 1; |
|
3328 nonstatic_byte_space_count += 1; |
|
3329 length -= 1; |
|
3330 } |
|
3331 // Allocate oop field in the gap if there are no other fields for that. |
|
3332 nonstatic_oop_space_offset = offset; |
|
3333 if( length >= heapOopSize && nonstatic_oop_count > 0 && |
|
3334 allocation_style != 0 ) { // when oop fields not first |
|
3335 nonstatic_oop_count -= 1; |
|
3336 nonstatic_oop_space_count = 1; // Only one will fit |
|
3337 length -= heapOopSize; |
|
3338 offset += heapOopSize; |
|
3339 } |
|
3340 } |
|
3341 } |
|
3342 |
|
3343 next_nonstatic_word_offset = next_nonstatic_double_offset + |
|
3344 (nonstatic_double_count * BytesPerLong); |
|
3345 next_nonstatic_short_offset = next_nonstatic_word_offset + |
|
3346 (nonstatic_word_count * BytesPerInt); |
|
3347 next_nonstatic_byte_offset = next_nonstatic_short_offset + |
|
3348 (nonstatic_short_count * BytesPerShort); |
|
3349 next_nonstatic_padded_offset = next_nonstatic_byte_offset + |
|
3350 nonstatic_byte_count; |
|
3351 |
|
3352 // let oops jump before padding with this allocation style |
|
3353 if( allocation_style == 1 ) { |
|
3354 next_nonstatic_oop_offset = next_nonstatic_padded_offset; |
|
3355 if( nonstatic_oop_count > 0 ) { |
|
3356 next_nonstatic_oop_offset = align_size_up(next_nonstatic_oop_offset, heapOopSize); |
|
3357 } |
|
3358 next_nonstatic_padded_offset = next_nonstatic_oop_offset + (nonstatic_oop_count * heapOopSize); |
|
3359 } |
|
3360 |
|
3361 // Iterate over fields again and compute correct offsets. |
|
3362 // The field allocation type was temporarily stored in the offset slot. |
|
3363 // oop fields are located before non-oop fields (static and non-static). |
|
3364 for (AllFieldStream fs(_fields, _cp); !fs.done(); fs.next()) { |
|
3365 |
|
3366 // skip already laid out fields |
|
3367 if (fs.is_offset_set()) continue; |
|
3368 |
|
3369 // contended instance fields are handled below |
|
3370 if (fs.is_contended() && !fs.access_flags().is_static()) continue; |
|
3371 |
|
3372 int real_offset; |
|
3373 FieldAllocationType atype = (FieldAllocationType) fs.allocation_type(); |
|
3374 |
|
3375 // pack the rest of the fields |
|
3376 switch (atype) { |
|
3377 case STATIC_OOP: |
|
3378 real_offset = next_static_oop_offset; |
|
3379 next_static_oop_offset += heapOopSize; |
|
3380 break; |
|
3381 case STATIC_BYTE: |
|
3382 real_offset = next_static_byte_offset; |
|
3383 next_static_byte_offset += 1; |
|
3384 break; |
|
3385 case STATIC_SHORT: |
|
3386 real_offset = next_static_short_offset; |
|
3387 next_static_short_offset += BytesPerShort; |
|
3388 break; |
|
3389 case STATIC_WORD: |
|
3390 real_offset = next_static_word_offset; |
|
3391 next_static_word_offset += BytesPerInt; |
|
3392 break; |
|
3393 case STATIC_DOUBLE: |
|
3394 real_offset = next_static_double_offset; |
|
3395 next_static_double_offset += BytesPerLong; |
|
3396 break; |
|
3397 case NONSTATIC_OOP: |
|
3398 if( nonstatic_oop_space_count > 0 ) { |
|
3399 real_offset = nonstatic_oop_space_offset; |
|
3400 nonstatic_oop_space_offset += heapOopSize; |
|
3401 nonstatic_oop_space_count -= 1; |
|
3402 } else { |
|
3403 real_offset = next_nonstatic_oop_offset; |
|
3404 next_nonstatic_oop_offset += heapOopSize; |
|
3405 } |
|
3406 // Update oop maps |
|
3407 if( nonstatic_oop_map_count > 0 && |
|
3408 nonstatic_oop_offsets[nonstatic_oop_map_count - 1] == |
|
3409 real_offset - |
|
3410 int(nonstatic_oop_counts[nonstatic_oop_map_count - 1]) * |
|
3411 heapOopSize ) { |
|
3412 // Extend current oop map |
|
3413 nonstatic_oop_counts[nonstatic_oop_map_count - 1] += 1; |
|
3414 } else { |
|
3415 // Create new oop map |
|
3416 nonstatic_oop_offsets[nonstatic_oop_map_count] = real_offset; |
|
3417 nonstatic_oop_counts [nonstatic_oop_map_count] = 1; |
|
3418 nonstatic_oop_map_count += 1; |
|
3419 if( first_nonstatic_oop_offset == 0 ) { // Undefined |
|
3420 first_nonstatic_oop_offset = real_offset; |
|
3421 } |
|
3422 } |
|
3423 break; |
|
3424 case NONSTATIC_BYTE: |
|
3425 if( nonstatic_byte_space_count > 0 ) { |
|
3426 real_offset = nonstatic_byte_space_offset; |
|
3427 nonstatic_byte_space_offset += 1; |
|
3428 nonstatic_byte_space_count -= 1; |
|
3429 } else { |
|
3430 real_offset = next_nonstatic_byte_offset; |
|
3431 next_nonstatic_byte_offset += 1; |
|
3432 } |
|
3433 break; |
|
3434 case NONSTATIC_SHORT: |
|
3435 if( nonstatic_short_space_count > 0 ) { |
|
3436 real_offset = nonstatic_short_space_offset; |
|
3437 nonstatic_short_space_offset += BytesPerShort; |
|
3438 nonstatic_short_space_count -= 1; |
|
3439 } else { |
|
3440 real_offset = next_nonstatic_short_offset; |
|
3441 next_nonstatic_short_offset += BytesPerShort; |
|
3442 } |
|
3443 break; |
|
3444 case NONSTATIC_WORD: |
|
3445 if( nonstatic_word_space_count > 0 ) { |
|
3446 real_offset = nonstatic_word_space_offset; |
|
3447 nonstatic_word_space_offset += BytesPerInt; |
|
3448 nonstatic_word_space_count -= 1; |
|
3449 } else { |
|
3450 real_offset = next_nonstatic_word_offset; |
|
3451 next_nonstatic_word_offset += BytesPerInt; |
|
3452 } |
|
3453 break; |
|
3454 case NONSTATIC_DOUBLE: |
|
3455 real_offset = next_nonstatic_double_offset; |
|
3456 next_nonstatic_double_offset += BytesPerLong; |
|
3457 break; |
|
3458 default: |
|
3459 ShouldNotReachHere(); |
|
3460 } |
|
3461 fs.set_offset(real_offset); |
|
3462 } |
|
3463 |
|
3464 |
|
3465 // Handle the contended cases. |
|
3466 // |
|
3467 // Each contended field should not intersect the cache line with another contended field. |
|
3468 // In the absence of alignment information, we end up with pessimistically separating |
|
3469 // the fields with full-width padding. |
|
3470 // |
|
3471 // Additionally, this should not break alignment for the fields, so we round the alignment up |
|
3472 // for each field. |
|
3473 if (contended_count > 0) { |
|
3474 |
|
3475 // if there is at least one contended field, we need to have pre-padding for them |
|
3476 if (nonstatic_contended_count > 0) { |
|
3477 next_nonstatic_padded_offset += pad_size; |
|
3478 } |
|
3479 |
|
3480 // collect all contended groups |
|
3481 BitMap bm(_cp->size()); |
|
3482 for (AllFieldStream fs(_fields, _cp); !fs.done(); fs.next()) { |
|
3483 // skip already laid out fields |
|
3484 if (fs.is_offset_set()) continue; |
|
3485 |
|
3486 if (fs.is_contended()) { |
|
3487 bm.set_bit(fs.contended_group()); |
|
3488 } |
|
3489 } |
|
3490 |
|
3491 int current_group = -1; |
|
3492 while ((current_group = (int)bm.get_next_one_offset(current_group + 1)) != (int)bm.size()) { |
|
3493 |
|
3494 for (AllFieldStream fs(_fields, _cp); !fs.done(); fs.next()) { |
|
3495 |
|
3496 // skip already laid out fields |
|
3497 if (fs.is_offset_set()) continue; |
|
3498 |
|
3499 // skip non-contended fields and fields from different group |
|
3500 if (!fs.is_contended() || (fs.contended_group() != current_group)) continue; |
|
3501 |
|
3502 // handle statics below |
|
3503 if (fs.access_flags().is_static()) continue; |
|
3504 |
|
3505 int real_offset; |
|
3506 FieldAllocationType atype = (FieldAllocationType) fs.allocation_type(); |
|
3507 |
|
3508 switch (atype) { |
|
3509 case NONSTATIC_BYTE: |
|
3510 next_nonstatic_padded_offset = align_size_up(next_nonstatic_padded_offset, 1); |
|
3511 real_offset = next_nonstatic_padded_offset; |
|
3512 next_nonstatic_padded_offset += 1; |
|
3513 break; |
|
3514 |
|
3515 case NONSTATIC_SHORT: |
|
3516 next_nonstatic_padded_offset = align_size_up(next_nonstatic_padded_offset, BytesPerShort); |
|
3517 real_offset = next_nonstatic_padded_offset; |
|
3518 next_nonstatic_padded_offset += BytesPerShort; |
|
3519 break; |
|
3520 |
|
3521 case NONSTATIC_WORD: |
|
3522 next_nonstatic_padded_offset = align_size_up(next_nonstatic_padded_offset, BytesPerInt); |
|
3523 real_offset = next_nonstatic_padded_offset; |
|
3524 next_nonstatic_padded_offset += BytesPerInt; |
|
3525 break; |
|
3526 |
|
3527 case NONSTATIC_DOUBLE: |
|
3528 next_nonstatic_padded_offset = align_size_up(next_nonstatic_padded_offset, BytesPerLong); |
|
3529 real_offset = next_nonstatic_padded_offset; |
|
3530 next_nonstatic_padded_offset += BytesPerLong; |
|
3531 break; |
|
3532 |
|
3533 case NONSTATIC_OOP: |
|
3534 next_nonstatic_padded_offset = align_size_up(next_nonstatic_padded_offset, heapOopSize); |
|
3535 real_offset = next_nonstatic_padded_offset; |
|
3536 next_nonstatic_padded_offset += heapOopSize; |
|
3537 |
|
3538 // Create new oop map |
|
3539 nonstatic_oop_offsets[nonstatic_oop_map_count] = real_offset; |
|
3540 nonstatic_oop_counts [nonstatic_oop_map_count] = 1; |
|
3541 nonstatic_oop_map_count += 1; |
|
3542 if( first_nonstatic_oop_offset == 0 ) { // Undefined |
|
3543 first_nonstatic_oop_offset = real_offset; |
|
3544 } |
|
3545 break; |
|
3546 |
|
3547 default: |
|
3548 ShouldNotReachHere(); |
|
3549 } |
|
3550 |
|
3551 if (fs.contended_group() == 0) { |
|
3552 // Contended group defines the equivalence class over the fields: |
|
3553 // the fields within the same contended group are not inter-padded. |
|
3554 // The only exception is default group, which does not incur the |
|
3555 // equivalence, and so requires intra-padding. |
|
3556 next_nonstatic_padded_offset += pad_size; |
|
3557 } |
|
3558 |
|
3559 fs.set_offset(real_offset); |
|
3560 } // for |
|
3561 |
|
3562 // Start laying out the next group. |
|
3563 // Note that this will effectively pad the last group in the back; |
|
3564 // this is expected to alleviate memory contention effects for |
|
3565 // subclass fields and/or adjacent object. |
|
3566 // If this was the default group, the padding is already in place. |
|
3567 if (current_group != 0) { |
|
3568 next_nonstatic_padded_offset += pad_size; |
|
3569 } |
|
3570 } |
|
3571 |
|
3572 // handle static fields |
|
3573 } |
|
3574 |
|
3575 // Size of instances |
|
3576 int notaligned_offset = next_nonstatic_padded_offset; |
|
3577 |
|
3578 // Entire class is contended, pad in the back. |
|
3579 // This helps to alleviate memory contention effects for subclass fields |
|
3580 // and/or adjacent object. |
|
3581 if (parsed_annotations->is_contended()) { |
|
3582 notaligned_offset += pad_size; |
|
3583 } |
|
3584 |
|
3585 int next_static_type_offset = align_size_up(next_static_byte_offset, wordSize); |
|
3586 int static_field_size = (next_static_type_offset - |
|
3587 InstanceMirrorKlass::offset_of_static_fields()) / wordSize; |
|
3588 |
|
3589 next_nonstatic_type_offset = align_size_up(notaligned_offset, heapOopSize ); |
|
3590 nonstatic_field_size = nonstatic_field_size + ((next_nonstatic_type_offset |
|
3591 - first_nonstatic_field_offset)/heapOopSize); |
|
3592 |
|
3593 next_nonstatic_type_offset = align_size_up(notaligned_offset, wordSize ); |
|
3594 int instance_size = align_object_size(next_nonstatic_type_offset / wordSize); |
|
3595 |
|
3596 assert(instance_size == align_object_size(align_size_up( |
|
3597 (instanceOopDesc::base_offset_in_bytes() + nonstatic_field_size*heapOopSize + ((parsed_annotations->is_contended()) ? pad_size : 0)), |
|
3598 wordSize) / wordSize), "consistent layout helper value"); |
|
3599 |
|
3600 // Number of non-static oop map blocks allocated at end of klass. |
|
3601 const unsigned int total_oop_map_count = |
|
3602 compute_oop_map_count(_super_klass, nonstatic_oop_map_count, |
|
3603 first_nonstatic_oop_offset); |
|
3604 |
|
3605 #ifndef PRODUCT |
|
3606 if( PrintCompactFieldsSavings ) { |
|
3607 ResourceMark rm; |
|
3608 if( nonstatic_field_size < orig_nonstatic_field_size ) { |
|
3609 tty->print("[Saved %d of %d bytes in %s]\n", |
|
3610 (orig_nonstatic_field_size - nonstatic_field_size)*heapOopSize, |
|
3611 orig_nonstatic_field_size*heapOopSize, |
|
3612 _class_name); |
|
3613 } else if( nonstatic_field_size > orig_nonstatic_field_size ) { |
|
3614 tty->print("[Wasted %d over %d bytes in %s]\n", |
|
3615 (nonstatic_field_size - orig_nonstatic_field_size)*heapOopSize, |
|
3616 orig_nonstatic_field_size*heapOopSize, |
|
3617 _class_name); |
|
3618 } |
|
3619 } |
|
3620 |
|
3621 if (PrintFieldLayout) { |
|
3622 print_field_layout(_class_name, |
|
3623 _fields, |
|
3624 _cp, |
|
3625 instance_size, |
|
3626 first_nonstatic_field_offset, |
|
3627 next_nonstatic_field_offset, |
|
3628 next_static_type_offset); |
|
3629 } |
|
3630 |
|
3631 #endif |
|
3632 // Pass back information needed for InstanceKlass creation |
|
3633 info->nonstatic_oop_offsets = nonstatic_oop_offsets; |
|
3634 info->nonstatic_oop_counts = nonstatic_oop_counts; |
|
3635 info->nonstatic_oop_map_count = nonstatic_oop_map_count; |
|
3636 info->total_oop_map_count = total_oop_map_count; |
|
3637 info->instance_size = instance_size; |
|
3638 info->static_field_size = static_field_size; |
|
3639 info->nonstatic_field_size = nonstatic_field_size; |
|
3640 info->has_nonstatic_fields = has_nonstatic_fields; |
|
3641 } |
|
3145 |
3642 |
3146 |
3643 |
3147 instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, |
3644 instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, |
3148 ClassLoaderData* loader_data, |
3645 ClassLoaderData* loader_data, |
3149 Handle protection_domain, |
3646 Handle protection_domain, |
3174 NULL, |
3671 NULL, |
3175 jt->get_thread_stat()->perf_recursion_counts_addr(), |
3672 jt->get_thread_stat()->perf_recursion_counts_addr(), |
3176 jt->get_thread_stat()->perf_timers_addr(), |
3673 jt->get_thread_stat()->perf_timers_addr(), |
3177 PerfClassTraceTime::PARSE_CLASS); |
3674 PerfClassTraceTime::PARSE_CLASS); |
3178 |
3675 |
3179 init_parsed_class_attributes(); |
3676 init_parsed_class_attributes(loader_data); |
3180 |
3677 |
3181 if (JvmtiExport::should_post_class_file_load_hook()) { |
3678 if (JvmtiExport::should_post_class_file_load_hook()) { |
3182 // Get the cached class file bytes (if any) from the class that |
3679 // Get the cached class file bytes (if any) from the class that |
3183 // is being redefined or retransformed. We use jvmti_thread_state() |
3680 // is being redefined or retransformed. We use jvmti_thread_state() |
3184 // instead of JvmtiThreadState::state_for(jt) so we don't allocate |
3681 // instead of JvmtiThreadState::state_for(jt) so we don't allocate |
3269 // Check if verification needs to be relaxed for this class file |
3766 // Check if verification needs to be relaxed for this class file |
3270 // Do not restrict it to jdk1.0 or jdk1.1 to maintain backward compatibility (4982376) |
3767 // Do not restrict it to jdk1.0 or jdk1.1 to maintain backward compatibility (4982376) |
3271 _relax_verify = Verifier::relax_verify_for(class_loader()); |
3768 _relax_verify = Verifier::relax_verify_for(class_loader()); |
3272 |
3769 |
3273 // Constant pool |
3770 // Constant pool |
3274 constantPoolHandle cp = parse_constant_pool(loader_data, CHECK_(nullHandle)); |
3771 constantPoolHandle cp = parse_constant_pool(CHECK_(nullHandle)); |
3275 ConstantPoolCleaner error_handler(cp); // set constant pool to be cleaned up. |
|
3276 |
3772 |
3277 int cp_size = cp->length(); |
3773 int cp_size = cp->length(); |
3278 |
3774 |
3279 cfs->guarantee_more(8, CHECK_(nullHandle)); // flags, this_class, super_class, infs_len |
3775 cfs->guarantee_more(8, CHECK_(nullHandle)); // flags, this_class, super_class, infs_len |
3280 |
3776 |
3288 } |
3784 } |
3289 verify_legal_class_modifiers(flags, CHECK_(nullHandle)); |
3785 verify_legal_class_modifiers(flags, CHECK_(nullHandle)); |
3290 access_flags.set_flags(flags); |
3786 access_flags.set_flags(flags); |
3291 |
3787 |
3292 // This class and superclass |
3788 // This class and superclass |
3293 instanceKlassHandle super_klass; |
|
3294 u2 this_class_index = cfs->get_u2_fast(); |
3789 u2 this_class_index = cfs->get_u2_fast(); |
3295 check_property( |
3790 check_property( |
3296 valid_cp_range(this_class_index, cp_size) && |
3791 valid_cp_range(this_class_index, cp_size) && |
3297 cp->tag_at(this_class_index).is_unresolved_klass(), |
3792 cp->tag_at(this_class_index).is_unresolved_klass(), |
3298 "Invalid this class index %u in constant pool in class file %s", |
3793 "Invalid this class index %u in constant pool in class file %s", |
3343 if (cfs->source() != NULL) tty->print(" from %s", cfs->source()); |
3838 if (cfs->source() != NULL) tty->print(" from %s", cfs->source()); |
3344 tty->print_cr("]"); |
3839 tty->print_cr("]"); |
3345 } |
3840 } |
3346 |
3841 |
3347 u2 super_class_index = cfs->get_u2_fast(); |
3842 u2 super_class_index = cfs->get_u2_fast(); |
3348 if (super_class_index == 0) { |
3843 instanceKlassHandle super_klass = parse_super_class(super_class_index, |
3349 check_property(class_name == vmSymbols::java_lang_Object(), |
3844 CHECK_NULL); |
3350 "Invalid superclass index %u in class file %s", |
|
3351 super_class_index, |
|
3352 CHECK_(nullHandle)); |
|
3353 } else { |
|
3354 check_property(valid_cp_range(super_class_index, cp_size) && |
|
3355 is_klass_reference(cp, super_class_index), |
|
3356 "Invalid superclass index %u in class file %s", |
|
3357 super_class_index, |
|
3358 CHECK_(nullHandle)); |
|
3359 // The class name should be legal because it is checked when parsing constant pool. |
|
3360 // However, make sure it is not an array type. |
|
3361 bool is_array = false; |
|
3362 if (cp->tag_at(super_class_index).is_klass()) { |
|
3363 super_klass = instanceKlassHandle(THREAD, cp->resolved_klass_at(super_class_index)); |
|
3364 if (_need_verify) |
|
3365 is_array = super_klass->oop_is_array(); |
|
3366 } else if (_need_verify) { |
|
3367 is_array = (cp->unresolved_klass_at(super_class_index)->byte_at(0) == JVM_SIGNATURE_ARRAY); |
|
3368 } |
|
3369 if (_need_verify) { |
|
3370 guarantee_property(!is_array, |
|
3371 "Bad superclass name in class file %s", CHECK_(nullHandle)); |
|
3372 } |
|
3373 } |
|
3374 |
3845 |
3375 // Interfaces |
3846 // Interfaces |
3376 u2 itfs_len = cfs->get_u2_fast(); |
3847 u2 itfs_len = cfs->get_u2_fast(); |
3377 Array<Klass*>* local_interfaces; |
3848 Array<Klass*>* local_interfaces = |
3378 if (itfs_len == 0) { |
3849 parse_interfaces(itfs_len, protection_domain, _class_name, |
3379 local_interfaces = Universe::the_empty_klass_array(); |
3850 &has_default_methods, CHECK_(nullHandle)); |
3380 } else { |
|
3381 local_interfaces = parse_interfaces( |
|
3382 cp, itfs_len, loader_data, protection_domain, _class_name, |
|
3383 &has_default_methods, CHECK_(nullHandle)); |
|
3384 } |
|
3385 |
3851 |
3386 u2 java_fields_count = 0; |
3852 u2 java_fields_count = 0; |
3387 // Fields (offsets are filled in later) |
3853 // Fields (offsets are filled in later) |
3388 FieldAllocationCount fac; |
3854 FieldAllocationCount fac; |
3389 Array<AnnotationArray*>* fields_annotations = NULL; |
3855 Array<u2>* fields = parse_fields(class_name, |
3390 Array<AnnotationArray*>* fields_type_annotations = NULL; |
3856 access_flags.is_interface(), |
3391 Array<u2>* fields = parse_fields(loader_data, class_name, cp, access_flags.is_interface(), &fac, &fields_annotations, |
3857 &fac, &java_fields_count, |
3392 &fields_type_annotations, |
3858 CHECK_(nullHandle)); |
3393 &java_fields_count, |
|
3394 CHECK_(nullHandle)); |
|
3395 // Methods |
3859 // Methods |
3396 bool has_final_method = false; |
3860 bool has_final_method = false; |
3397 AccessFlags promoted_flags; |
3861 AccessFlags promoted_flags; |
3398 promoted_flags.set_flags(0); |
3862 promoted_flags.set_flags(0); |
3399 Array<Method*>* methods = parse_methods(loader_data, |
3863 Array<Method*>* methods = parse_methods(access_flags.is_interface(), |
3400 cp, access_flags.is_interface(), |
|
3401 &promoted_flags, |
3864 &promoted_flags, |
3402 &has_final_method, |
3865 &has_final_method, |
3403 &has_default_methods, |
3866 &has_default_methods, |
3404 CHECK_(nullHandle)); |
3867 CHECK_(nullHandle)); |
3405 |
3868 |
3406 // Additional attributes |
3869 // Additional attributes |
3407 ClassAnnotationCollector parsed_annotations; |
3870 ClassAnnotationCollector parsed_annotations; |
3408 parse_classfile_attributes(loader_data, cp, &parsed_annotations, CHECK_(nullHandle)); |
3871 parse_classfile_attributes(&parsed_annotations, CHECK_(nullHandle)); |
3409 |
3872 |
3410 // Make sure this is the end of class file stream |
3873 // Make sure this is the end of class file stream |
3411 guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle)); |
3874 guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle)); |
3412 |
3875 |
3413 // We check super class after class file is parsed and format is checked |
3876 // We check super class after class file is parsed and format is checked |
3450 if (super_klass->is_final()) { |
3913 if (super_klass->is_final()) { |
3451 THROW_MSG_(vmSymbols::java_lang_VerifyError(), "Cannot inherit from final class", nullHandle); |
3914 THROW_MSG_(vmSymbols::java_lang_VerifyError(), "Cannot inherit from final class", nullHandle); |
3452 } |
3915 } |
3453 } |
3916 } |
3454 |
3917 |
3918 // save super klass for error handling. |
|
3919 _super_klass = super_klass; |
|
3920 |
|
3455 // Compute the transitive list of all unique interfaces implemented by this class |
3921 // Compute the transitive list of all unique interfaces implemented by this class |
3456 Array<Klass*>* transitive_interfaces = compute_transitive_interfaces(loader_data, super_klass, local_interfaces, CHECK_(nullHandle)); |
3922 _transitive_interfaces = |
3923 compute_transitive_interfaces(super_klass, local_interfaces, CHECK_(nullHandle)); |
|
3457 |
3924 |
3458 // sort methods |
3925 // sort methods |
3459 Array<int>* method_ordering = sort_methods(loader_data, |
3926 intArray* method_ordering = sort_methods(methods); |
3460 methods, |
|
3461 CHECK_(nullHandle)); |
|
3462 |
3927 |
3463 // promote flags from parse_methods() to the klass' flags |
3928 // promote flags from parse_methods() to the klass' flags |
3464 access_flags.add_promoted_flags(promoted_flags.as_int()); |
3929 access_flags.add_promoted_flags(promoted_flags.as_int()); |
3465 |
3930 |
3466 // Size of Java vtable (in words) |
3931 // Size of Java vtable (in words) |
3474 &vtable_size, &num_miranda_methods, &all_mirandas, super_klass(), methods, |
3939 &vtable_size, &num_miranda_methods, &all_mirandas, super_klass(), methods, |
3475 access_flags, class_loader, class_name, local_interfaces, |
3940 access_flags, class_loader, class_name, local_interfaces, |
3476 CHECK_(nullHandle)); |
3941 CHECK_(nullHandle)); |
3477 |
3942 |
3478 // Size of Java itable (in words) |
3943 // Size of Java itable (in words) |
3479 itable_size = access_flags.is_interface() ? 0 : klassItable::compute_itable_size(transitive_interfaces); |
3944 itable_size = access_flags.is_interface() ? 0 : klassItable::compute_itable_size(_transitive_interfaces); |
3480 |
3945 |
3481 // get the padding width from the option |
3946 FieldLayoutInfo info; |
3482 // TODO: Ask VM about specific CPU we are running on |
3947 layout_fields(class_loader, &fac, &parsed_annotations, &info, CHECK_NULL); |
3483 int pad_size = ContendedPaddingWidth; |
3948 |
3484 |
3949 int total_oop_map_size2 = |
3485 // Field size and offset computation |
3950 InstanceKlass::nonstatic_oop_map_size(info.total_oop_map_count); |
3486 int nonstatic_field_size = super_klass() == NULL ? 0 : super_klass->nonstatic_field_size(); |
3951 |
3487 #ifndef PRODUCT |
|
3488 int orig_nonstatic_field_size = 0; |
|
3489 #endif |
|
3490 int next_static_oop_offset; |
|
3491 int next_static_double_offset; |
|
3492 int next_static_word_offset; |
|
3493 int next_static_short_offset; |
|
3494 int next_static_byte_offset; |
|
3495 int next_nonstatic_oop_offset; |
|
3496 int next_nonstatic_double_offset; |
|
3497 int next_nonstatic_word_offset; |
|
3498 int next_nonstatic_short_offset; |
|
3499 int next_nonstatic_byte_offset; |
|
3500 int next_nonstatic_type_offset; |
|
3501 int first_nonstatic_oop_offset; |
|
3502 int first_nonstatic_field_offset; |
|
3503 int next_nonstatic_field_offset; |
|
3504 int next_nonstatic_padded_offset; |
|
3505 |
|
3506 // Count the contended fields by type. |
|
3507 int nonstatic_contended_count = 0; |
|
3508 FieldAllocationCount fac_contended; |
|
3509 for (AllFieldStream fs(fields, cp); !fs.done(); fs.next()) { |
|
3510 FieldAllocationType atype = (FieldAllocationType) fs.allocation_type(); |
|
3511 if (fs.is_contended()) { |
|
3512 fac_contended.count[atype]++; |
|
3513 if (!fs.access_flags().is_static()) { |
|
3514 nonstatic_contended_count++; |
|
3515 } |
|
3516 } |
|
3517 } |
|
3518 int contended_count = nonstatic_contended_count; |
|
3519 |
|
3520 |
|
3521 // Calculate the starting byte offsets |
|
3522 next_static_oop_offset = InstanceMirrorKlass::offset_of_static_fields(); |
|
3523 |
|
3524 next_static_double_offset = next_static_oop_offset + |
|
3525 ((fac.count[STATIC_OOP]) * heapOopSize); |
|
3526 if ( fac.count[STATIC_DOUBLE] && |
|
3527 (Universe::field_type_should_be_aligned(T_DOUBLE) || |
|
3528 Universe::field_type_should_be_aligned(T_LONG)) ) { |
|
3529 next_static_double_offset = align_size_up(next_static_double_offset, BytesPerLong); |
|
3530 } |
|
3531 |
|
3532 next_static_word_offset = next_static_double_offset + |
|
3533 ((fac.count[STATIC_DOUBLE]) * BytesPerLong); |
|
3534 next_static_short_offset = next_static_word_offset + |
|
3535 ((fac.count[STATIC_WORD]) * BytesPerInt); |
|
3536 next_static_byte_offset = next_static_short_offset + |
|
3537 ((fac.count[STATIC_SHORT]) * BytesPerShort); |
|
3538 |
|
3539 first_nonstatic_field_offset = instanceOopDesc::base_offset_in_bytes() + |
|
3540 nonstatic_field_size * heapOopSize; |
|
3541 |
|
3542 // class is contended, pad before all the fields |
|
3543 if (parsed_annotations.is_contended()) { |
|
3544 first_nonstatic_field_offset += pad_size; |
|
3545 } |
|
3546 |
|
3547 next_nonstatic_field_offset = first_nonstatic_field_offset; |
|
3548 |
|
3549 unsigned int nonstatic_double_count = fac.count[NONSTATIC_DOUBLE] - fac_contended.count[NONSTATIC_DOUBLE]; |
|
3550 unsigned int nonstatic_word_count = fac.count[NONSTATIC_WORD] - fac_contended.count[NONSTATIC_WORD]; |
|
3551 unsigned int nonstatic_short_count = fac.count[NONSTATIC_SHORT] - fac_contended.count[NONSTATIC_SHORT]; |
|
3552 unsigned int nonstatic_byte_count = fac.count[NONSTATIC_BYTE] - fac_contended.count[NONSTATIC_BYTE]; |
|
3553 unsigned int nonstatic_oop_count = fac.count[NONSTATIC_OOP] - fac_contended.count[NONSTATIC_OOP]; |
|
3554 |
|
3555 bool super_has_nonstatic_fields = |
|
3556 (super_klass() != NULL && super_klass->has_nonstatic_fields()); |
|
3557 bool has_nonstatic_fields = super_has_nonstatic_fields || |
|
3558 ((nonstatic_double_count + nonstatic_word_count + |
|
3559 nonstatic_short_count + nonstatic_byte_count + |
|
3560 nonstatic_oop_count) != 0); |
|
3561 |
|
3562 |
|
3563 // Prepare list of oops for oop map generation. |
|
3564 int* nonstatic_oop_offsets; |
|
3565 unsigned int* nonstatic_oop_counts; |
|
3566 unsigned int nonstatic_oop_map_count = 0; |
|
3567 |
|
3568 nonstatic_oop_offsets = NEW_RESOURCE_ARRAY_IN_THREAD( |
|
3569 THREAD, int, nonstatic_oop_count + 1); |
|
3570 nonstatic_oop_counts = NEW_RESOURCE_ARRAY_IN_THREAD( |
|
3571 THREAD, unsigned int, nonstatic_oop_count + 1); |
|
3572 |
|
3573 first_nonstatic_oop_offset = 0; // will be set for first oop field |
|
3574 |
|
3575 #ifndef PRODUCT |
|
3576 if( PrintCompactFieldsSavings ) { |
|
3577 next_nonstatic_double_offset = next_nonstatic_field_offset + |
|
3578 (nonstatic_oop_count * heapOopSize); |
|
3579 if ( nonstatic_double_count > 0 ) { |
|
3580 next_nonstatic_double_offset = align_size_up(next_nonstatic_double_offset, BytesPerLong); |
|
3581 } |
|
3582 next_nonstatic_word_offset = next_nonstatic_double_offset + |
|
3583 (nonstatic_double_count * BytesPerLong); |
|
3584 next_nonstatic_short_offset = next_nonstatic_word_offset + |
|
3585 (nonstatic_word_count * BytesPerInt); |
|
3586 next_nonstatic_byte_offset = next_nonstatic_short_offset + |
|
3587 (nonstatic_short_count * BytesPerShort); |
|
3588 next_nonstatic_type_offset = align_size_up((next_nonstatic_byte_offset + |
|
3589 nonstatic_byte_count ), heapOopSize ); |
|
3590 orig_nonstatic_field_size = nonstatic_field_size + |
|
3591 ((next_nonstatic_type_offset - first_nonstatic_field_offset)/heapOopSize); |
|
3592 } |
|
3593 #endif |
|
3594 bool compact_fields = CompactFields; |
|
3595 int allocation_style = FieldsAllocationStyle; |
|
3596 if( allocation_style < 0 || allocation_style > 2 ) { // Out of range? |
|
3597 assert(false, "0 <= FieldsAllocationStyle <= 2"); |
|
3598 allocation_style = 1; // Optimistic |
|
3599 } |
|
3600 |
|
3601 // The next classes have predefined hard-coded fields offsets |
|
3602 // (see in JavaClasses::compute_hard_coded_offsets()). |
|
3603 // Use default fields allocation order for them. |
|
3604 if( (allocation_style != 0 || compact_fields ) && class_loader.is_null() && |
|
3605 (class_name == vmSymbols::java_lang_AssertionStatusDirectives() || |
|
3606 class_name == vmSymbols::java_lang_Class() || |
|
3607 class_name == vmSymbols::java_lang_ClassLoader() || |
|
3608 class_name == vmSymbols::java_lang_ref_Reference() || |
|
3609 class_name == vmSymbols::java_lang_ref_SoftReference() || |
|
3610 class_name == vmSymbols::java_lang_StackTraceElement() || |
|
3611 class_name == vmSymbols::java_lang_String() || |
|
3612 class_name == vmSymbols::java_lang_Throwable() || |
|
3613 class_name == vmSymbols::java_lang_Boolean() || |
|
3614 class_name == vmSymbols::java_lang_Character() || |
|
3615 class_name == vmSymbols::java_lang_Float() || |
|
3616 class_name == vmSymbols::java_lang_Double() || |
|
3617 class_name == vmSymbols::java_lang_Byte() || |
|
3618 class_name == vmSymbols::java_lang_Short() || |
|
3619 class_name == vmSymbols::java_lang_Integer() || |
|
3620 class_name == vmSymbols::java_lang_Long())) { |
|
3621 allocation_style = 0; // Allocate oops first |
|
3622 compact_fields = false; // Don't compact fields |
|
3623 } |
|
3624 |
|
3625 if( allocation_style == 0 ) { |
|
3626 // Fields order: oops, longs/doubles, ints, shorts/chars, bytes, padded fields |
|
3627 next_nonstatic_oop_offset = next_nonstatic_field_offset; |
|
3628 next_nonstatic_double_offset = next_nonstatic_oop_offset + |
|
3629 (nonstatic_oop_count * heapOopSize); |
|
3630 } else if( allocation_style == 1 ) { |
|
3631 // Fields order: longs/doubles, ints, shorts/chars, bytes, oops, padded fields |
|
3632 next_nonstatic_double_offset = next_nonstatic_field_offset; |
|
3633 } else if( allocation_style == 2 ) { |
|
3634 // Fields allocation: oops fields in super and sub classes are together. |
|
3635 if( nonstatic_field_size > 0 && super_klass() != NULL && |
|
3636 super_klass->nonstatic_oop_map_size() > 0 ) { |
|
3637 int map_count = super_klass->nonstatic_oop_map_count(); |
|
3638 OopMapBlock* first_map = super_klass->start_of_nonstatic_oop_maps(); |
|
3639 OopMapBlock* last_map = first_map + map_count - 1; |
|
3640 int next_offset = last_map->offset() + (last_map->count() * heapOopSize); |
|
3641 if (next_offset == next_nonstatic_field_offset) { |
|
3642 allocation_style = 0; // allocate oops first |
|
3643 next_nonstatic_oop_offset = next_nonstatic_field_offset; |
|
3644 next_nonstatic_double_offset = next_nonstatic_oop_offset + |
|
3645 (nonstatic_oop_count * heapOopSize); |
|
3646 } |
|
3647 } |
|
3648 if( allocation_style == 2 ) { |
|
3649 allocation_style = 1; // allocate oops last |
|
3650 next_nonstatic_double_offset = next_nonstatic_field_offset; |
|
3651 } |
|
3652 } else { |
|
3653 ShouldNotReachHere(); |
|
3654 } |
|
3655 |
|
3656 int nonstatic_oop_space_count = 0; |
|
3657 int nonstatic_word_space_count = 0; |
|
3658 int nonstatic_short_space_count = 0; |
|
3659 int nonstatic_byte_space_count = 0; |
|
3660 int nonstatic_oop_space_offset; |
|
3661 int nonstatic_word_space_offset; |
|
3662 int nonstatic_short_space_offset; |
|
3663 int nonstatic_byte_space_offset; |
|
3664 |
|
3665 if( nonstatic_double_count > 0 ) { |
|
3666 int offset = next_nonstatic_double_offset; |
|
3667 next_nonstatic_double_offset = align_size_up(offset, BytesPerLong); |
|
3668 if( compact_fields && offset != next_nonstatic_double_offset ) { |
|
3669 // Allocate available fields into the gap before double field. |
|
3670 int length = next_nonstatic_double_offset - offset; |
|
3671 assert(length == BytesPerInt, ""); |
|
3672 nonstatic_word_space_offset = offset; |
|
3673 if( nonstatic_word_count > 0 ) { |
|
3674 nonstatic_word_count -= 1; |
|
3675 nonstatic_word_space_count = 1; // Only one will fit |
|
3676 length -= BytesPerInt; |
|
3677 offset += BytesPerInt; |
|
3678 } |
|
3679 nonstatic_short_space_offset = offset; |
|
3680 while( length >= BytesPerShort && nonstatic_short_count > 0 ) { |
|
3681 nonstatic_short_count -= 1; |
|
3682 nonstatic_short_space_count += 1; |
|
3683 length -= BytesPerShort; |
|
3684 offset += BytesPerShort; |
|
3685 } |
|
3686 nonstatic_byte_space_offset = offset; |
|
3687 while( length > 0 && nonstatic_byte_count > 0 ) { |
|
3688 nonstatic_byte_count -= 1; |
|
3689 nonstatic_byte_space_count += 1; |
|
3690 length -= 1; |
|
3691 } |
|
3692 // Allocate oop field in the gap if there are no other fields for that. |
|
3693 nonstatic_oop_space_offset = offset; |
|
3694 if( length >= heapOopSize && nonstatic_oop_count > 0 && |
|
3695 allocation_style != 0 ) { // when oop fields not first |
|
3696 nonstatic_oop_count -= 1; |
|
3697 nonstatic_oop_space_count = 1; // Only one will fit |
|
3698 length -= heapOopSize; |
|
3699 offset += heapOopSize; |
|
3700 } |
|
3701 } |
|
3702 } |
|
3703 |
|
3704 next_nonstatic_word_offset = next_nonstatic_double_offset + |
|
3705 (nonstatic_double_count * BytesPerLong); |
|
3706 next_nonstatic_short_offset = next_nonstatic_word_offset + |
|
3707 (nonstatic_word_count * BytesPerInt); |
|
3708 next_nonstatic_byte_offset = next_nonstatic_short_offset + |
|
3709 (nonstatic_short_count * BytesPerShort); |
|
3710 next_nonstatic_padded_offset = next_nonstatic_byte_offset + |
|
3711 nonstatic_byte_count; |
|
3712 |
|
3713 // let oops jump before padding with this allocation style |
|
3714 if( allocation_style == 1 ) { |
|
3715 next_nonstatic_oop_offset = next_nonstatic_padded_offset; |
|
3716 if( nonstatic_oop_count > 0 ) { |
|
3717 next_nonstatic_oop_offset = align_size_up(next_nonstatic_oop_offset, heapOopSize); |
|
3718 } |
|
3719 next_nonstatic_padded_offset = next_nonstatic_oop_offset + (nonstatic_oop_count * heapOopSize); |
|
3720 } |
|
3721 |
|
3722 // Iterate over fields again and compute correct offsets. |
|
3723 // The field allocation type was temporarily stored in the offset slot. |
|
3724 // oop fields are located before non-oop fields (static and non-static). |
|
3725 for (AllFieldStream fs(fields, cp); !fs.done(); fs.next()) { |
|
3726 |
|
3727 // skip already laid out fields |
|
3728 if (fs.is_offset_set()) continue; |
|
3729 |
|
3730 // contended instance fields are handled below |
|
3731 if (fs.is_contended() && !fs.access_flags().is_static()) continue; |
|
3732 |
|
3733 int real_offset; |
|
3734 FieldAllocationType atype = (FieldAllocationType) fs.allocation_type(); |
|
3735 |
|
3736 // pack the rest of the fields |
|
3737 switch (atype) { |
|
3738 case STATIC_OOP: |
|
3739 real_offset = next_static_oop_offset; |
|
3740 next_static_oop_offset += heapOopSize; |
|
3741 break; |
|
3742 case STATIC_BYTE: |
|
3743 real_offset = next_static_byte_offset; |
|
3744 next_static_byte_offset += 1; |
|
3745 break; |
|
3746 case STATIC_SHORT: |
|
3747 real_offset = next_static_short_offset; |
|
3748 next_static_short_offset += BytesPerShort; |
|
3749 break; |
|
3750 case STATIC_WORD: |
|
3751 real_offset = next_static_word_offset; |
|
3752 next_static_word_offset += BytesPerInt; |
|
3753 break; |
|
3754 case STATIC_DOUBLE: |
|
3755 real_offset = next_static_double_offset; |
|
3756 next_static_double_offset += BytesPerLong; |
|
3757 break; |
|
3758 case NONSTATIC_OOP: |
|
3759 if( nonstatic_oop_space_count > 0 ) { |
|
3760 real_offset = nonstatic_oop_space_offset; |
|
3761 nonstatic_oop_space_offset += heapOopSize; |
|
3762 nonstatic_oop_space_count -= 1; |
|
3763 } else { |
|
3764 real_offset = next_nonstatic_oop_offset; |
|
3765 next_nonstatic_oop_offset += heapOopSize; |
|
3766 } |
|
3767 // Update oop maps |
|
3768 if( nonstatic_oop_map_count > 0 && |
|
3769 nonstatic_oop_offsets[nonstatic_oop_map_count - 1] == |
|
3770 real_offset - |
|
3771 int(nonstatic_oop_counts[nonstatic_oop_map_count - 1]) * |
|
3772 heapOopSize ) { |
|
3773 // Extend current oop map |
|
3774 nonstatic_oop_counts[nonstatic_oop_map_count - 1] += 1; |
|
3775 } else { |
|
3776 // Create new oop map |
|
3777 nonstatic_oop_offsets[nonstatic_oop_map_count] = real_offset; |
|
3778 nonstatic_oop_counts [nonstatic_oop_map_count] = 1; |
|
3779 nonstatic_oop_map_count += 1; |
|
3780 if( first_nonstatic_oop_offset == 0 ) { // Undefined |
|
3781 first_nonstatic_oop_offset = real_offset; |
|
3782 } |
|
3783 } |
|
3784 break; |
|
3785 case NONSTATIC_BYTE: |
|
3786 if( nonstatic_byte_space_count > 0 ) { |
|
3787 real_offset = nonstatic_byte_space_offset; |
|
3788 nonstatic_byte_space_offset += 1; |
|
3789 nonstatic_byte_space_count -= 1; |
|
3790 } else { |
|
3791 real_offset = next_nonstatic_byte_offset; |
|
3792 next_nonstatic_byte_offset += 1; |
|
3793 } |
|
3794 break; |
|
3795 case NONSTATIC_SHORT: |
|
3796 if( nonstatic_short_space_count > 0 ) { |
|
3797 real_offset = nonstatic_short_space_offset; |
|
3798 nonstatic_short_space_offset += BytesPerShort; |
|
3799 nonstatic_short_space_count -= 1; |
|
3800 } else { |
|
3801 real_offset = next_nonstatic_short_offset; |
|
3802 next_nonstatic_short_offset += BytesPerShort; |
|
3803 } |
|
3804 break; |
|
3805 case NONSTATIC_WORD: |
|
3806 if( nonstatic_word_space_count > 0 ) { |
|
3807 real_offset = nonstatic_word_space_offset; |
|
3808 nonstatic_word_space_offset += BytesPerInt; |
|
3809 nonstatic_word_space_count -= 1; |
|
3810 } else { |
|
3811 real_offset = next_nonstatic_word_offset; |
|
3812 next_nonstatic_word_offset += BytesPerInt; |
|
3813 } |
|
3814 break; |
|
3815 case NONSTATIC_DOUBLE: |
|
3816 real_offset = next_nonstatic_double_offset; |
|
3817 next_nonstatic_double_offset += BytesPerLong; |
|
3818 break; |
|
3819 default: |
|
3820 ShouldNotReachHere(); |
|
3821 } |
|
3822 fs.set_offset(real_offset); |
|
3823 } |
|
3824 |
|
3825 |
|
3826 // Handle the contended cases. |
|
3827 // |
|
3828 // Each contended field should not intersect the cache line with another contended field. |
|
3829 // In the absence of alignment information, we end up with pessimistically separating |
|
3830 // the fields with full-width padding. |
|
3831 // |
|
3832 // Additionally, this should not break alignment for the fields, so we round the alignment up |
|
3833 // for each field. |
|
3834 if (contended_count > 0) { |
|
3835 |
|
3836 // if there is at least one contended field, we need to have pre-padding for them |
|
3837 if (nonstatic_contended_count > 0) { |
|
3838 next_nonstatic_padded_offset += pad_size; |
|
3839 } |
|
3840 |
|
3841 // collect all contended groups |
|
3842 BitMap bm(cp->size()); |
|
3843 for (AllFieldStream fs(fields, cp); !fs.done(); fs.next()) { |
|
3844 // skip already laid out fields |
|
3845 if (fs.is_offset_set()) continue; |
|
3846 |
|
3847 if (fs.is_contended()) { |
|
3848 bm.set_bit(fs.contended_group()); |
|
3849 } |
|
3850 } |
|
3851 |
|
3852 int current_group = -1; |
|
3853 while ((current_group = (int)bm.get_next_one_offset(current_group + 1)) != (int)bm.size()) { |
|
3854 |
|
3855 for (AllFieldStream fs(fields, cp); !fs.done(); fs.next()) { |
|
3856 |
|
3857 // skip already laid out fields |
|
3858 if (fs.is_offset_set()) continue; |
|
3859 |
|
3860 // skip non-contended fields and fields from different group |
|
3861 if (!fs.is_contended() || (fs.contended_group() != current_group)) continue; |
|
3862 |
|
3863 // handle statics below |
|
3864 if (fs.access_flags().is_static()) continue; |
|
3865 |
|
3866 int real_offset; |
|
3867 FieldAllocationType atype = (FieldAllocationType) fs.allocation_type(); |
|
3868 |
|
3869 switch (atype) { |
|
3870 case NONSTATIC_BYTE: |
|
3871 next_nonstatic_padded_offset = align_size_up(next_nonstatic_padded_offset, 1); |
|
3872 real_offset = next_nonstatic_padded_offset; |
|
3873 next_nonstatic_padded_offset += 1; |
|
3874 break; |
|
3875 |
|
3876 case NONSTATIC_SHORT: |
|
3877 next_nonstatic_padded_offset = align_size_up(next_nonstatic_padded_offset, BytesPerShort); |
|
3878 real_offset = next_nonstatic_padded_offset; |
|
3879 next_nonstatic_padded_offset += BytesPerShort; |
|
3880 break; |
|
3881 |
|
3882 case NONSTATIC_WORD: |
|
3883 next_nonstatic_padded_offset = align_size_up(next_nonstatic_padded_offset, BytesPerInt); |
|
3884 real_offset = next_nonstatic_padded_offset; |
|
3885 next_nonstatic_padded_offset += BytesPerInt; |
|
3886 break; |
|
3887 |
|
3888 case NONSTATIC_DOUBLE: |
|
3889 next_nonstatic_padded_offset = align_size_up(next_nonstatic_padded_offset, BytesPerLong); |
|
3890 real_offset = next_nonstatic_padded_offset; |
|
3891 next_nonstatic_padded_offset += BytesPerLong; |
|
3892 break; |
|
3893 |
|
3894 case NONSTATIC_OOP: |
|
3895 next_nonstatic_padded_offset = align_size_up(next_nonstatic_padded_offset, heapOopSize); |
|
3896 real_offset = next_nonstatic_padded_offset; |
|
3897 next_nonstatic_padded_offset += heapOopSize; |
|
3898 |
|
3899 // Create new oop map |
|
3900 nonstatic_oop_offsets[nonstatic_oop_map_count] = real_offset; |
|
3901 nonstatic_oop_counts [nonstatic_oop_map_count] = 1; |
|
3902 nonstatic_oop_map_count += 1; |
|
3903 if( first_nonstatic_oop_offset == 0 ) { // Undefined |
|
3904 first_nonstatic_oop_offset = real_offset; |
|
3905 } |
|
3906 break; |
|
3907 |
|
3908 default: |
|
3909 ShouldNotReachHere(); |
|
3910 } |
|
3911 |
|
3912 if (fs.contended_group() == 0) { |
|
3913 // Contended group defines the equivalence class over the fields: |
|
3914 // the fields within the same contended group are not inter-padded. |
|
3915 // The only exception is default group, which does not incur the |
|
3916 // equivalence, and so requires intra-padding. |
|
3917 next_nonstatic_padded_offset += pad_size; |
|
3918 } |
|
3919 |
|
3920 fs.set_offset(real_offset); |
|
3921 } // for |
|
3922 |
|
3923 // Start laying out the next group. |
|
3924 // Note that this will effectively pad the last group in the back; |
|
3925 // this is expected to alleviate memory contention effects for |
|
3926 // subclass fields and/or adjacent object. |
|
3927 // If this was the default group, the padding is already in place. |
|
3928 if (current_group != 0) { |
|
3929 next_nonstatic_padded_offset += pad_size; |
|
3930 } |
|
3931 } |
|
3932 |
|
3933 // handle static fields |
|
3934 |
|
3935 } // handle contended |
|
3936 |
|
3937 // Size of instances |
|
3938 int instance_size; |
|
3939 |
|
3940 int notaligned_offset = next_nonstatic_padded_offset; |
|
3941 |
|
3942 // Entire class is contended, pad in the back. |
|
3943 // This helps to alleviate memory contention effects for subclass fields |
|
3944 // and/or adjacent object. |
|
3945 if (parsed_annotations.is_contended()) { |
|
3946 notaligned_offset += pad_size; |
|
3947 } |
|
3948 |
|
3949 int next_static_type_offset = align_size_up(next_static_byte_offset, wordSize); |
|
3950 int static_field_size = (next_static_type_offset - |
|
3951 InstanceMirrorKlass::offset_of_static_fields()) / wordSize; |
|
3952 |
|
3953 next_nonstatic_type_offset = align_size_up(notaligned_offset, heapOopSize ); |
|
3954 nonstatic_field_size = nonstatic_field_size + ((next_nonstatic_type_offset |
|
3955 - first_nonstatic_field_offset)/heapOopSize); |
|
3956 |
|
3957 next_nonstatic_type_offset = align_size_up(notaligned_offset, wordSize ); |
|
3958 instance_size = align_object_size(next_nonstatic_type_offset / wordSize); |
|
3959 |
|
3960 assert(instance_size == align_object_size(align_size_up( |
|
3961 (instanceOopDesc::base_offset_in_bytes() + nonstatic_field_size*heapOopSize + ((parsed_annotations.is_contended()) ? pad_size : 0)), |
|
3962 wordSize) / wordSize), "consistent layout helper value"); |
|
3963 |
|
3964 // Number of non-static oop map blocks allocated at end of klass. |
|
3965 const unsigned int total_oop_map_count = |
|
3966 compute_oop_map_count(super_klass, nonstatic_oop_map_count, |
|
3967 first_nonstatic_oop_offset); |
|
3968 // Compute reference type |
3952 // Compute reference type |
3969 ReferenceType rt; |
3953 ReferenceType rt; |
3970 if (super_klass() == NULL) { |
3954 if (super_klass() == NULL) { |
3971 rt = REF_NONE; |
3955 rt = REF_NONE; |
3972 } else { |
3956 } else { |
3973 rt = super_klass->reference_type(); |
3957 rt = super_klass->reference_type(); |
3974 } |
3958 } |
3975 |
3959 |
3976 // We can now create the basic Klass* for this klass |
3960 // We can now create the basic Klass* for this klass |
3977 int total_oop_map_size2 = |
3961 _klass = InstanceKlass::allocate_instance_klass(loader_data, |
3978 InstanceKlass::nonstatic_oop_map_size(total_oop_map_count); |
3962 vtable_size, |
3979 |
3963 itable_size, |
3980 Klass* ik = InstanceKlass::allocate_instance_klass(loader_data, |
3964 info.static_field_size, |
3981 vtable_size, |
3965 total_oop_map_size2, |
3982 itable_size, |
3966 rt, |
3983 static_field_size, |
3967 access_flags, |
3984 total_oop_map_size2, |
3968 name, |
3985 rt, |
3969 super_klass(), |
3986 access_flags, |
3970 !host_klass.is_null(), |
3987 name, |
3971 CHECK_(nullHandle)); |
3988 super_klass(), |
3972 instanceKlassHandle this_klass (THREAD, _klass); |
3989 !host_klass.is_null(), |
3973 |
3990 CHECK_(nullHandle)); |
3974 assert(this_klass->static_field_size() == info.static_field_size, "sanity"); |
3991 |
3975 assert(this_klass->nonstatic_oop_map_count() == info.total_oop_map_count, |
3992 // Add all classes to our internal class loader list here, |
|
3993 // including classes in the bootstrap (NULL) class loader. |
|
3994 loader_data->add_class(ik); |
|
3995 |
|
3996 instanceKlassHandle this_klass (THREAD, ik); |
|
3997 |
|
3998 assert(this_klass->static_field_size() == static_field_size, "sanity"); |
|
3999 assert(this_klass->nonstatic_oop_map_count() == total_oop_map_count, |
|
4000 "sanity"); |
3976 "sanity"); |
4001 |
3977 |
4002 // Fill in information already parsed |
3978 // Fill in information already parsed |
4003 this_klass->set_should_verify_class(verify); |
3979 this_klass->set_should_verify_class(verify); |
4004 jint lh = Klass::instance_layout_helper(instance_size, false); |
3980 jint lh = Klass::instance_layout_helper(info.instance_size, false); |
4005 this_klass->set_layout_helper(lh); |
3981 this_klass->set_layout_helper(lh); |
4006 assert(this_klass->oop_is_instance(), "layout is correct"); |
3982 assert(this_klass->oop_is_instance(), "layout is correct"); |
4007 assert(this_klass->size_helper() == instance_size, "correct size_helper"); |
3983 assert(this_klass->size_helper() == info.instance_size, "correct size_helper"); |
4008 // Not yet: supers are done below to support the new subtype-checking fields |
3984 // Not yet: supers are done below to support the new subtype-checking fields |
4009 //this_klass->set_super(super_klass()); |
3985 //this_klass->set_super(super_klass()); |
4010 this_klass->set_class_loader_data(loader_data); |
3986 this_klass->set_class_loader_data(loader_data); |
4011 this_klass->set_nonstatic_field_size(nonstatic_field_size); |
3987 this_klass->set_nonstatic_field_size(info.nonstatic_field_size); |
4012 this_klass->set_has_nonstatic_fields(has_nonstatic_fields); |
3988 this_klass->set_has_nonstatic_fields(info.has_nonstatic_fields); |
4013 this_klass->set_static_oop_field_count(fac.count[STATIC_OOP]); |
3989 this_klass->set_static_oop_field_count(fac.count[STATIC_OOP]); |
4014 cp->set_pool_holder(this_klass()); |
3990 |
4015 error_handler.set_in_error(false); // turn off error handler for cp |
3991 apply_parsed_class_metadata(this_klass, java_fields_count, CHECK_NULL); |
4016 this_klass->set_constants(cp()); |
3992 |
4017 this_klass->set_local_interfaces(local_interfaces); |
|
4018 this_klass->set_fields(fields, java_fields_count); |
|
4019 this_klass->set_methods(methods); |
|
4020 if (has_final_method) { |
3993 if (has_final_method) { |
4021 this_klass->set_has_final_method(); |
3994 this_klass->set_has_final_method(); |
4022 } |
3995 } |
4023 this_klass->set_method_ordering(method_ordering); |
3996 this_klass->copy_method_ordering(method_ordering, CHECK_NULL); |
4024 // The InstanceKlass::_methods_jmethod_ids cache and the |
3997 // The InstanceKlass::_methods_jmethod_ids cache and the |
4025 // InstanceKlass::_methods_cached_itable_indices cache are |
3998 // InstanceKlass::_methods_cached_itable_indices cache are |
4026 // both managed on the assumption that the initial cache |
3999 // both managed on the assumption that the initial cache |
4027 // size is equal to the number of methods in the class. If |
4000 // size is equal to the number of methods in the class. If |
4028 // that changes, then InstanceKlass::idnum_can_increment() |
4001 // that changes, then InstanceKlass::idnum_can_increment() |
4030 this_klass->set_initial_method_idnum(methods->length()); |
4003 this_klass->set_initial_method_idnum(methods->length()); |
4031 this_klass->set_name(cp->klass_name_at(this_class_index)); |
4004 this_klass->set_name(cp->klass_name_at(this_class_index)); |
4032 if (is_anonymous()) // I am well known to myself |
4005 if (is_anonymous()) // I am well known to myself |
4033 cp->klass_at_put(this_class_index, this_klass()); // eagerly resolve |
4006 cp->klass_at_put(this_class_index, this_klass()); // eagerly resolve |
4034 |
4007 |
4035 // Assign allocations if needed |
|
4036 if (_annotations != NULL || _type_annotations != NULL || |
|
4037 fields_annotations != NULL || fields_type_annotations != NULL) { |
|
4038 Annotations* annotations = Annotations::allocate(loader_data, CHECK_NULL); |
|
4039 annotations->set_class_annotations(_annotations); |
|
4040 annotations->set_class_type_annotations(_type_annotations); |
|
4041 annotations->set_fields_annotations(fields_annotations); |
|
4042 annotations->set_fields_type_annotations(fields_type_annotations); |
|
4043 this_klass->set_annotations(annotations); |
|
4044 } |
|
4045 |
|
4046 this_klass->set_minor_version(minor_version); |
4008 this_klass->set_minor_version(minor_version); |
4047 this_klass->set_major_version(major_version); |
4009 this_klass->set_major_version(major_version); |
4048 this_klass->set_has_default_methods(has_default_methods); |
4010 this_klass->set_has_default_methods(has_default_methods); |
4049 |
4011 |
4050 // Set up Method*::intrinsic_id as soon as we know the names of methods. |
4012 // Set up Method*::intrinsic_id as soon as we know the names of methods. |
4075 // super class exists and this class inherited miranda methods |
4037 // super class exists and this class inherited miranda methods |
4076 ) { |
4038 ) { |
4077 this_klass->set_has_miranda_methods(); // then set a flag |
4039 this_klass->set_has_miranda_methods(); // then set a flag |
4078 } |
4040 } |
4079 |
4041 |
4080 this_klass->set_transitive_interfaces(transitive_interfaces); |
|
4081 |
|
4082 // Fill in information needed to compute superclasses. |
4042 // Fill in information needed to compute superclasses. |
4083 this_klass->initialize_supers(super_klass(), CHECK_(nullHandle)); |
4043 this_klass->initialize_supers(super_klass(), CHECK_(nullHandle)); |
4084 |
4044 |
4085 // Initialize itable offset tables |
4045 // Initialize itable offset tables |
4086 klassItable::setup_itable_offset_table(this_klass); |
4046 klassItable::setup_itable_offset_table(this_klass); |
4087 |
4047 |
4088 // Compute transitive closure of interfaces this class implements |
4048 // Compute transitive closure of interfaces this class implements |
4089 // Do final class setup |
4049 // Do final class setup |
4090 fill_oop_maps(this_klass, nonstatic_oop_map_count, nonstatic_oop_offsets, nonstatic_oop_counts); |
4050 fill_oop_maps(this_klass, info.nonstatic_oop_map_count, info.nonstatic_oop_offsets, info.nonstatic_oop_counts); |
4091 |
4051 |
4092 // Fill in has_finalizer, has_vanilla_constructor, and layout_helper |
4052 // Fill in has_finalizer, has_vanilla_constructor, and layout_helper |
4093 set_precomputed_flags(this_klass); |
4053 set_precomputed_flags(this_klass); |
4094 |
4054 |
4095 // reinitialize modifiers, using the InnerClasses attribute |
4055 // reinitialize modifiers, using the InnerClasses attribute |
4184 tty->print("RESOLVE %s %s (interface)\n", from, to); |
4144 tty->print("RESOLVE %s %s (interface)\n", from, to); |
4185 } |
4145 } |
4186 } |
4146 } |
4187 } |
4147 } |
4188 |
4148 |
4189 #ifndef PRODUCT |
|
4190 if( PrintCompactFieldsSavings ) { |
|
4191 ResourceMark rm; |
|
4192 if( nonstatic_field_size < orig_nonstatic_field_size ) { |
|
4193 tty->print("[Saved %d of %d bytes in %s]\n", |
|
4194 (orig_nonstatic_field_size - nonstatic_field_size)*heapOopSize, |
|
4195 orig_nonstatic_field_size*heapOopSize, |
|
4196 this_klass->external_name()); |
|
4197 } else if( nonstatic_field_size > orig_nonstatic_field_size ) { |
|
4198 tty->print("[Wasted %d over %d bytes in %s]\n", |
|
4199 (nonstatic_field_size - orig_nonstatic_field_size)*heapOopSize, |
|
4200 orig_nonstatic_field_size*heapOopSize, |
|
4201 this_klass->external_name()); |
|
4202 } |
|
4203 } |
|
4204 #endif |
|
4205 |
|
4206 #ifndef PRODUCT |
|
4207 if (PrintFieldLayout) { |
|
4208 print_field_layout(name, |
|
4209 fields, |
|
4210 cp, |
|
4211 instance_size, |
|
4212 first_nonstatic_field_offset, |
|
4213 next_nonstatic_field_offset, |
|
4214 next_static_type_offset); |
|
4215 } |
|
4216 #endif |
|
4217 |
|
4218 // preserve result across HandleMark |
4149 // preserve result across HandleMark |
4219 preserve_this_klass = this_klass(); |
4150 preserve_this_klass = this_klass(); |
4220 } |
4151 } |
4221 |
4152 |
4222 // Create new handle outside HandleMark (might be needed for |
4153 // Create new handle outside HandleMark (might be needed for |
4223 // Extended Class Redefinition) |
4154 // Extended Class Redefinition) |
4224 instanceKlassHandle this_klass (THREAD, preserve_this_klass); |
4155 instanceKlassHandle this_klass (THREAD, preserve_this_klass); |
4225 debug_only(this_klass->verify();) |
4156 debug_only(this_klass->verify();) |
4226 |
4157 |
4158 // Clear class if no error has occurred so destructor doesn't deallocate it |
|
4159 _klass = NULL; |
|
4227 return this_klass; |
4160 return this_klass; |
4161 } |
|
4162 |
|
4163 // Destructor to clean up if there's an error |
|
4164 ClassFileParser::~ClassFileParser() { |
|
4165 MetadataFactory::free_metadata(_loader_data, _cp); |
|
4166 MetadataFactory::free_array<u2>(_loader_data, _fields); |
|
4167 |
|
4168 // Free methods |
|
4169 InstanceKlass::deallocate_methods(_loader_data, _methods); |
|
4170 |
|
4171 // beware of the Universe::empty_blah_array!! |
|
4172 if (_inner_classes != Universe::the_empty_short_array()) { |
|
4173 MetadataFactory::free_array<u2>(_loader_data, _inner_classes); |
|
4174 } |
|
4175 |
|
4176 // Free interfaces |
|
4177 InstanceKlass::deallocate_interfaces(_loader_data, _super_klass(), |
|
4178 _local_interfaces, _transitive_interfaces); |
|
4179 |
|
4180 MetadataFactory::free_array<u1>(_loader_data, _annotations); |
|
4181 MetadataFactory::free_array<u1>(_loader_data, _type_annotations); |
|
4182 Annotations::free_contents(_loader_data, _fields_annotations); |
|
4183 Annotations::free_contents(_loader_data, _fields_type_annotations); |
|
4184 |
|
4185 clear_class_metadata(); |
|
4186 |
|
4187 // deallocate the klass if already created. |
|
4188 MetadataFactory::free_metadata(_loader_data, _klass); |
|
4189 _klass = NULL; |
|
4228 } |
4190 } |
4229 |
4191 |
4230 void ClassFileParser::print_field_layout(Symbol* name, |
4192 void ClassFileParser::print_field_layout(Symbol* name, |
4231 Array<u2>* fields, |
4193 Array<u2>* fields, |
4232 constantPoolHandle cp, |
4194 constantPoolHandle cp, |
4416 } |
4378 } |
4417 } |
4379 } |
4418 } |
4380 } |
4419 } |
4381 } |
4420 |
4382 |
4421 // utility method for appending and array with check for duplicates |
4383 // utility methods for appending an array with check for duplicates |
4422 |
4384 |
4423 void append_interfaces(GrowableArray<Klass*>* result, Array<Klass*>* ifs) { |
4385 void append_interfaces(GrowableArray<Klass*>* result, Array<Klass*>* ifs) { |
4424 // iterate over new interfaces |
4386 // iterate over new interfaces |
4425 for (int i = 0; i < ifs->length(); i++) { |
4387 for (int i = 0; i < ifs->length(); i++) { |
4426 Klass* e = ifs->at(i); |
4388 Klass* e = ifs->at(i); |
4428 // add new interface |
4390 // add new interface |
4429 result->append_if_missing(e); |
4391 result->append_if_missing(e); |
4430 } |
4392 } |
4431 } |
4393 } |
4432 |
4394 |
4433 |
4395 Array<Klass*>* ClassFileParser::compute_transitive_interfaces( |
4434 Array<Klass*>* ClassFileParser::compute_transitive_interfaces(ClassLoaderData* loader_data, instanceKlassHandle super, Array<Klass*>* local_ifs, TRAPS) { |
4396 instanceKlassHandle super, |
4397 Array<Klass*>* local_ifs, TRAPS) { |
|
4435 // Compute maximum size for transitive interfaces |
4398 // Compute maximum size for transitive interfaces |
4436 int max_transitive_size = 0; |
4399 int max_transitive_size = 0; |
4437 int super_size = 0; |
4400 int super_size = 0; |
4438 // Add superclass transitive interfaces size |
4401 // Add superclass transitive interfaces size |
4439 if (super.not_null()) { |
4402 if (super.not_null()) { |
4476 append_interfaces(result, local_ifs); |
4439 append_interfaces(result, local_ifs); |
4477 |
4440 |
4478 // length will be less than the max_transitive_size if duplicates were removed |
4441 // length will be less than the max_transitive_size if duplicates were removed |
4479 int length = result->length(); |
4442 int length = result->length(); |
4480 assert(length <= max_transitive_size, "just checking"); |
4443 assert(length <= max_transitive_size, "just checking"); |
4481 Array<Klass*>* new_result = MetadataFactory::new_array<Klass*>(loader_data, length, CHECK_NULL); |
4444 Array<Klass*>* new_result = MetadataFactory::new_array<Klass*>(_loader_data, length, CHECK_NULL); |
4482 for (int i = 0; i < length; i++) { |
4445 for (int i = 0; i < length; i++) { |
4483 Klass* e = result->at(i); |
4446 Klass* e = result->at(i); |
4484 assert(e != NULL, "just checking"); |
4447 assert(e != NULL, "just checking"); |
4485 new_result->at_put(i, e); |
4448 new_result->at_put(i, e); |
4486 } |
4449 } |
4487 return new_result; |
4450 return new_result; |
4488 } |
4451 } |
4489 } |
4452 } |
4490 |
|
4491 |
4453 |
4492 void ClassFileParser::check_super_class_access(instanceKlassHandle this_klass, TRAPS) { |
4454 void ClassFileParser::check_super_class_access(instanceKlassHandle this_klass, TRAPS) { |
4493 Klass* super = this_klass->super(); |
4455 Klass* super = this_klass->super(); |
4494 if ((super != NULL) && |
4456 if ((super != NULL) && |
4495 (!Reflection::verify_class_access(this_klass(), super, false))) { |
4457 (!Reflection::verify_class_access(this_klass(), super, false))) { |