src/share/vm/prims/methodHandleWalk.cpp

changeset 1587
cd37471eaecc
parent 1577
4ce7240d622c
child 1862
cd5dbf694d45
equal deleted inserted replaced
1586:1271af4ec18c 1587:cd37471eaecc
629 629
630 // Get return type klass. 630 // Get return type klass.
631 Handle first_mtype(THREAD, chain().method_type_oop()); 631 Handle first_mtype(THREAD, chain().method_type_oop());
632 // _rklass is NULL for primitives. 632 // _rklass is NULL for primitives.
633 _rtype = java_lang_Class::as_BasicType(java_dyn_MethodType::rtype(first_mtype()), &_rklass); 633 _rtype = java_lang_Class::as_BasicType(java_dyn_MethodType::rtype(first_mtype()), &_rklass);
634 if (_rtype == T_ARRAY) _rtype = T_OBJECT;
634 635
635 int params = _callee->size_of_parameters(); // Incoming arguments plus receiver. 636 int params = _callee->size_of_parameters(); // Incoming arguments plus receiver.
636 _num_params = for_invokedynamic() ? params - 1 : params; // XXX Check if callee is static? 637 _num_params = for_invokedynamic() ? params - 1 : params; // XXX Check if callee is static?
637 } 638 }
638 639
955 956
956 klassOop klass = m->method_holder(); 957 klassOop klass = m->method_holder();
957 symbolOop name = m->name(); 958 symbolOop name = m->name();
958 symbolOop signature = m->signature(); 959 symbolOop signature = m->signature();
959 960
960 // This generated adapter method should be in the same class as the
961 // DMH target method (for accessability reasons).
962 if (tailcall) { 961 if (tailcall) {
963 _target_klass = klass; 962 // Actually, in order to make these methods more recognizable,
963 // let's put them in holder classes MethodHandle and InvokeDynamic.
964 // That way stack walkers and compiler heuristics can recognize them.
965 _target_klass = (for_invokedynamic()
966 ? SystemDictionary::InvokeDynamic_klass()
967 : SystemDictionary::MethodHandle_klass());
964 } 968 }
965 969
966 // instanceKlass* ik = instanceKlass::cast(klass); 970 // instanceKlass* ik = instanceKlass::cast(klass);
967 // tty->print_cr("MethodHandleCompiler::make_invoke: %s %s.%s%s", Bytecodes::name(op), ik->external_name(), name->as_C_string(), signature->as_C_string()); 971 // tty->print_cr("MethodHandleCompiler::make_invoke: %s %s.%s%s", Bytecodes::name(op), ik->external_name(), name->as_C_string(), signature->as_C_string());
968 972
1015 } 1019 }
1016 1020
1017 // If tailcall, we have walked all the way to a direct method handle. 1021 // If tailcall, we have walked all the way to a direct method handle.
1018 // Otherwise, make a recursive call to some helper routine. 1022 // Otherwise, make a recursive call to some helper routine.
1019 BasicType rbt = m->result_type(); 1023 BasicType rbt = m->result_type();
1024 if (rbt == T_ARRAY) rbt = T_OBJECT;
1020 ArgToken ret; 1025 ArgToken ret;
1021 if (tailcall) { 1026 if (tailcall) {
1022 if (rbt != _rtype) { 1027 if (rbt != _rtype) {
1023 if (rbt == T_VOID) { 1028 if (rbt == T_VOID) {
1024 // push a zero of the right sort 1029 // push a zero of the right sort

mercurial