src/share/vm/prims/methodHandleWalk.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
6914206 Cdiff src/share/vm/prims/methodHandleWalk.cpp
src/share/vm/prims/methodHandleWalk.cpp
Print this page
*** 629,638 ****
--- 629,639 ----
// Get return type klass.
Handle first_mtype(THREAD, chain().method_type_oop());
// _rklass is NULL for primitives.
_rtype = java_lang_Class::as_BasicType(java_dyn_MethodType::rtype(first_mtype()), &_rklass);
+ if (_rtype == T_ARRAY) _rtype = T_OBJECT;
int params = _callee->size_of_parameters(); // Incoming arguments plus receiver.
_num_params = for_invokedynamic() ? params - 1 : params; // XXX Check if callee is static?
}
*** 955,968 ****
klassOop klass = m->method_holder();
symbolOop name = m->name();
symbolOop signature = m->signature();
- // This generated adapter method should be in the same class as the
- // DMH target method (for accessability reasons).
if (tailcall) {
! _target_klass = klass;
}
// instanceKlass* ik = instanceKlass::cast(klass);
// tty->print_cr("MethodHandleCompiler::make_invoke: %s %s.%s%s", Bytecodes::name(op), ik->external_name(), name->as_C_string(), signature->as_C_string());
--- 956,972 ----
klassOop klass = m->method_holder();
symbolOop name = m->name();
symbolOop signature = m->signature();
if (tailcall) {
! // Actually, in order to make these methods more recognizable,
! // let's put them in holder classes MethodHandle and InvokeDynamic.
! // That way stack walkers and compiler heuristics can recognize them.
! _target_klass = (for_invokedynamic()
! ? SystemDictionary::InvokeDynamic_klass()
! : SystemDictionary::MethodHandle_klass());
}
// instanceKlass* ik = instanceKlass::cast(klass);
// tty->print_cr("MethodHandleCompiler::make_invoke: %s %s.%s%s", Bytecodes::name(op), ik->external_name(), name->as_C_string(), signature->as_C_string());
*** 1015,1024 ****
--- 1019,1029 ----
}
// If tailcall, we have walked all the way to a direct method handle.
// Otherwise, make a recursive call to some helper routine.
BasicType rbt = m->result_type();
+ if (rbt == T_ARRAY) rbt = T_OBJECT;
ArgToken ret;
if (tailcall) {
if (rbt != _rtype) {
if (rbt == T_VOID) {
// push a zero of the right sort
src/share/vm/prims/methodHandleWalk.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File