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();