Mercurial > hg > graal-compiler
comparison src/share/vm/oops/instanceKlassKlass.cpp @ 6038:8bafad97cd26
7158552: The instanceKlsss::_host_klass is only needed for anonymous class for JSR 292 support.
Summary: Change the _host_klass to be conditionally created embedded instanceKlass field.
Reviewed-by: jrose, coleenp, dholmes
author | jiangli |
---|---|
date | Wed, 02 May 2012 13:21:36 -0400 |
parents | 49036505ab5f |
children | 04ade88d9712 |
comparison
equal
deleted
inserted
replaced
6024:973046802b6f | 6038:8bafad97cd26 |
---|---|
101 MarkSweep::mark_and_push(ik->adr_fields()); | 101 MarkSweep::mark_and_push(ik->adr_fields()); |
102 MarkSweep::mark_and_push(ik->adr_constants()); | 102 MarkSweep::mark_and_push(ik->adr_constants()); |
103 MarkSweep::mark_and_push(ik->adr_class_loader()); | 103 MarkSweep::mark_and_push(ik->adr_class_loader()); |
104 MarkSweep::mark_and_push(ik->adr_inner_classes()); | 104 MarkSweep::mark_and_push(ik->adr_inner_classes()); |
105 MarkSweep::mark_and_push(ik->adr_protection_domain()); | 105 MarkSweep::mark_and_push(ik->adr_protection_domain()); |
106 MarkSweep::mark_and_push(ik->adr_host_klass()); | 106 if (ik->adr_host_klass() != NULL) { |
107 MarkSweep::mark_and_push(ik->adr_host_klass()); | |
108 } | |
107 MarkSweep::mark_and_push(ik->adr_signers()); | 109 MarkSweep::mark_and_push(ik->adr_signers()); |
108 MarkSweep::mark_and_push(ik->adr_class_annotations()); | 110 MarkSweep::mark_and_push(ik->adr_class_annotations()); |
109 MarkSweep::mark_and_push(ik->adr_fields_annotations()); | 111 MarkSweep::mark_and_push(ik->adr_fields_annotations()); |
110 MarkSweep::mark_and_push(ik->adr_methods_annotations()); | 112 MarkSweep::mark_and_push(ik->adr_methods_annotations()); |
111 MarkSweep::mark_and_push(ik->adr_methods_parameter_annotations()); | 113 MarkSweep::mark_and_push(ik->adr_methods_parameter_annotations()); |
137 PSParallelCompact::mark_and_push(cm, ik->adr_fields()); | 139 PSParallelCompact::mark_and_push(cm, ik->adr_fields()); |
138 PSParallelCompact::mark_and_push(cm, ik->adr_constants()); | 140 PSParallelCompact::mark_and_push(cm, ik->adr_constants()); |
139 PSParallelCompact::mark_and_push(cm, ik->adr_class_loader()); | 141 PSParallelCompact::mark_and_push(cm, ik->adr_class_loader()); |
140 PSParallelCompact::mark_and_push(cm, ik->adr_inner_classes()); | 142 PSParallelCompact::mark_and_push(cm, ik->adr_inner_classes()); |
141 PSParallelCompact::mark_and_push(cm, ik->adr_protection_domain()); | 143 PSParallelCompact::mark_and_push(cm, ik->adr_protection_domain()); |
142 PSParallelCompact::mark_and_push(cm, ik->adr_host_klass()); | 144 if (ik->adr_host_klass() != NULL) { |
145 PSParallelCompact::mark_and_push(cm, ik->adr_host_klass()); | |
146 } | |
143 PSParallelCompact::mark_and_push(cm, ik->adr_signers()); | 147 PSParallelCompact::mark_and_push(cm, ik->adr_signers()); |
144 PSParallelCompact::mark_and_push(cm, ik->adr_class_annotations()); | 148 PSParallelCompact::mark_and_push(cm, ik->adr_class_annotations()); |
145 PSParallelCompact::mark_and_push(cm, ik->adr_fields_annotations()); | 149 PSParallelCompact::mark_and_push(cm, ik->adr_fields_annotations()); |
146 PSParallelCompact::mark_and_push(cm, ik->adr_methods_annotations()); | 150 PSParallelCompact::mark_and_push(cm, ik->adr_methods_annotations()); |
147 PSParallelCompact::mark_and_push(cm, ik->adr_methods_parameter_annotations()); | 151 PSParallelCompact::mark_and_push(cm, ik->adr_methods_parameter_annotations()); |
175 blk->do_oop(ik->adr_transitive_interfaces()); | 179 blk->do_oop(ik->adr_transitive_interfaces()); |
176 blk->do_oop(ik->adr_fields()); | 180 blk->do_oop(ik->adr_fields()); |
177 blk->do_oop(ik->adr_constants()); | 181 blk->do_oop(ik->adr_constants()); |
178 blk->do_oop(ik->adr_class_loader()); | 182 blk->do_oop(ik->adr_class_loader()); |
179 blk->do_oop(ik->adr_protection_domain()); | 183 blk->do_oop(ik->adr_protection_domain()); |
180 blk->do_oop(ik->adr_host_klass()); | 184 if (ik->adr_host_klass() != NULL) { |
185 blk->do_oop(ik->adr_host_klass()); | |
186 } | |
181 blk->do_oop(ik->adr_signers()); | 187 blk->do_oop(ik->adr_signers()); |
182 blk->do_oop(ik->adr_inner_classes()); | 188 blk->do_oop(ik->adr_inner_classes()); |
183 if (ik->is_interface()) { | 189 if (ik->adr_implementor() != NULL) { |
184 blk->do_oop(ik->adr_implementor()); | 190 blk->do_oop(ik->adr_implementor()); |
185 } | 191 } |
186 blk->do_oop(ik->adr_class_annotations()); | 192 blk->do_oop(ik->adr_class_annotations()); |
187 blk->do_oop(ik->adr_fields_annotations()); | 193 blk->do_oop(ik->adr_fields_annotations()); |
188 blk->do_oop(ik->adr_methods_annotations()); | 194 blk->do_oop(ik->adr_methods_annotations()); |
225 adr = ik->adr_class_loader(); | 231 adr = ik->adr_class_loader(); |
226 if (mr.contains(adr)) blk->do_oop(adr); | 232 if (mr.contains(adr)) blk->do_oop(adr); |
227 adr = ik->adr_protection_domain(); | 233 adr = ik->adr_protection_domain(); |
228 if (mr.contains(adr)) blk->do_oop(adr); | 234 if (mr.contains(adr)) blk->do_oop(adr); |
229 adr = ik->adr_host_klass(); | 235 adr = ik->adr_host_klass(); |
230 if (mr.contains(adr)) blk->do_oop(adr); | 236 if (adr != NULL && mr.contains(adr)) blk->do_oop(adr); |
231 adr = ik->adr_signers(); | 237 adr = ik->adr_signers(); |
232 if (mr.contains(adr)) blk->do_oop(adr); | 238 if (mr.contains(adr)) blk->do_oop(adr); |
233 adr = ik->adr_inner_classes(); | 239 adr = ik->adr_inner_classes(); |
234 if (mr.contains(adr)) blk->do_oop(adr); | 240 if (mr.contains(adr)) blk->do_oop(adr); |
235 if (ik->is_interface()) { | 241 adr = ik->adr_implementor(); |
236 adr = ik->adr_implementor(); | 242 if (adr != NULL && mr.contains(adr)) blk->do_oop(adr); |
237 if (mr.contains(adr)) blk->do_oop(adr); | |
238 } | |
239 adr = ik->adr_class_annotations(); | 243 adr = ik->adr_class_annotations(); |
240 if (mr.contains(adr)) blk->do_oop(adr); | 244 if (mr.contains(adr)) blk->do_oop(adr); |
241 adr = ik->adr_fields_annotations(); | 245 adr = ik->adr_fields_annotations(); |
242 if (mr.contains(adr)) blk->do_oop(adr); | 246 if (mr.contains(adr)) blk->do_oop(adr); |
243 adr = ik->adr_methods_annotations(); | 247 adr = ik->adr_methods_annotations(); |
268 MarkSweep::adjust_pointer(ik->adr_transitive_interfaces()); | 272 MarkSweep::adjust_pointer(ik->adr_transitive_interfaces()); |
269 MarkSweep::adjust_pointer(ik->adr_fields()); | 273 MarkSweep::adjust_pointer(ik->adr_fields()); |
270 MarkSweep::adjust_pointer(ik->adr_constants()); | 274 MarkSweep::adjust_pointer(ik->adr_constants()); |
271 MarkSweep::adjust_pointer(ik->adr_class_loader()); | 275 MarkSweep::adjust_pointer(ik->adr_class_loader()); |
272 MarkSweep::adjust_pointer(ik->adr_protection_domain()); | 276 MarkSweep::adjust_pointer(ik->adr_protection_domain()); |
273 MarkSweep::adjust_pointer(ik->adr_host_klass()); | 277 if (ik->adr_host_klass() != NULL) { |
278 MarkSweep::adjust_pointer(ik->adr_host_klass()); | |
279 } | |
274 MarkSweep::adjust_pointer(ik->adr_signers()); | 280 MarkSweep::adjust_pointer(ik->adr_signers()); |
275 MarkSweep::adjust_pointer(ik->adr_inner_classes()); | 281 MarkSweep::adjust_pointer(ik->adr_inner_classes()); |
276 if (ik->is_interface()) { | 282 if (ik->adr_implementor() != NULL) { |
277 MarkSweep::adjust_pointer(ik->adr_implementor()); | 283 MarkSweep::adjust_pointer(ik->adr_implementor()); |
278 } | 284 } |
279 MarkSweep::adjust_pointer(ik->adr_class_annotations()); | 285 MarkSweep::adjust_pointer(ik->adr_class_annotations()); |
280 MarkSweep::adjust_pointer(ik->adr_fields_annotations()); | 286 MarkSweep::adjust_pointer(ik->adr_fields_annotations()); |
281 MarkSweep::adjust_pointer(ik->adr_methods_annotations()); | 287 MarkSweep::adjust_pointer(ik->adr_methods_annotations()); |
300 if (PSScavenge::should_scavenge(pd_addr)) { | 306 if (PSScavenge::should_scavenge(pd_addr)) { |
301 pm->claim_or_forward_depth(pd_addr); | 307 pm->claim_or_forward_depth(pd_addr); |
302 } | 308 } |
303 | 309 |
304 oop* hk_addr = ik->adr_host_klass(); | 310 oop* hk_addr = ik->adr_host_klass(); |
305 if (PSScavenge::should_scavenge(hk_addr)) { | 311 if (hk_addr != NULL && PSScavenge::should_scavenge(hk_addr)) { |
306 pm->claim_or_forward_depth(hk_addr); | 312 pm->claim_or_forward_depth(hk_addr); |
307 } | 313 } |
308 | 314 |
309 oop* sg_addr = ik->adr_signers(); | 315 oop* sg_addr = ik->adr_signers(); |
310 if (PSScavenge::should_scavenge(sg_addr)) { | 316 if (PSScavenge::should_scavenge(sg_addr)) { |
326 oop* const beg_oop = ik->oop_block_beg(); | 332 oop* const beg_oop = ik->oop_block_beg(); |
327 oop* const end_oop = ik->oop_block_end(); | 333 oop* const end_oop = ik->oop_block_end(); |
328 for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) { | 334 for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) { |
329 PSParallelCompact::adjust_pointer(cur_oop); | 335 PSParallelCompact::adjust_pointer(cur_oop); |
330 } | 336 } |
331 if (ik->is_interface()) { | 337 // embedded oops |
338 if (ik->adr_implementor() != NULL) { | |
332 PSParallelCompact::adjust_pointer(ik->adr_implementor()); | 339 PSParallelCompact::adjust_pointer(ik->adr_implementor()); |
340 } | |
341 if (ik->adr_host_klass() != NULL) { | |
342 PSParallelCompact::adjust_pointer(ik->adr_host_klass()); | |
333 } | 343 } |
334 | 344 |
335 OopClosure* closure = PSParallelCompact::adjust_root_pointer_closure(); | 345 OopClosure* closure = PSParallelCompact::adjust_root_pointer_closure(); |
336 iterate_c_heap_oops(ik, closure); | 346 iterate_c_heap_oops(ik, closure); |
337 | 347 |
344 klassOop | 354 klassOop |
345 instanceKlassKlass::allocate_instance_klass(Symbol* name, int vtable_len, int itable_len, | 355 instanceKlassKlass::allocate_instance_klass(Symbol* name, int vtable_len, int itable_len, |
346 int static_field_size, | 356 int static_field_size, |
347 unsigned nonstatic_oop_map_count, | 357 unsigned nonstatic_oop_map_count, |
348 AccessFlags access_flags, | 358 AccessFlags access_flags, |
349 ReferenceType rt, TRAPS) { | 359 ReferenceType rt, |
360 KlassHandle host_klass, TRAPS) { | |
350 | 361 |
351 const int nonstatic_oop_map_size = | 362 const int nonstatic_oop_map_size = |
352 instanceKlass::nonstatic_oop_map_size(nonstatic_oop_map_count); | 363 instanceKlass::nonstatic_oop_map_size(nonstatic_oop_map_count); |
353 int size = align_object_offset(vtable_len) + align_object_offset(itable_len); | 364 int size = align_object_offset(vtable_len) + align_object_offset(itable_len); |
354 if (access_flags.is_interface()) { | 365 if (access_flags.is_interface() || !host_klass.is_null()) { |
355 size += align_object_offset(nonstatic_oop_map_size) + (int)sizeof(klassOop)/HeapWordSize; | 366 size += align_object_offset(nonstatic_oop_map_size); |
356 } else { | 367 } else { |
357 size += nonstatic_oop_map_size; | 368 size += nonstatic_oop_map_size; |
369 } | |
370 if (access_flags.is_interface()) { | |
371 size += (int)sizeof(klassOop)/HeapWordSize; | |
372 } | |
373 if (!host_klass.is_null()) { | |
374 size += (int)sizeof(klassOop)/HeapWordSize; | |
358 } | 375 } |
359 size = instanceKlass::object_size(size); | 376 size = instanceKlass::object_size(size); |
360 | 377 |
361 // Allocation | 378 // Allocation |
362 KlassHandle h_this_klass(THREAD, as_klassOop()); | 379 KlassHandle h_this_klass(THREAD, as_klassOop()); |
387 ik->set_vtable_length(vtable_len); | 404 ik->set_vtable_length(vtable_len); |
388 ik->set_itable_length(itable_len); | 405 ik->set_itable_length(itable_len); |
389 ik->set_static_field_size(static_field_size); | 406 ik->set_static_field_size(static_field_size); |
390 ik->set_nonstatic_oop_map_size(nonstatic_oop_map_size); | 407 ik->set_nonstatic_oop_map_size(nonstatic_oop_map_size); |
391 ik->set_access_flags(access_flags); | 408 ik->set_access_flags(access_flags); |
409 ik->set_is_anonymous(!host_klass.is_null()); | |
392 assert(k()->size() == size, "wrong size for object"); | 410 assert(k()->size() == size, "wrong size for object"); |
393 | 411 |
394 ik->set_array_klasses(NULL); | 412 ik->set_array_klasses(NULL); |
395 ik->set_methods(NULL); | 413 ik->set_methods(NULL); |
396 ik->set_method_ordering(NULL); | 414 ik->set_method_ordering(NULL); |
399 ik->init_implementor(); | 417 ik->init_implementor(); |
400 ik->set_fields(NULL, 0); | 418 ik->set_fields(NULL, 0); |
401 ik->set_constants(NULL); | 419 ik->set_constants(NULL); |
402 ik->set_class_loader(NULL); | 420 ik->set_class_loader(NULL); |
403 ik->set_protection_domain(NULL); | 421 ik->set_protection_domain(NULL); |
404 ik->set_host_klass(NULL); | |
405 ik->set_signers(NULL); | 422 ik->set_signers(NULL); |
406 ik->set_source_file_name(NULL); | 423 ik->set_source_file_name(NULL); |
407 ik->set_source_debug_extension(NULL); | 424 ik->set_source_debug_extension(NULL); |
408 ik->set_source_debug_extension(NULL); | 425 ik->set_source_debug_extension(NULL); |
409 ik->set_array_name(NULL); | 426 ik->set_array_name(NULL); |
501 st->print(BULLET"local interfaces: "); ik->local_interfaces()->print_value_on(st); st->cr(); | 518 st->print(BULLET"local interfaces: "); ik->local_interfaces()->print_value_on(st); st->cr(); |
502 st->print(BULLET"trans. interfaces: "); ik->transitive_interfaces()->print_value_on(st); st->cr(); | 519 st->print(BULLET"trans. interfaces: "); ik->transitive_interfaces()->print_value_on(st); st->cr(); |
503 st->print(BULLET"constants: "); ik->constants()->print_value_on(st); st->cr(); | 520 st->print(BULLET"constants: "); ik->constants()->print_value_on(st); st->cr(); |
504 st->print(BULLET"class loader: "); ik->class_loader()->print_value_on(st); st->cr(); | 521 st->print(BULLET"class loader: "); ik->class_loader()->print_value_on(st); st->cr(); |
505 st->print(BULLET"protection domain: "); ik->protection_domain()->print_value_on(st); st->cr(); | 522 st->print(BULLET"protection domain: "); ik->protection_domain()->print_value_on(st); st->cr(); |
506 st->print(BULLET"host class: "); ik->host_klass()->print_value_on(st); st->cr(); | 523 if (ik->host_klass() != NULL) { |
524 st->print(BULLET"host class: "); ik->host_klass()->print_value_on(st); st->cr(); | |
525 } | |
507 st->print(BULLET"signers: "); ik->signers()->print_value_on(st); st->cr(); | 526 st->print(BULLET"signers: "); ik->signers()->print_value_on(st); st->cr(); |
508 if (ik->source_file_name() != NULL) { | 527 if (ik->source_file_name() != NULL) { |
509 st->print(BULLET"source file: "); | 528 st->print(BULLET"source file: "); |
510 ik->source_file_name()->print_value_on(st); | 529 ik->source_file_name()->print_value_on(st); |
511 st->cr(); | 530 st->cr(); |