Mercurial > hg > truffle
comparison src/share/vm/ci/ciObjectFactory.cpp @ 1602:136b78722a08
6939203: JSR 292 needs method handle constants
Summary: Add new CP types CONSTANT_MethodHandle, CONSTANT_MethodType; extend 'ldc' bytecode.
Reviewed-by: twisti, never
author | jrose |
---|---|
date | Wed, 09 Jun 2010 18:50:45 -0700 |
parents | c18cbe5936b8 |
children | 2d26b0046e0d f95d63e2154a |
comparison
equal
deleted
inserted
replaced
1585:49fac4acd688 | 1602:136b78722a08 |
---|---|
68 _ci_objects->appendAll(_shared_ci_objects); | 68 _ci_objects->appendAll(_shared_ci_objects); |
69 } | 69 } |
70 | 70 |
71 _unloaded_methods = new (arena) GrowableArray<ciMethod*>(arena, 4, 0, NULL); | 71 _unloaded_methods = new (arena) GrowableArray<ciMethod*>(arena, 4, 0, NULL); |
72 _unloaded_klasses = new (arena) GrowableArray<ciKlass*>(arena, 8, 0, NULL); | 72 _unloaded_klasses = new (arena) GrowableArray<ciKlass*>(arena, 8, 0, NULL); |
73 _unloaded_instances = new (arena) GrowableArray<ciInstance*>(arena, 4, 0, NULL); | |
73 _return_addresses = | 74 _return_addresses = |
74 new (arena) GrowableArray<ciReturnAddress*>(arena, 8, 0, NULL); | 75 new (arena) GrowableArray<ciReturnAddress*>(arena, 8, 0, NULL); |
75 } | 76 } |
76 | 77 |
77 // ------------------------------------------------------------------ | 78 // ------------------------------------------------------------------ |
441 _unloaded_klasses->append(new_klass); | 442 _unloaded_klasses->append(new_klass); |
442 | 443 |
443 return new_klass; | 444 return new_klass; |
444 } | 445 } |
445 | 446 |
447 | |
448 //------------------------------------------------------------------ | |
449 // ciObjectFactory::get_unloaded_instance | |
450 // | |
451 // Get a ciInstance representing an as-yet undetermined instance of a given class. | |
452 // | |
453 ciInstance* ciObjectFactory::get_unloaded_instance(ciInstanceKlass* instance_klass) { | |
454 for (int i=0; i<_unloaded_instances->length(); i++) { | |
455 ciInstance* entry = _unloaded_instances->at(i); | |
456 if (entry->klass()->equals(instance_klass)) { | |
457 // We've found a match. | |
458 return entry; | |
459 } | |
460 } | |
461 | |
462 // This is a new unloaded instance. Create it and stick it in | |
463 // the cache. | |
464 ciInstance* new_instance = new (arena()) ciInstance(instance_klass); | |
465 | |
466 init_ident_of(new_instance); | |
467 _unloaded_instances->append(new_instance); | |
468 | |
469 // make sure it looks the way we want: | |
470 assert(!new_instance->is_loaded(), ""); | |
471 assert(new_instance->klass() == instance_klass, ""); | |
472 | |
473 return new_instance; | |
474 } | |
475 | |
476 | |
477 //------------------------------------------------------------------ | |
478 // ciObjectFactory::get_unloaded_klass_mirror | |
479 // | |
480 // Get a ciInstance representing an unresolved klass mirror. | |
481 // | |
482 // Currently, this ignores the parameters and returns a unique unloaded instance. | |
483 ciInstance* ciObjectFactory::get_unloaded_klass_mirror(ciKlass* type) { | |
484 assert(ciEnv::_Class_klass != NULL, ""); | |
485 return get_unloaded_instance(ciEnv::_Class_klass->as_instance_klass()); | |
486 } | |
487 | |
488 //------------------------------------------------------------------ | |
489 // ciObjectFactory::get_unloaded_method_handle_constant | |
490 // | |
491 // Get a ciInstance representing an unresolved method handle constant. | |
492 // | |
493 // Currently, this ignores the parameters and returns a unique unloaded instance. | |
494 ciInstance* ciObjectFactory::get_unloaded_method_handle_constant(ciKlass* holder, | |
495 ciSymbol* name, | |
496 ciSymbol* signature, | |
497 int ref_kind) { | |
498 if (ciEnv::_MethodHandle_klass == NULL) return NULL; | |
499 return get_unloaded_instance(ciEnv::_MethodHandle_klass->as_instance_klass()); | |
500 } | |
501 | |
502 //------------------------------------------------------------------ | |
503 // ciObjectFactory::get_unloaded_method_type_constant | |
504 // | |
505 // Get a ciInstance representing an unresolved method type constant. | |
506 // | |
507 // Currently, this ignores the parameters and returns a unique unloaded instance. | |
508 ciInstance* ciObjectFactory::get_unloaded_method_type_constant(ciSymbol* signature) { | |
509 if (ciEnv::_MethodType_klass == NULL) return NULL; | |
510 return get_unloaded_instance(ciEnv::_MethodType_klass->as_instance_klass()); | |
511 } | |
512 | |
513 | |
514 | |
446 //------------------------------------------------------------------ | 515 //------------------------------------------------------------------ |
447 // ciObjectFactory::get_empty_methodData | 516 // ciObjectFactory::get_empty_methodData |
448 // | 517 // |
449 // Get the ciMethodData representing the methodData for a method with | 518 // Get the ciMethodData representing the methodData for a method with |
450 // none. | 519 // none. |
635 // ------------------------------------------------------------------ | 704 // ------------------------------------------------------------------ |
636 // ciObjectFactory::print | 705 // ciObjectFactory::print |
637 // | 706 // |
638 // Print debugging information about the object factory | 707 // Print debugging information about the object factory |
639 void ciObjectFactory::print() { | 708 void ciObjectFactory::print() { |
640 tty->print("<ciObjectFactory oops=%d unloaded_methods=%d unloaded_klasses=%d>", | 709 tty->print("<ciObjectFactory oops=%d unloaded_methods=%d unloaded_instances=%d unloaded_klasses=%d>", |
641 _ci_objects->length(), _unloaded_methods->length(), | 710 _ci_objects->length(), _unloaded_methods->length(), |
711 _unloaded_instances->length(), | |
642 _unloaded_klasses->length()); | 712 _unloaded_klasses->length()); |
643 } | 713 } |