47 u2 saved_cpool_index = _cpool_index;
48 memset(this, 0, sizeof(*this));
49 _cpool_index = saved_cpool_index;
50 }
51 }
52
53 #if INCLUDE_CDS
54 void ResolvedMethodEntry::remove_unshareable_info() {
55 reset_entry();
56 }
57
58 void ResolvedMethodEntry::mark_and_relocate(ConstantPool* src_cp) {
59 if (_method == nullptr) {
60 assert(bytecode2() == Bytecodes::_invokevirtual, "");
61 } else {
62 ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_method);
63 }
64 if (bytecode1() == Bytecodes::_invokeinterface) {
65 ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_entry_specific._interface_klass);
66 }
67 }
68 #endif
69
70 void ResolvedMethodEntry::print_on(outputStream* st) const {
71 st->print_cr("Method Entry:");
72
73 if (method() != nullptr) {
74 st->print_cr(" - Method: " INTPTR_FORMAT " %s", p2i(method()), method()->external_name());
75 } else {
76 st->print_cr("- Method: null");
77 }
78 // Some fields are mutually exclusive and are only used by certain invoke codes
79 if (bytecode1() == Bytecodes::_invokeinterface && interface_klass() != nullptr) {
80 st->print_cr(" - Klass: " INTPTR_FORMAT " %s", p2i(interface_klass()), interface_klass()->external_name());
81 } else {
82 st->print_cr("- Klass: null");
83 }
84 if (bytecode1() == Bytecodes::_invokehandle) {
85 st->print_cr(" - Resolved References Index: %d", resolved_references_index());
86 } else {
|
47 u2 saved_cpool_index = _cpool_index;
48 memset(this, 0, sizeof(*this));
49 _cpool_index = saved_cpool_index;
50 }
51 }
52
53 #if INCLUDE_CDS
54 void ResolvedMethodEntry::remove_unshareable_info() {
55 reset_entry();
56 }
57
58 void ResolvedMethodEntry::mark_and_relocate(ConstantPool* src_cp) {
59 if (_method == nullptr) {
60 assert(bytecode2() == Bytecodes::_invokevirtual, "");
61 } else {
62 ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_method);
63 }
64 if (bytecode1() == Bytecodes::_invokeinterface) {
65 ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_entry_specific._interface_klass);
66 }
67 #if 0
68 // OLD CODE ... some of it may need to be salvaged.
69 Bytecodes::Code invoke_code = bytecode_1();
70 if (invoke_code != (Bytecodes::Code)0) {
71 Metadata* f1 = f1_ord();
72 if (f1 != nullptr) {
73 ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_f1);
74 switch (invoke_code) {
75 case Bytecodes::_invokeinterface:
76 assert(0, "not implemented");
77 //assert(f1->is_klass(), "");
78 //ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_f2); // f2 is interface method
79 return false;
80 case Bytecodes::_invokestatic:
81 // For safety, we support invokestatic only for invoking methods in MethodHandle.
82 // FIXME -- further restrict it to linkToStatic(), etc?
83 assert(bytecode_2() == (Bytecodes::Code)0, "must be");
84 assert(f1->is_method(), "");
85 assert(f1_as_method()->method_holder()->name()->equals("java/lang/invoke/MethodHandle") ||
86 f1_as_method()->method_holder()->name()->equals("java/lang/invoke/MethodHandleNatives"), "sanity");
87 return true;
88 case Bytecodes::_invokespecial:
89 assert(f1->is_method(), "must be");
90 // Also need to work on bytecode_2() below.
91 break;
92 case Bytecodes::_invokehandle:
93 assert(bytecode_2() == (Bytecodes::Code)0, "must be");
94 assert(f1->is_method(), "");
95 return true;
96 default:
97 ShouldNotReachHere();
98 break;
99 }
100 }
101 }
102
103 // TODO test case: can invokespecial and invokevirtual share the same CP?
104 invoke_code = bytecode_2();
105 if (invoke_code != (Bytecodes::Code)0) {
106 assert(invoke_code == Bytecodes::_invokevirtual, "must be");
107 if (is_vfinal()) {
108 // f2 is vfinal method
109 ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_f2); // f2 is final method
110 } else {
111 // f2 is vtable index, no need to mark
112 if (DynamicDumpSharedSpaces) {
113 // InstanceKlass::methods() is has been resorted, so we need to
114 // update the vtable_index.
115 int holder_index = src_cp->uncached_klass_ref_index_at(constant_pool_index());
116 Klass* src_klass = src_cp->resolved_klass_at(holder_index);
117 Method* src_m = src_klass->method_at_vtable(f2_as_index());
118 if (!ArchiveBuilder::current()->is_in_mapped_static_archive(src_m->method_holder()) &&
119 !ArchiveBuilder::current()->is_in_mapped_static_archive(src_m)) {
120 Klass* buffered_klass = ArchiveBuilder::current()->get_buffered_addr(src_klass);
121 Method* buffered_m = ArchiveBuilder::current()->get_buffered_addr(src_m);
122 int vtable_index;
123 if (src_m->method_holder()->is_interface()) { // default or miranda method
124 assert(src_m->vtable_index() < 0, "must be");
125 assert(buffered_klass->is_instance_klass(), "must be");
126 vtable_index = InstanceKlass::cast(buffered_klass)->vtable_index_of_interface_method(buffered_m);
127 assert(vtable_index >= 0, "must be");
128 } else {
129 vtable_index = buffered_m->vtable_index();
130 assert(vtable_index >= 0, "must be");
131 }
132 if (_f2 != vtable_index) {
133 log_trace(cds, resolve)("vtable_index changed %d => %d", (int)_f2, vtable_index);
134 _f2 = vtable_index;
135 }
136 }
137 }
138 }
139 }
140
141 #endif
142 }
143 #endif
144
145 void ResolvedMethodEntry::print_on(outputStream* st) const {
146 st->print_cr("Method Entry:");
147
148 if (method() != nullptr) {
149 st->print_cr(" - Method: " INTPTR_FORMAT " %s", p2i(method()), method()->external_name());
150 } else {
151 st->print_cr("- Method: null");
152 }
153 // Some fields are mutually exclusive and are only used by certain invoke codes
154 if (bytecode1() == Bytecodes::_invokeinterface && interface_klass() != nullptr) {
155 st->print_cr(" - Klass: " INTPTR_FORMAT " %s", p2i(interface_klass()), interface_klass()->external_name());
156 } else {
157 st->print_cr("- Klass: null");
158 }
159 if (bytecode1() == Bytecodes::_invokehandle) {
160 st->print_cr(" - Resolved References Index: %d", resolved_references_index());
161 } else {
|