Mercurial > hg > graal-compiler
comparison src/share/vm/interpreter/bytecode.cpp @ 6266:1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
6984705: JSR 292 method handle creation should not go through JNI
Summary: remove assembly code for JDK 7 chained method handles
Reviewed-by: jrose, twisti, kvn, mhaupt
Contributed-by: John Rose <john.r.rose@oracle.com>, Christian Thalinger <christian.thalinger@oracle.com>, Michael Haupt <michael.haupt@oracle.com>
author | twisti |
---|---|
date | Tue, 24 Jul 2012 10:51:00 -0700 |
parents | 3582bf76420e |
children | da91efe96a93 |
comparison
equal
deleted
inserted
replaced
6241:aba91a731143 | 6266:1d7922586cf6 |
---|---|
118 | 118 |
119 // Implementation of Bytecode_invoke | 119 // Implementation of Bytecode_invoke |
120 | 120 |
121 void Bytecode_invoke::verify() const { | 121 void Bytecode_invoke::verify() const { |
122 assert(is_valid(), "check invoke"); | 122 assert(is_valid(), "check invoke"); |
123 assert(method()->constants()->cache() != NULL, "do not call this from verifier or rewriter"); | 123 assert(cpcache() != NULL, "do not call this from verifier or rewriter"); |
124 } | |
125 | |
126 | |
127 Symbol* Bytecode_member_ref::klass() const { | |
128 return constants()->klass_ref_at_noresolve(index()); | |
129 } | |
130 | |
131 | |
132 Symbol* Bytecode_member_ref::name() const { | |
133 return constants()->name_ref_at(index()); | |
124 } | 134 } |
125 | 135 |
126 | 136 |
127 Symbol* Bytecode_member_ref::signature() const { | 137 Symbol* Bytecode_member_ref::signature() const { |
128 constantPoolOop constants = method()->constants(); | 138 return constants()->signature_ref_at(index()); |
129 return constants->signature_ref_at(index()); | |
130 } | |
131 | |
132 | |
133 Symbol* Bytecode_member_ref::name() const { | |
134 constantPoolOop constants = method()->constants(); | |
135 return constants->name_ref_at(index()); | |
136 } | 139 } |
137 | 140 |
138 | 141 |
139 BasicType Bytecode_member_ref::result_type() const { | 142 BasicType Bytecode_member_ref::result_type() const { |
140 ResultTypeFinder rts(signature()); | 143 ResultTypeFinder rts(signature()); |
144 | 147 |
145 | 148 |
146 methodHandle Bytecode_invoke::static_target(TRAPS) { | 149 methodHandle Bytecode_invoke::static_target(TRAPS) { |
147 methodHandle m; | 150 methodHandle m; |
148 KlassHandle resolved_klass; | 151 KlassHandle resolved_klass; |
149 constantPoolHandle constants(THREAD, _method->constants()); | 152 constantPoolHandle constants(THREAD, this->constants()); |
150 | 153 |
151 if (java_code() == Bytecodes::_invokedynamic) { | 154 Bytecodes::Code bc = invoke_code(); |
152 LinkResolver::resolve_dynamic_method(m, resolved_klass, constants, index(), CHECK_(methodHandle())); | 155 LinkResolver::resolve_method_statically(m, resolved_klass, bc, constants, index(), CHECK_(methodHandle())); |
153 } else if (java_code() != Bytecodes::_invokeinterface) { | |
154 LinkResolver::resolve_method(m, resolved_klass, constants, index(), CHECK_(methodHandle())); | |
155 } else { | |
156 LinkResolver::resolve_interface_method(m, resolved_klass, constants, index(), CHECK_(methodHandle())); | |
157 } | |
158 return m; | 156 return m; |
159 } | 157 } |
160 | 158 |
159 Handle Bytecode_invoke::appendix(TRAPS) { | |
160 ConstantPoolCacheEntry* cpce = cpcache_entry(); | |
161 if (cpce->has_appendix()) | |
162 return Handle(THREAD, cpce->f1_appendix()); | |
163 return Handle(); // usual case | |
164 } | |
161 | 165 |
162 int Bytecode_member_ref::index() const { | 166 int Bytecode_member_ref::index() const { |
163 // Note: Rewriter::rewrite changes the Java_u2 of an invokedynamic to a native_u4, | 167 // Note: Rewriter::rewrite changes the Java_u2 of an invokedynamic to a native_u4, |
164 // at the same time it allocates per-call-site CP cache entries. | 168 // at the same time it allocates per-call-site CP cache entries. |
165 Bytecodes::Code rawc = code(); | 169 Bytecodes::Code rawc = code(); |
168 else | 172 else |
169 return get_index_u2_cpcache(rawc); | 173 return get_index_u2_cpcache(rawc); |
170 } | 174 } |
171 | 175 |
172 int Bytecode_member_ref::pool_index() const { | 176 int Bytecode_member_ref::pool_index() const { |
177 return cpcache_entry()->constant_pool_index(); | |
178 } | |
179 | |
180 ConstantPoolCacheEntry* Bytecode_member_ref::cpcache_entry() const { | |
173 int index = this->index(); | 181 int index = this->index(); |
174 DEBUG_ONLY({ | 182 DEBUG_ONLY({ |
175 if (!has_index_u4(code())) | 183 if (!has_index_u4(code())) |
176 index -= constantPoolOopDesc::CPCACHE_INDEX_TAG; | 184 index = constantPoolOopDesc::get_cpcache_index(index); |
177 }); | 185 }); |
178 return _method->constants()->cache()->entry_at(index)->constant_pool_index(); | 186 return cpcache()->entry_at(index); |
179 } | 187 } |
180 | 188 |
181 // Implementation of Bytecode_field | 189 // Implementation of Bytecode_field |
182 | 190 |
183 void Bytecode_field::verify() const { | 191 void Bytecode_field::verify() const { |