23 */ |
23 */ |
24 |
24 |
25 #ifndef SHARE_VM_CI_CIMETHODHANDLE_HPP |
25 #ifndef SHARE_VM_CI_CIMETHODHANDLE_HPP |
26 #define SHARE_VM_CI_CIMETHODHANDLE_HPP |
26 #define SHARE_VM_CI_CIMETHODHANDLE_HPP |
27 |
27 |
28 #include "ci/ciCallProfile.hpp" |
28 #include "ci/ciClassList.hpp" |
29 #include "ci/ciInstance.hpp" |
29 #include "ci/ciInstance.hpp" |
30 #include "prims/methodHandles.hpp" |
|
31 |
30 |
32 // ciMethodHandle |
31 // ciMethodHandle |
33 // |
32 // |
34 // The class represents a java.lang.invoke.MethodHandle object. |
33 // The class represents a java.lang.invoke.MethodHandle object. |
35 class ciMethodHandle : public ciInstance { |
34 class ciMethodHandle : public ciInstance { |
36 private: |
|
37 ciMethod* _callee; |
|
38 ciMethod* _caller; |
|
39 ciCallProfile _profile; |
|
40 ciMethod* _method_handle_adapter; |
|
41 ciMethod* _invokedynamic_adapter; |
|
42 |
|
43 // Return an adapter for this MethodHandle. |
|
44 ciMethod* get_adapter_impl(bool is_invokedynamic); |
|
45 ciMethod* get_adapter( bool is_invokedynamic); |
|
46 |
|
47 protected: |
|
48 void print_chain_impl() NOT_DEBUG_RETURN; |
|
49 |
|
50 public: |
35 public: |
51 ciMethodHandle(instanceHandle h_i) : |
36 ciMethodHandle(instanceHandle h_i) : ciInstance(h_i) {} |
52 ciInstance(h_i), |
|
53 _callee(NULL), |
|
54 _caller(NULL), |
|
55 _method_handle_adapter(NULL), |
|
56 _invokedynamic_adapter(NULL) |
|
57 {} |
|
58 |
37 |
59 // What kind of ciObject is this? |
38 // What kind of ciObject is this? |
60 bool is_method_handle() const { return true; } |
39 bool is_method_handle() const { return true; } |
61 |
40 |
62 void set_callee(ciMethod* m) { _callee = m; } |
41 ciMethod* get_vmtarget() const; |
63 void set_caller(ciMethod* m) { _caller = m; } |
|
64 void set_call_profile(ciCallProfile profile) { _profile = profile; } |
|
65 |
|
66 // Return an adapter for a MethodHandle call. |
|
67 ciMethod* get_method_handle_adapter() { |
|
68 if (_method_handle_adapter == NULL) { |
|
69 _method_handle_adapter = get_adapter(false); |
|
70 } |
|
71 return _method_handle_adapter; |
|
72 } |
|
73 |
|
74 // Return an adapter for an invokedynamic call. |
|
75 ciMethod* get_invokedynamic_adapter() { |
|
76 if (_invokedynamic_adapter == NULL) { |
|
77 _invokedynamic_adapter = get_adapter(true); |
|
78 } |
|
79 return _invokedynamic_adapter; |
|
80 } |
|
81 |
|
82 void print_chain() NOT_DEBUG_RETURN; |
|
83 }; |
42 }; |
84 |
43 |
85 #endif // SHARE_VM_CI_CIMETHODHANDLE_HPP |
44 #endif // SHARE_VM_CI_CIMETHODHANDLE_HPP |