comparison src/share/vm/ci/ciEnv.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 e0ba4e04c839
comparison
equal deleted inserted replaced
1585:49fac4acd688 1602:136b78722a08
509 // ------------------------------------------------------------------ 509 // ------------------------------------------------------------------
510 // ciEnv::get_constant_by_index_impl 510 // ciEnv::get_constant_by_index_impl
511 // 511 //
512 // Implementation of get_constant_by_index(). 512 // Implementation of get_constant_by_index().
513 ciConstant ciEnv::get_constant_by_index_impl(constantPoolHandle cpool, 513 ciConstant ciEnv::get_constant_by_index_impl(constantPoolHandle cpool,
514 int index, 514 int pool_index, int cache_index,
515 ciInstanceKlass* accessor) { 515 ciInstanceKlass* accessor) {
516 bool ignore_will_link;
516 EXCEPTION_CONTEXT; 517 EXCEPTION_CONTEXT;
518 int index = pool_index;
519 if (cache_index >= 0) {
520 assert(index < 0, "only one kind of index at a time");
521 ConstantPoolCacheEntry* cpc_entry = cpool->cache()->entry_at(cache_index);
522 index = cpc_entry->constant_pool_index();
523 oop obj = cpc_entry->f1();
524 if (obj != NULL) {
525 assert(obj->is_instance(), "must be an instance");
526 ciObject* ciobj = get_object(obj);
527 return ciConstant(T_OBJECT, ciobj);
528 }
529 }
517 constantTag tag = cpool->tag_at(index); 530 constantTag tag = cpool->tag_at(index);
518 if (tag.is_int()) { 531 if (tag.is_int()) {
519 return ciConstant(T_INT, (jint)cpool->int_at(index)); 532 return ciConstant(T_INT, (jint)cpool->int_at(index));
520 } else if (tag.is_long()) { 533 } else if (tag.is_long()) {
521 return ciConstant((jlong)cpool->long_at(index)); 534 return ciConstant((jlong)cpool->long_at(index));
538 ciObject* constant = get_object(string); 551 ciObject* constant = get_object(string);
539 assert (constant->is_instance(), "must be an instance, or not? "); 552 assert (constant->is_instance(), "must be an instance, or not? ");
540 return ciConstant(T_OBJECT, constant); 553 return ciConstant(T_OBJECT, constant);
541 } else if (tag.is_klass() || tag.is_unresolved_klass()) { 554 } else if (tag.is_klass() || tag.is_unresolved_klass()) {
542 // 4881222: allow ldc to take a class type 555 // 4881222: allow ldc to take a class type
543 bool ignore; 556 ciKlass* klass = get_klass_by_index_impl(cpool, index, ignore_will_link, accessor);
544 ciKlass* klass = get_klass_by_index_impl(cpool, index, ignore, accessor);
545 if (HAS_PENDING_EXCEPTION) { 557 if (HAS_PENDING_EXCEPTION) {
546 CLEAR_PENDING_EXCEPTION; 558 CLEAR_PENDING_EXCEPTION;
547 record_out_of_memory_failure(); 559 record_out_of_memory_failure();
548 return ciConstant(); 560 return ciConstant();
549 } 561 }
550 assert (klass->is_instance_klass() || klass->is_array_klass(), 562 assert (klass->is_instance_klass() || klass->is_array_klass(),
551 "must be an instance or array klass "); 563 "must be an instance or array klass ");
552 return ciConstant(T_OBJECT, klass); 564 return ciConstant(T_OBJECT, klass->java_mirror());
553 } else if (tag.is_object()) { 565 } else if (tag.is_object()) {
554 oop obj = cpool->object_at(index); 566 oop obj = cpool->object_at(index);
555 assert(obj->is_instance(), "must be an instance"); 567 assert(obj->is_instance(), "must be an instance");
556 ciObject* ciobj = get_object(obj); 568 ciObject* ciobj = get_object(obj);
557 return ciConstant(T_OBJECT, ciobj); 569 return ciConstant(T_OBJECT, ciobj);
570 } else if (tag.is_method_type()) {
571 // must execute Java code to link this CP entry into cache[i].f1
572 ciSymbol* signature = get_object(cpool->method_type_signature_at(index))->as_symbol();
573 ciObject* ciobj = get_unloaded_method_type_constant(signature);
574 return ciConstant(T_OBJECT, ciobj);
575 } else if (tag.is_method_handle()) {
576 // must execute Java code to link this CP entry into cache[i].f1
577 int ref_kind = cpool->method_handle_ref_kind_at(index);
578 int callee_index = cpool->method_handle_klass_index_at(index);
579 ciKlass* callee = get_klass_by_index_impl(cpool, callee_index, ignore_will_link, accessor);
580 ciSymbol* name = get_object(cpool->method_handle_name_ref_at(index))->as_symbol();
581 ciSymbol* signature = get_object(cpool->method_handle_signature_ref_at(index))->as_symbol();
582 ciObject* ciobj = get_unloaded_method_handle_constant(callee, name, signature, ref_kind);
583 return ciConstant(T_OBJECT, ciobj);
558 } else { 584 } else {
559 ShouldNotReachHere(); 585 ShouldNotReachHere();
560 return ciConstant(); 586 return ciConstant();
561 } 587 }
562 }
563
564 // ------------------------------------------------------------------
565 // ciEnv::is_unresolved_string_impl
566 //
567 // Implementation of is_unresolved_string().
568 bool ciEnv::is_unresolved_string_impl(instanceKlass* accessor, int index) const {
569 EXCEPTION_CONTEXT;
570 assert(accessor->is_linked(), "must be linked before accessing constant pool");
571 constantPoolOop cpool = accessor->constants();
572 constantTag tag = cpool->tag_at(index);
573 return tag.is_unresolved_string();
574 }
575
576 // ------------------------------------------------------------------
577 // ciEnv::is_unresolved_klass_impl
578 //
579 // Implementation of is_unresolved_klass().
580 bool ciEnv::is_unresolved_klass_impl(instanceKlass* accessor, int index) const {
581 EXCEPTION_CONTEXT;
582 assert(accessor->is_linked(), "must be linked before accessing constant pool");
583 constantPoolOop cpool = accessor->constants();
584 constantTag tag = cpool->tag_at(index);
585 return tag.is_unresolved_klass();
586 } 588 }
587 589
588 // ------------------------------------------------------------------ 590 // ------------------------------------------------------------------
589 // ciEnv::get_constant_by_index 591 // ciEnv::get_constant_by_index
590 // 592 //
591 // Pull a constant out of the constant pool. How appropriate. 593 // Pull a constant out of the constant pool. How appropriate.
592 // 594 //
593 // Implementation note: this query is currently in no way cached. 595 // Implementation note: this query is currently in no way cached.
594 ciConstant ciEnv::get_constant_by_index(constantPoolHandle cpool, 596 ciConstant ciEnv::get_constant_by_index(constantPoolHandle cpool,
595 int index, 597 int pool_index, int cache_index,
596 ciInstanceKlass* accessor) { 598 ciInstanceKlass* accessor) {
597 GUARDED_VM_ENTRY(return get_constant_by_index_impl(cpool, index, accessor);) 599 GUARDED_VM_ENTRY(return get_constant_by_index_impl(cpool, pool_index, cache_index, accessor);)
598 }
599
600 // ------------------------------------------------------------------
601 // ciEnv::is_unresolved_string
602 //
603 // Check constant pool
604 //
605 // Implementation note: this query is currently in no way cached.
606 bool ciEnv::is_unresolved_string(ciInstanceKlass* accessor,
607 int index) const {
608 GUARDED_VM_ENTRY(return is_unresolved_string_impl(accessor->get_instanceKlass(), index); )
609 }
610
611 // ------------------------------------------------------------------
612 // ciEnv::is_unresolved_klass
613 //
614 // Check constant pool
615 //
616 // Implementation note: this query is currently in no way cached.
617 bool ciEnv::is_unresolved_klass(ciInstanceKlass* accessor,
618 int index) const {
619 GUARDED_VM_ENTRY(return is_unresolved_klass_impl(accessor->get_instanceKlass(), index); )
620 } 600 }
621 601
622 // ------------------------------------------------------------------ 602 // ------------------------------------------------------------------
623 // ciEnv::get_field_by_index_impl 603 // ciEnv::get_field_by_index_impl
624 // 604 //