equal
deleted
inserted
replaced
175 } |
175 } |
176 } |
176 } |
177 return map; |
177 return map; |
178 } |
178 } |
179 |
179 |
180 Metadata* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) { |
180 void* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) { |
|
181 /* |
|
182 * This method needs to return a raw (untyped) pointer, since the value of a pointer to the base |
|
183 * class is in general not equal to the pointer of the subclass. When patching metaspace pointers, |
|
184 * the compiler expects a direct pointer to the subclass (Klass*, Method* or Symbol*), not a |
|
185 * pointer to the base class (Metadata* or MetaspaceObj*). |
|
186 */ |
181 oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant); |
187 oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant); |
182 if (obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) { |
188 if (obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) { |
183 Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj)); |
189 Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj)); |
184 assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed klass pointer %s @ " INTPTR_FORMAT, klass->name()->as_C_string(), p2i(klass)); |
190 assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed klass pointer %s @ " INTPTR_FORMAT, klass->name()->as_C_string(), p2i(klass)); |
185 int index = _oop_recorder->find_index(klass); |
191 int index = _oop_recorder->find_index(klass); |
189 Method* method = (Method*) (address) HotSpotResolvedJavaMethodImpl::metaspaceMethod(obj); |
195 Method* method = (Method*) (address) HotSpotResolvedJavaMethodImpl::metaspaceMethod(obj); |
190 assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed method pointer %s @ " INTPTR_FORMAT, method->name()->as_C_string(), p2i(method)); |
196 assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed method pointer %s @ " INTPTR_FORMAT, method->name()->as_C_string(), p2i(method)); |
191 int index = _oop_recorder->find_index(method); |
197 int index = _oop_recorder->find_index(method); |
192 TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), method->name()->as_C_string()); |
198 TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), method->name()->as_C_string()); |
193 return method; |
199 return method; |
|
200 } else if (obj->is_a(HotSpotSymbol::klass())) { |
|
201 Symbol* symbol = (Symbol*) (address) HotSpotSymbol::pointer(obj); |
|
202 assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed symbol pointer %s @ " INTPTR_FORMAT, symbol->as_C_string(), p2i(symbol)); |
|
203 TRACE_jvmci_3("symbol = %s", symbol->as_C_string()); |
|
204 return symbol; |
194 } else { |
205 } else { |
195 JVMCI_ERROR_NULL("unexpected metadata reference for constant of type %s", obj->klass()->signature_name()); |
206 JVMCI_ERROR_NULL("unexpected metadata reference for constant of type %s", obj->klass()->signature_name()); |
196 } |
207 } |
197 } |
208 } |
198 |
209 |
704 *((narrowKlass*) dest) = record_narrow_metadata_reference(constant, CHECK_OK); |
715 *((narrowKlass*) dest) = record_narrow_metadata_reference(constant, CHECK_OK); |
705 #else |
716 #else |
706 JVMCI_ERROR_OK("unexpected compressed Klass* in 32-bit mode"); |
717 JVMCI_ERROR_OK("unexpected compressed Klass* in 32-bit mode"); |
707 #endif |
718 #endif |
708 } else { |
719 } else { |
709 *((Metadata**) dest) = record_metadata_reference(constant, CHECK_OK); |
720 *((void**) dest) = record_metadata_reference(constant, CHECK_OK); |
710 } |
721 } |
711 } else if (constant->is_a(HotSpotObjectConstantImpl::klass())) { |
722 } else if (constant->is_a(HotSpotObjectConstantImpl::klass())) { |
712 Handle obj = HotSpotObjectConstantImpl::object(constant); |
723 Handle obj = HotSpotObjectConstantImpl::object(constant); |
713 jobject value = JNIHandles::make_local(obj()); |
724 jobject value = JNIHandles::make_local(obj()); |
714 int oop_index = _oop_recorder->find_index(value); |
725 int oop_index = _oop_recorder->find_index(value); |