< prev index next >
src/share/vm/runtime/sharedRuntime.cpp
Print this page
rev 10544 : call to __Value methods can't pass fields as arguments
*** 2595,2623 ****
MutexUnlocker mul(AdapterHandlerLibrary_lock);
Thread* THREAD = Thread::current();
Handle class_loader(THREAD, method->method_holder()->class_loader());
Handle protection_domain(THREAD, method->method_holder()->protection_domain());
GrowableArray<BasicType> sig_bt_tmp;
- int value_klasses = 0;
int i = 0;
if (!method->is_static()) { // Pass in receiver first
Klass* holder = method->method_holder();
if (ValueTypePassFieldsAsArgs && holder->is_value()) {
- value_klasses++;
ValueKlass* vk = ValueKlass::cast(holder);
const GrowableArray<SigEntry>& sig_vk = collect_fields(vk);
sig_extended.appendAll(&sig_vk);
} else {
sig_extended.push(SigEntry(T_OBJECT));
}
}
for (SignatureStream ss(method->signature()); !ss.at_return_type(); ss.next()) {
if (ValueTypePassFieldsAsArgs && ss.type() == T_VALUETYPE) {
- value_klasses++;
Klass* k = ss.as_klass(class_loader, protection_domain, SignatureStream::ReturnNull, THREAD);
assert(k != NULL && !HAS_PENDING_EXCEPTION, "can resolve klass?");
ValueKlass* vk = ValueKlass::cast(k);
const GrowableArray<SigEntry>& sig_vk = collect_fields(vk);
sig_extended.appendAll(&sig_vk);
} else {
sig_extended.push(SigEntry(ss.type()));
--- 2595,2625 ----
MutexUnlocker mul(AdapterHandlerLibrary_lock);
Thread* THREAD = Thread::current();
Handle class_loader(THREAD, method->method_holder()->class_loader());
Handle protection_domain(THREAD, method->method_holder()->protection_domain());
GrowableArray<BasicType> sig_bt_tmp;
int i = 0;
if (!method->is_static()) { // Pass in receiver first
Klass* holder = method->method_holder();
if (ValueTypePassFieldsAsArgs && holder->is_value()) {
ValueKlass* vk = ValueKlass::cast(holder);
+ if (vk == SystemDictionary::___Value_klass()) {
+ sig_extended.push(SigEntry(T_OBJECT));
+ } else {
const GrowableArray<SigEntry>& sig_vk = collect_fields(vk);
sig_extended.appendAll(&sig_vk);
+ }
} else {
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(class_loader, protection_domain, SignatureStream::ReturnNull, THREAD);
assert(k != NULL && !HAS_PENDING_EXCEPTION, "can resolve klass?");
+ assert(k != SystemDictionary::___Value_klass(), "unsupported");
ValueKlass* vk = ValueKlass::cast(k);
const GrowableArray<SigEntry>& sig_vk = collect_fields(vk);
sig_extended.appendAll(&sig_vk);
} else {
sig_extended.push(SigEntry(ss.type()));
< prev index next >