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())) {
|