< 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 >