< prev index next >
src/hotspot/share/runtime/sharedRuntime.cpp
Print this page
*** 2689,2699 ****
int i = 0;
if (!method->is_static()) { // Pass in receiver first
if (holder->is_value()) {
ValueKlass* vk = ValueKlass::cast(holder);
! if (!ValueTypePassFieldsAsArgs || vk->is__Value()) {
// If we don't pass value types as arguments or if the holder of
// the method is __Value, we must pass a reference.
sig_extended.push(SigEntry(T_VALUETYPEPTR));
} else {
const Array<SigEntry>* sig_vk = vk->extended_sig();
--- 2689,2699 ----
int i = 0;
if (!method->is_static()) { // Pass in receiver first
if (holder->is_value()) {
ValueKlass* vk = ValueKlass::cast(holder);
! if (!ValueTypePassFieldsAsArgs) {
// If we don't pass value types as arguments or if the holder of
// the method is __Value, we must pass a reference.
sig_extended.push(SigEntry(T_VALUETYPEPTR));
} else {
const Array<SigEntry>* sig_vk = vk->extended_sig();
*** 2704,2714 ****
}
}
for (SignatureStream ss(method->signature()); !ss.at_return_type(); ss.next()) {
if (ss.type() == T_VALUETYPE) {
Symbol* name = ss.as_symbol(CHECK_NULL);
! if (!ValueTypePassFieldsAsArgs || (name == vmSymbols::java_lang____Value())) {
sig_extended.push(SigEntry(T_VALUETYPEPTR));
} 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.
--- 2704,2714 ----
}
}
for (SignatureStream ss(method->signature()); !ss.at_return_type(); ss.next()) {
if (ss.type() == T_VALUETYPE) {
Symbol* name = ss.as_symbol(CHECK_NULL);
! if (!ValueTypePassFieldsAsArgs) {
sig_extended.push(SigEntry(T_VALUETYPEPTR));
} 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.
*** 2949,2959 ****
if (THREAD->can_call_java()) {
Handle class_loader(THREAD, method->method_holder()->class_loader());
Handle protection_domain(THREAD, method->method_holder()->protection_domain());
Klass* k = ss.as_klass(class_loader, protection_domain, SignatureStream::ReturnNull, THREAD);
assert(k != NULL && !HAS_PENDING_EXCEPTION, "can't resolve klass");
- assert(ValueKlass::cast(k)->is__Value(), "other values not supported");
}
#endif
bt = T_VALUETYPEPTR;
}
sig_bt[i++] = bt; // Collect remaining bits of signature
--- 2949,2958 ----
*** 3049,3069 ****
case 'I': sig_bt[cnt++] = T_INT; break;
case 'J': sig_bt[cnt++] = T_LONG; sig_bt[cnt++] = T_VOID; break;
case 'S': sig_bt[cnt++] = T_SHORT; break;
case 'Z': sig_bt[cnt++] = T_BOOLEAN; break;
case 'V': sig_bt[cnt++] = T_VOID; break;
- case 'Q':
case 'L': // Oop
while (*s++ != ';'); // Skip signature
sig_bt[cnt++] = T_OBJECT;
break;
case '[': { // Array
do { // Skip optional size
while (*s >= '0' && *s <= '9') s++;
} while (*s++ == '['); // Nested arrays?
// Skip element type
! if (s[-1] == 'L' || s[-1] == 'Q')
while (*s++ != ';'); // Skip signature
sig_bt[cnt++] = T_ARRAY;
break;
}
default : ShouldNotReachHere();
--- 3048,3067 ----
case 'I': sig_bt[cnt++] = T_INT; break;
case 'J': sig_bt[cnt++] = T_LONG; sig_bt[cnt++] = T_VOID; break;
case 'S': sig_bt[cnt++] = T_SHORT; break;
case 'Z': sig_bt[cnt++] = T_BOOLEAN; break;
case 'V': sig_bt[cnt++] = T_VOID; break;
case 'L': // Oop
while (*s++ != ';'); // Skip signature
sig_bt[cnt++] = T_OBJECT;
break;
case '[': { // Array
do { // Skip optional size
while (*s >= '0' && *s <= '9') s++;
} while (*s++ == '['); // Nested arrays?
// Skip element type
! if (s[-1] == 'L')
while (*s++ != ';'); // Skip signature
sig_bt[cnt++] = T_ARRAY;
break;
}
default : ShouldNotReachHere();
*** 3503,3513 ****
Bytecode_invoke inv(m, bci);
methodHandle callee = inv.static_target(thread);
assert(!thread->has_pending_exception(), "call resolution should work");
ValueKlass* verif_vk2 = callee->returned_value_type(thread);
! assert(verif_vk == verif_vk2 || verif_vk2->is__Value(), "Bad value klass");
#endif
}
JRT_BLOCK_END;
thread->set_vm_result(new_vt());
--- 3501,3511 ----
Bytecode_invoke inv(m, bci);
methodHandle callee = inv.static_target(thread);
assert(!thread->has_pending_exception(), "call resolution should work");
ValueKlass* verif_vk2 = callee->returned_value_type(thread);
! assert(verif_vk == verif_vk2, "Bad value klass");
#endif
}
JRT_BLOCK_END;
thread->set_vm_result(new_vt());
< prev index next >