23 */ |
23 */ |
24 |
24 |
25 #include "precompiled.hpp" |
25 #include "precompiled.hpp" |
26 #include "ci/ciClassList.hpp" |
26 #include "ci/ciClassList.hpp" |
27 #include "ci/ciInstance.hpp" |
27 #include "ci/ciInstance.hpp" |
|
28 #include "ci/ciMethodData.hpp" |
28 #include "ci/ciMethodHandle.hpp" |
29 #include "ci/ciMethodHandle.hpp" |
29 #include "ci/ciUtilities.hpp" |
30 #include "ci/ciUtilities.hpp" |
30 #include "prims/methodHandleWalk.hpp" |
31 #include "prims/methodHandleWalk.hpp" |
31 #include "prims/methodHandles.hpp" |
32 #include "prims/methodHandles.hpp" |
32 |
33 |
34 |
35 |
35 // ------------------------------------------------------------------ |
36 // ------------------------------------------------------------------ |
36 // ciMethodHandle::get_adapter |
37 // ciMethodHandle::get_adapter |
37 // |
38 // |
38 // Return an adapter for this MethodHandle. |
39 // Return an adapter for this MethodHandle. |
39 ciMethod* ciMethodHandle::get_adapter(bool is_invokedynamic) const { |
40 ciMethod* ciMethodHandle::get_adapter_impl(bool is_invokedynamic) const { |
40 VM_ENTRY_MARK; |
41 VM_ENTRY_MARK; |
41 Handle h(get_oop()); |
42 Handle h(get_oop()); |
42 methodHandle callee(_callee->get_methodOop()); |
43 methodHandle callee(_callee->get_methodOop()); |
43 // We catch all exceptions here that could happen in the method |
44 // We catch all exceptions here that could happen in the method |
44 // handle compiler and stop the VM. |
45 // handle compiler and stop the VM. |
45 MethodHandleCompiler mhc(h, callee, call_profile()->count(), is_invokedynamic, THREAD); |
46 MethodHandleCompiler mhc(h, callee, _profile->count(), is_invokedynamic, THREAD); |
46 if (!HAS_PENDING_EXCEPTION) { |
47 if (!HAS_PENDING_EXCEPTION) { |
47 methodHandle m = mhc.compile(THREAD); |
48 methodHandle m = mhc.compile(THREAD); |
48 if (!HAS_PENDING_EXCEPTION) { |
49 if (!HAS_PENDING_EXCEPTION) { |
49 return CURRENT_ENV->get_object(m())->as_method(); |
50 return CURRENT_ENV->get_object(m())->as_method(); |
50 } |
51 } |
56 } |
57 } |
57 CLEAR_PENDING_EXCEPTION; |
58 CLEAR_PENDING_EXCEPTION; |
58 return NULL; |
59 return NULL; |
59 } |
60 } |
60 |
61 |
|
62 // ------------------------------------------------------------------ |
|
63 // ciMethodHandle::get_adapter |
|
64 // |
|
65 // Return an adapter for this MethodHandle. |
|
66 ciMethod* ciMethodHandle::get_adapter(bool is_invokedynamic) const { |
|
67 ciMethod* result = get_adapter_impl(is_invokedynamic); |
|
68 if (result) { |
|
69 // Fake up the MDO maturity. |
|
70 ciMethodData* mdo = result->method_data(); |
|
71 if (mdo != NULL && _caller->method_data() != NULL && _caller->method_data()->is_mature()) { |
|
72 mdo->set_mature(); |
|
73 } |
|
74 } |
|
75 return result; |
|
76 } |
|
77 |
61 |
78 |
62 // ------------------------------------------------------------------ |
79 // ------------------------------------------------------------------ |
63 // ciMethodHandle::print_impl |
80 // ciMethodHandle::print_impl |
64 // |
81 // |
65 // Implementation of the print method. |
82 // Implementation of the print method. |