< prev index next >
src/share/vm/runtime/sharedRuntime.cpp
Print this page
*** 2717,2737 ****
sig_extended.push(SigEntry(T_OBJECT));
}
}
for (SignatureStream ss(method->signature()); !ss.at_return_type(); ss.next()) {
if (ValueTypePassFieldsAsArgs && ss.type() == T_VALUETYPE) {
! Klass* k = ss.as_klass(Handle(THREAD, holder->class_loader()),
! Handle(THREAD, holder->protection_domain()),
! SignatureStream::ReturnNull, THREAD);
! assert(k != NULL && !HAS_PENDING_EXCEPTION, "can resolve klass?");
! ValueKlass* vk = ValueKlass::cast(k);
! if (vk == SystemDictionary::___Value_klass()) {
assert(method->is_compiled_lambda_form() || method->is_method_handle_intrinsic(),
"should not use __Value for a value type argument");
sig_extended.push(SigEntry(T_OBJECT));
} else {
! const Array<SigEntry>* sig_vk = vk->extended_sig();
sig_extended.appendAll(sig_vk);
}
} else {
sig_extended.push(SigEntry(ss.type()));
if (ss.type() == T_LONG || ss.type() == T_DOUBLE) {
--- 2717,2741 ----
sig_extended.push(SigEntry(T_OBJECT));
}
}
for (SignatureStream ss(method->signature()); !ss.at_return_type(); ss.next()) {
if (ValueTypePassFieldsAsArgs && ss.type() == T_VALUETYPE) {
! Symbol* name = ss.as_symbol_or_null();
! assert(name != NULL, "should not be null");
! if (name == vmSymbols::java_lang____Value()) {
assert(method->is_compiled_lambda_form() || method->is_method_handle_intrinsic(),
"should not use __Value for a value type argument");
sig_extended.push(SigEntry(T_OBJECT));
} else {
! // Method handle intrinsics with a __Value argument may be created during
! // compilation. Only do a full system dictionary lookup if the argument name
! // is not __Value, to avoid lookups from the compiler thread.
! Klass* k = ss.as_klass(Handle(THREAD, holder->class_loader()),
! Handle(THREAD, holder->protection_domain()),
! SignatureStream::ReturnNull, THREAD);
! assert(k != NULL && !HAS_PENDING_EXCEPTION, "can resolve klass?");
! const Array<SigEntry>* sig_vk = ValueKlass::cast(k)->extended_sig();
sig_extended.appendAll(sig_vk);
}
} else {
sig_extended.push(SigEntry(ss.type()));
if (ss.type() == T_LONG || ss.type() == T_DOUBLE) {
< prev index next >