179 |
179 |
180 void* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) { |
180 void* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) { |
181 /* |
181 /* |
182 * This method needs to return a raw (untyped) pointer, since the value of a pointer to the base |
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, |
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 |
184 * the compiler expects a direct pointer to the subclass (Klass* or Method*), not a pointer to the |
185 * pointer to the base class (Metadata* or MetaspaceObj*). |
185 * base class (Metadata* or MetaspaceObj*). |
186 */ |
186 */ |
187 oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant); |
187 oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant); |
188 if (obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) { |
188 if (obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) { |
189 Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj)); |
189 Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj)); |
190 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)); |
195 Method* method = (Method*) (address) HotSpotResolvedJavaMethodImpl::metaspaceMethod(obj); |
195 Method* method = (Method*) (address) HotSpotResolvedJavaMethodImpl::metaspaceMethod(obj); |
196 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)); |
197 int index = _oop_recorder->find_index(method); |
197 int index = _oop_recorder->find_index(method); |
198 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()); |
199 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; |
|
205 } else { |
200 } else { |
206 JVMCI_ERROR_NULL("unexpected metadata reference for constant of type %s", obj->klass()->signature_name()); |
201 JVMCI_ERROR_NULL("unexpected metadata reference for constant of type %s", obj->klass()->signature_name()); |
207 } |
202 } |
208 } |
203 } |
209 |
204 |