< prev index next >
src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
Print this page
*** 537,570 ****
resolved_klass = SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK_0);
if (resolved_klass == NULL) {
JVMCI_THROW_MSG_NULL(ClassNotFoundException, str);
}
} else {
! if (class_name->char_at(0) == JVM_SIGNATURE_CLASS &&
! class_name->char_at(class_name->utf8_length()-1) == JVM_SIGNATURE_ENDCLASS) {
// This is a name from a signature. Strip off the trimmings.
// Call recursive to keep scope of strippedsym.
! TempNewSymbol strippedsym = SymbolTable::new_symbol(class_name->as_utf8()+1,
! class_name->utf8_length()-2);
resolved_klass = SystemDictionary::find(strippedsym, class_loader, protection_domain, CHECK_0);
! } else if (FieldType::is_array(class_name)) {
! FieldArrayInfo fd;
! // dimension and object_key in FieldArrayInfo are assigned as a side-effect
! // of this call
! BasicType t = FieldType::get_array_info(class_name, fd, CHECK_0);
! if (t == T_OBJECT) {
! TempNewSymbol strippedsym = SymbolTable::new_symbol(class_name->as_utf8()+1+fd.dimension(),
! class_name->utf8_length()-2-fd.dimension());
resolved_klass = SystemDictionary::find(strippedsym,
class_loader,
protection_domain,
CHECK_0);
if (!resolved_klass.is_null()) {
! resolved_klass = resolved_klass->array_klass(fd.dimension(), CHECK_0);
}
} else {
! resolved_klass = TypeArrayKlass::cast(Universe::typeArrayKlassObj(t))->array_klass(fd.dimension(), CHECK_0);
}
} else {
resolved_klass = SystemDictionary::find(class_name, class_loader, protection_domain, CHECK_0);
}
}
--- 537,565 ----
resolved_klass = SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK_0);
if (resolved_klass == NULL) {
JVMCI_THROW_MSG_NULL(ClassNotFoundException, str);
}
} else {
! if (Signature::has_envelope(class_name)) {
// This is a name from a signature. Strip off the trimmings.
// Call recursive to keep scope of strippedsym.
! TempNewSymbol strippedsym = Signature::strip_envelope(class_name);
resolved_klass = SystemDictionary::find(strippedsym, class_loader, protection_domain, CHECK_0);
! } else if (Signature::is_array(class_name)) {
! SignatureStream ss(class_name, false);
! int ndim = ss.skip_array_prefix();
! if (ss.type() == T_OBJECT) {
! Symbol* strippedsym = ss.as_symbol();
resolved_klass = SystemDictionary::find(strippedsym,
class_loader,
protection_domain,
CHECK_0);
if (!resolved_klass.is_null()) {
! resolved_klass = resolved_klass->array_klass(ndim, CHECK_0);
}
} else {
! resolved_klass = TypeArrayKlass::cast(Universe::typeArrayKlassObj(ss.type()))->array_klass(ndim, CHECK_0);
}
} else {
resolved_klass = SystemDictionary::find(class_name, class_loader, protection_domain, CHECK_0);
}
}
*** 1034,1055 ****
methodHandle mh(THREAD, nm->method());
Symbol* signature = mh->signature();
JavaCallArguments jca(mh->size_of_parameters());
JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static());
! JavaValue result(jap.get_ret_type());
jca.set_alternative_target(nm);
JavaCalls::call(&result, mh, &jca, CHECK_NULL);
! if (jap.get_ret_type() == T_VOID) {
return NULL;
! } else if (is_reference_type(jap.get_ret_type())) {
return JNIHandles::make_local((oop) result.get_jobject());
} else {
jvalue *value = (jvalue *) result.get_value_addr();
// Narrow the value down if required (Important on big endian machines)
! switch (jap.get_ret_type()) {
case T_BOOLEAN:
value->z = (jboolean) value->i;
break;
case T_BYTE:
value->b = (jbyte) value->i;
--- 1029,1050 ----
methodHandle mh(THREAD, nm->method());
Symbol* signature = mh->signature();
JavaCallArguments jca(mh->size_of_parameters());
JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static());
! JavaValue result(jap.return_type());
jca.set_alternative_target(nm);
JavaCalls::call(&result, mh, &jca, CHECK_NULL);
! if (jap.return_type() == T_VOID) {
return NULL;
! } else if (is_reference_type(jap.return_type())) {
return JNIHandles::make_local((oop) result.get_jobject());
} else {
jvalue *value = (jvalue *) result.get_value_addr();
// Narrow the value down if required (Important on big endian machines)
! switch (jap.return_type()) {
case T_BOOLEAN:
value->z = (jboolean) value->i;
break;
case T_BYTE:
value->b = (jbyte) value->i;
*** 1061,1071 ****
value->s = (jshort) value->i;
break;
default:
break;
}
! JVMCIObject o = JVMCIENV->create_box(jap.get_ret_type(), value, JVMCI_CHECK_NULL);
return JVMCIENV->get_jobject(o);
}
C2V_END
C2V_VMENTRY_NULL(jlongArray, getLineNumberTable, (JNIEnv* env, jobject, jobject jvmci_method))
--- 1056,1066 ----
value->s = (jshort) value->i;
break;
default:
break;
}
! JVMCIObject o = JVMCIENV->create_box(jap.return_type(), value, JVMCI_CHECK_NULL);
return JVMCIENV->get_jobject(o);
}
C2V_END
C2V_VMENTRY_NULL(jlongArray, getLineNumberTable, (JNIEnv* env, jobject, jobject jvmci_method))
< prev index next >