< prev index next >

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Print this page

 420     JVMCI_THROW_NULL(NullPointerException);
 421   }
 422   if (!is_klass) {
 423     cp = (UNPACK_PAIR(Method, klass_or_method))->constMethod()->constants();
 424   } else {
 425     cp = InstanceKlass::cast(UNPACK_PAIR(Klass, klass_or_method))->constants();
 426   }
 427 
 428   JVMCIObject result = JVMCIENV->get_jvmci_constant_pool(constantPoolHandle(THREAD, cp), JVMCI_CHECK_NULL);
 429   return JVMCIENV->get_jobject(result);
 430 }
 431 
 432 C2V_VMENTRY_NULL(jobject, getResolvedJavaType0, (JNIEnv* env, jobject, jobject base, jlong offset, jboolean compressed))
 433   JVMCIObject base_object = JVMCIENV->wrap(base);
 434   if (base_object.is_null()) {
 435     JVMCI_THROW_MSG_NULL(NullPointerException, "base object is null");
 436   }
 437 
 438   const char* base_desc = nullptr;
 439   JVMCIKlassHandle klass(THREAD);
 440   if (offset == oopDesc::klass_offset_in_bytes()) {




 441     if (JVMCIENV->isa_HotSpotObjectConstantImpl(base_object)) {
 442       Handle base_oop = JVMCIENV->asConstant(base_object, JVMCI_CHECK_NULL);
 443       klass = base_oop->klass();
 444     } else {
 445       goto unexpected;
 446     }
 447   } else if (!compressed) {
 448     if (JVMCIENV->isa_HotSpotConstantPool(base_object)) {
 449       ConstantPool* cp = JVMCIENV->asConstantPool(base_object);
 450       if (offset == in_bytes(ConstantPool::pool_holder_offset())) {
 451         klass = cp->pool_holder();
 452       } else {
 453         base_desc = FormatBufferResource("[constant pool for %s]", cp->pool_holder()->signature_name());
 454         goto unexpected;
 455       }
 456     } else if (JVMCIENV->isa_HotSpotResolvedObjectTypeImpl(base_object)) {
 457       Klass* base_klass = JVMCIENV->asKlass(base_object);
 458       if (offset == in_bytes(Klass::subklass_offset())) {
 459         klass = base_klass->subklass();
 460       } else if (offset == in_bytes(Klass::super_offset())) {

 420     JVMCI_THROW_NULL(NullPointerException);
 421   }
 422   if (!is_klass) {
 423     cp = (UNPACK_PAIR(Method, klass_or_method))->constMethod()->constants();
 424   } else {
 425     cp = InstanceKlass::cast(UNPACK_PAIR(Klass, klass_or_method))->constants();
 426   }
 427 
 428   JVMCIObject result = JVMCIENV->get_jvmci_constant_pool(constantPoolHandle(THREAD, cp), JVMCI_CHECK_NULL);
 429   return JVMCIENV->get_jobject(result);
 430 }
 431 
 432 C2V_VMENTRY_NULL(jobject, getResolvedJavaType0, (JNIEnv* env, jobject, jobject base, jlong offset, jboolean compressed))
 433   JVMCIObject base_object = JVMCIENV->wrap(base);
 434   if (base_object.is_null()) {
 435     JVMCI_THROW_MSG_NULL(NullPointerException, "base object is null");
 436   }
 437 
 438   const char* base_desc = nullptr;
 439   JVMCIKlassHandle klass(THREAD);
 440 
 441   // With compact object headers, we can test for the explicit offset within
 442   // the header to figure out if compiler code is accessing the class.
 443   int klass_offset = UseCompactObjectHeaders ? 4 : oopDesc::klass_offset_in_bytes();
 444   if (offset == klass_offset) {
 445     if (JVMCIENV->isa_HotSpotObjectConstantImpl(base_object)) {
 446       Handle base_oop = JVMCIENV->asConstant(base_object, JVMCI_CHECK_NULL);
 447       klass = base_oop->klass();
 448     } else {
 449       goto unexpected;
 450     }
 451   } else if (!compressed) {
 452     if (JVMCIENV->isa_HotSpotConstantPool(base_object)) {
 453       ConstantPool* cp = JVMCIENV->asConstantPool(base_object);
 454       if (offset == in_bytes(ConstantPool::pool_holder_offset())) {
 455         klass = cp->pool_holder();
 456       } else {
 457         base_desc = FormatBufferResource("[constant pool for %s]", cp->pool_holder()->signature_name());
 458         goto unexpected;
 459       }
 460     } else if (JVMCIENV->isa_HotSpotResolvedObjectTypeImpl(base_object)) {
 461       Klass* base_klass = JVMCIENV->asKlass(base_object);
 462       if (offset == in_bytes(Klass::subklass_offset())) {
 463         klass = base_klass->subklass();
 464       } else if (offset == in_bytes(Klass::super_offset())) {
< prev index next >