Mercurial > hg > graal-compiler
comparison src/share/vm/runtime/sharedRuntime.cpp @ 2142:8012aa3ccede
4926272: methodOopDesc::method_from_bcp is unsafe
Reviewed-by: coleenp, jrose, kvn, dcubed
author | never |
---|---|
date | Thu, 13 Jan 2011 22:15:41 -0800 |
parents | f95d63e2154a |
children | 3582bf76420e |
comparison
equal
deleted
inserted
replaced
2130:34d64ad817f4 | 2142:8012aa3ccede |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
942 // Find caller and bci from vframe | 942 // Find caller and bci from vframe |
943 methodHandle caller (THREAD, vfst.method()); | 943 methodHandle caller (THREAD, vfst.method()); |
944 int bci = vfst.bci(); | 944 int bci = vfst.bci(); |
945 | 945 |
946 // Find bytecode | 946 // Find bytecode |
947 Bytecode_invoke* bytecode = Bytecode_invoke_at(caller, bci); | 947 Bytecode_invoke bytecode(caller, bci); |
948 bc = bytecode->java_code(); | 948 bc = bytecode.java_code(); |
949 int bytecode_index = bytecode->index(); | 949 int bytecode_index = bytecode.index(); |
950 | 950 |
951 // Find receiver for non-static call | 951 // Find receiver for non-static call |
952 if (bc != Bytecodes::_invokestatic) { | 952 if (bc != Bytecodes::_invokestatic) { |
953 // This register map must be update since we need to find the receiver for | 953 // This register map must be update since we need to find the receiver for |
954 // compiled frames. The receiver might be in a register. | 954 // compiled frames. The receiver might be in a register. |
955 RegisterMap reg_map2(thread); | 955 RegisterMap reg_map2(thread); |
956 frame stubFrame = thread->last_frame(); | 956 frame stubFrame = thread->last_frame(); |
957 // Caller-frame is a compiled frame | 957 // Caller-frame is a compiled frame |
958 frame callerFrame = stubFrame.sender(®_map2); | 958 frame callerFrame = stubFrame.sender(®_map2); |
959 | 959 |
960 methodHandle callee = bytecode->static_target(CHECK_(nullHandle)); | 960 methodHandle callee = bytecode.static_target(CHECK_(nullHandle)); |
961 if (callee.is_null()) { | 961 if (callee.is_null()) { |
962 THROW_(vmSymbols::java_lang_NoSuchMethodException(), nullHandle); | 962 THROW_(vmSymbols::java_lang_NoSuchMethodException(), nullHandle); |
963 } | 963 } |
964 // Retrieve from a compiled argument list | 964 // Retrieve from a compiled argument list |
965 receiver = Handle(THREAD, callerFrame.retrieve_receiver(®_map2)); | 965 receiver = Handle(THREAD, callerFrame.retrieve_receiver(®_map2)); |
1672 JavaThread* thread, const char* objName) { | 1672 JavaThread* thread, const char* objName) { |
1673 | 1673 |
1674 // Get target class name from the checkcast instruction | 1674 // Get target class name from the checkcast instruction |
1675 vframeStream vfst(thread, true); | 1675 vframeStream vfst(thread, true); |
1676 assert(!vfst.at_end(), "Java frame must exist"); | 1676 assert(!vfst.at_end(), "Java frame must exist"); |
1677 Bytecode_checkcast* cc = Bytecode_checkcast_at( | 1677 Bytecode_checkcast cc(vfst.method(), vfst.method()->bcp_from(vfst.bci())); |
1678 vfst.method()->bcp_from(vfst.bci())); | |
1679 Klass* targetKlass = Klass::cast(vfst.method()->constants()->klass_at( | 1678 Klass* targetKlass = Klass::cast(vfst.method()->constants()->klass_at( |
1680 cc->index(), thread)); | 1679 cc.index(), thread)); |
1681 return generate_class_cast_message(objName, targetKlass->external_name()); | 1680 return generate_class_cast_message(objName, targetKlass->external_name()); |
1682 } | 1681 } |
1683 | 1682 |
1684 char* SharedRuntime::generate_wrong_method_type_message(JavaThread* thread, | 1683 char* SharedRuntime::generate_wrong_method_type_message(JavaThread* thread, |
1685 oopDesc* required, | 1684 oopDesc* required, |
1709 // Get a signature from the invoke instruction | 1708 // Get a signature from the invoke instruction |
1710 const char* mhName = "method handle"; | 1709 const char* mhName = "method handle"; |
1711 const char* targetType = "the required signature"; | 1710 const char* targetType = "the required signature"; |
1712 vframeStream vfst(thread, true); | 1711 vframeStream vfst(thread, true); |
1713 if (!vfst.at_end()) { | 1712 if (!vfst.at_end()) { |
1714 Bytecode_invoke* call = Bytecode_invoke_at(vfst.method(), vfst.bci()); | 1713 Bytecode_invoke call(vfst.method(), vfst.bci()); |
1715 methodHandle target; | 1714 methodHandle target; |
1716 { | 1715 { |
1717 EXCEPTION_MARK; | 1716 EXCEPTION_MARK; |
1718 target = call->static_target(THREAD); | 1717 target = call.static_target(THREAD); |
1719 if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; } | 1718 if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; } |
1720 } | 1719 } |
1721 if (target.not_null() | 1720 if (target.not_null() |
1722 && target->is_method_handle_invoke() | 1721 && target->is_method_handle_invoke() |
1723 && required == target->method_handle_type()) { | 1722 && required == target->method_handle_type()) { |