35 class ciMethodHandle : public ciInstance { |
35 class ciMethodHandle : public ciInstance { |
36 private: |
36 private: |
37 ciMethod* _callee; |
37 ciMethod* _callee; |
38 ciMethod* _caller; |
38 ciMethod* _caller; |
39 ciCallProfile _profile; |
39 ciCallProfile _profile; |
|
40 ciMethod* _method_handle_adapter; |
|
41 ciMethod* _invokedynamic_adapter; |
40 |
42 |
41 // Return an adapter for this MethodHandle. |
43 // Return an adapter for this MethodHandle. |
42 ciMethod* get_adapter_impl(bool is_invokedynamic) const; |
44 ciMethod* get_adapter_impl(bool is_invokedynamic); |
43 ciMethod* get_adapter( bool is_invokedynamic) const; |
45 ciMethod* get_adapter( bool is_invokedynamic); |
44 |
46 |
45 protected: |
47 protected: |
46 void print_impl(outputStream* st); |
48 void print_chain_impl(outputStream* st) PRODUCT_RETURN; |
47 |
49 |
48 public: |
50 public: |
49 ciMethodHandle(instanceHandle h_i) : |
51 ciMethodHandle(instanceHandle h_i) : |
50 ciInstance(h_i), |
52 ciInstance(h_i), |
51 _callee(NULL), |
53 _callee(NULL), |
52 _caller(NULL) |
54 _caller(NULL), |
|
55 _method_handle_adapter(NULL), |
|
56 _invokedynamic_adapter(NULL) |
53 {} |
57 {} |
54 |
58 |
55 // What kind of ciObject is this? |
59 // What kind of ciObject is this? |
56 bool is_method_handle() const { return true; } |
60 bool is_method_handle() const { return true; } |
57 |
61 |
58 void set_callee(ciMethod* m) { _callee = m; } |
62 void set_callee(ciMethod* m) { _callee = m; } |
59 void set_caller(ciMethod* m) { _caller = m; } |
63 void set_caller(ciMethod* m) { _caller = m; } |
60 void set_call_profile(ciCallProfile profile) { _profile = profile; } |
64 void set_call_profile(ciCallProfile profile) { _profile = profile; } |
61 |
65 |
62 // Return an adapter for a MethodHandle call. |
66 // Return an adapter for a MethodHandle call. |
63 ciMethod* get_method_handle_adapter() const { return get_adapter(false); } |
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 } |
64 |
73 |
65 // Return an adapter for an invokedynamic call. |
74 // Return an adapter for an invokedynamic call. |
66 ciMethod* get_invokedynamic_adapter() const { return get_adapter(true); } |
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(outputStream* st = tty) PRODUCT_RETURN; |
67 }; |
83 }; |
68 |
84 |
69 #endif // SHARE_VM_CI_CIMETHODHANDLE_HPP |
85 #endif // SHARE_VM_CI_CIMETHODHANDLE_HPP |