Mercurial > hg > graal-compiler
comparison src/share/vm/oops/method.hpp @ 12264:b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
Summary: Enhance method resolution and resulting data structures, plus some refactoring.
Reviewed-by: twisti, acorn, jrose
author | drchase |
---|---|
date | Fri, 13 Sep 2013 22:38:02 -0400 |
parents | 8947af8a9cec |
children | cefad50507d8 ac9cb1d5a202 c775af091fe9 |
comparison
equal
deleted
inserted
replaced
12261:2c98370f2611 | 12264:b2e698d2276c |
---|---|
446 | 446 |
447 // vtable index | 447 // vtable index |
448 enum VtableIndexFlag { | 448 enum VtableIndexFlag { |
449 // Valid vtable indexes are non-negative (>= 0). | 449 // Valid vtable indexes are non-negative (>= 0). |
450 // These few negative values are used as sentinels. | 450 // These few negative values are used as sentinels. |
451 highest_unused_vtable_index_value = -5, | 451 itable_index_max = -10, // first itable index, growing downward |
452 pending_itable_index = -9, // itable index will be assigned | |
452 invalid_vtable_index = -4, // distinct from any valid vtable index | 453 invalid_vtable_index = -4, // distinct from any valid vtable index |
453 garbage_vtable_index = -3, // not yet linked; no vtable layout yet | 454 garbage_vtable_index = -3, // not yet linked; no vtable layout yet |
454 nonvirtual_vtable_index = -2 // there is no need for vtable dispatch | 455 nonvirtual_vtable_index = -2 // there is no need for vtable dispatch |
455 // 6330203 Note: Do not use -1, which was overloaded with many meanings. | 456 // 6330203 Note: Do not use -1, which was overloaded with many meanings. |
456 }; | 457 }; |
457 DEBUG_ONLY(bool valid_vtable_index() const { return _vtable_index >= nonvirtual_vtable_index; }) | 458 DEBUG_ONLY(bool valid_vtable_index() const { return _vtable_index >= nonvirtual_vtable_index; }) |
458 int vtable_index() const { assert(valid_vtable_index(), ""); | 459 bool has_vtable_index() const { return _vtable_index >= 0; } |
459 return _vtable_index; } | 460 int vtable_index() const { return _vtable_index; } |
460 void set_vtable_index(int index) { _vtable_index = index; } | 461 void set_vtable_index(int index) { _vtable_index = index; } |
462 DEBUG_ONLY(bool valid_itable_index() const { return _vtable_index <= pending_itable_index; }) | |
463 bool has_itable_index() const { return _vtable_index <= itable_index_max; } | |
464 int itable_index() const { assert(valid_itable_index(), ""); | |
465 return itable_index_max - _vtable_index; } | |
466 void set_itable_index(int index) { _vtable_index = itable_index_max - index; assert(valid_itable_index(), ""); } | |
461 | 467 |
462 // interpreter entry | 468 // interpreter entry |
463 address interpreter_entry() const { return _i2i_entry; } | 469 address interpreter_entry() const { return _i2i_entry; } |
464 // Only used when first initialize so we can set _i2i_entry and _from_interpreted_entry | 470 // Only used when first initialize so we can set _i2i_entry and _from_interpreted_entry |
465 void set_interpreter_entry(address entry) { _i2i_entry = entry; _from_interpreted_entry = entry; } | 471 void set_interpreter_entry(address entry) { _i2i_entry = entry; _from_interpreted_entry = entry; } |
558 // returns true if this is a vanilla constructor | 564 // returns true if this is a vanilla constructor |
559 bool is_vanilla_constructor() const; | 565 bool is_vanilla_constructor() const; |
560 | 566 |
561 // checks method and its method holder | 567 // checks method and its method holder |
562 bool is_final_method() const; | 568 bool is_final_method() const; |
563 bool is_strict_method() const; | 569 bool is_final_method(AccessFlags class_access_flags) const; |
564 | 570 |
565 // true if method needs no dynamic dispatch (final and/or no vtable entry) | 571 // true if method needs no dynamic dispatch (final and/or no vtable entry) |
566 bool can_be_statically_bound() const; | 572 bool can_be_statically_bound() const; |
573 bool can_be_statically_bound(AccessFlags class_access_flags) const; | |
567 | 574 |
568 // returns true if the method has any backward branches. | 575 // returns true if the method has any backward branches. |
569 bool has_loops() { | 576 bool has_loops() { |
570 return access_flags().loops_flag_init() ? access_flags().has_loops() : compute_has_loops_flag(); | 577 return access_flags().loops_flag_init() ? access_flags().has_loops() : compute_has_loops_flag(); |
571 }; | 578 }; |
737 // NOTE that this function can be called from a signal handler | 744 // NOTE that this function can be called from a signal handler |
738 // (see AsyncGetCallTrace support for Forte Analyzer) and this | 745 // (see AsyncGetCallTrace support for Forte Analyzer) and this |
739 // needs to be async-safe. No allocation should be done and | 746 // needs to be async-safe. No allocation should be done and |
740 // so handles are not used to avoid deadlock. | 747 // so handles are not used to avoid deadlock. |
741 jmethodID find_jmethod_id_or_null() { return method_holder()->jmethod_id_or_null(this); } | 748 jmethodID find_jmethod_id_or_null() { return method_holder()->jmethod_id_or_null(this); } |
742 | |
743 // JNI static invoke cached itable index accessors | |
744 int cached_itable_index() { return method_holder()->cached_itable_index(method_idnum()); } | |
745 void set_cached_itable_index(int index) { method_holder()->set_cached_itable_index(method_idnum(), index); } | |
746 | 749 |
747 // Support for inlining of intrinsic methods | 750 // Support for inlining of intrinsic methods |
748 vmIntrinsics::ID intrinsic_id() const { return (vmIntrinsics::ID) _intrinsic_id; } | 751 vmIntrinsics::ID intrinsic_id() const { return (vmIntrinsics::ID) _intrinsic_id; } |
749 void set_intrinsic_id(vmIntrinsics::ID id) { _intrinsic_id = (u1) id; } | 752 void set_intrinsic_id(vmIntrinsics::ID id) { _intrinsic_id = (u1) id; } |
750 | 753 |