Mercurial > hg > graal-jvmci-8
comparison src/share/vm/oops/cpCacheOop.hpp @ 726:be93aad57795
6655646: dynamic languages need dynamically linked call sites
Summary: invokedynamic instruction (JSR 292 RI)
Reviewed-by: twisti, never
author | jrose |
---|---|
date | Tue, 21 Apr 2009 23:21:04 -0700 |
parents | 0fbdb4381b99 |
children | 389049f3f393 |
comparison
equal
deleted
inserted
replaced
725:928912ce8438 | 726:be93aad57795 |
---|---|
87 // _indices = invoke code for f1 (b1 section), invoke code for f2 (b2 section), | 87 // _indices = invoke code for f1 (b1 section), invoke code for f2 (b2 section), |
88 // original constant pool index | 88 // original constant pool index |
89 // _f1 = method for all but virtual calls, unused by virtual calls | 89 // _f1 = method for all but virtual calls, unused by virtual calls |
90 // (note: for interface calls, which are essentially virtual, | 90 // (note: for interface calls, which are essentially virtual, |
91 // contains klassOop for the corresponding interface. | 91 // contains klassOop for the corresponding interface. |
92 // for invokedynamic, f1 contains the CallSite object for the invocation | |
92 // _f2 = method/vtable index for virtual calls only, unused by all other | 93 // _f2 = method/vtable index for virtual calls only, unused by all other |
93 // calls. The vf flag indicates this is a method pointer not an | 94 // calls. The vf flag indicates this is a method pointer not an |
94 // index. | 95 // index. |
95 // _flags = field type info (f section), | 96 // _flags = field type info (f section), |
96 // virtual final entry (vf), | 97 // virtual final entry (vf), |
106 // The fields are volatile so that they are stored in the order written in the | 107 // The fields are volatile so that they are stored in the order written in the |
107 // source code. The _indices field with the bytecode must be written last. | 108 // source code. The _indices field with the bytecode must be written last. |
108 | 109 |
109 class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC { | 110 class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC { |
110 friend class VMStructs; | 111 friend class VMStructs; |
112 friend class constantPoolCacheKlass; | |
113 | |
111 private: | 114 private: |
112 volatile intx _indices; // constant pool index & rewrite bytecodes | 115 volatile intx _indices; // constant pool index & rewrite bytecodes |
113 volatile oop _f1; // entry specific oop field | 116 volatile oop _f1; // entry specific oop field |
114 volatile intx _f2; // entry specific int/oop field | 117 volatile intx _f2; // entry specific int/oop field |
115 volatile intx _flags; // flags | 118 volatile intx _flags; // flags |
171 ); | 174 ); |
172 | 175 |
173 void set_interface_call( | 176 void set_interface_call( |
174 methodHandle method, // Resolved method | 177 methodHandle method, // Resolved method |
175 int index // Method index into interface | 178 int index // Method index into interface |
179 ); | |
180 | |
181 void set_dynamic_call( | |
182 Handle call_site, // Resolved java.dyn.CallSite (f1) | |
183 int extra_data // (f2) | |
176 ); | 184 ); |
177 | 185 |
178 void set_parameter_size(int value) { | 186 void set_parameter_size(int value) { |
179 assert(parameter_size() == 0 || parameter_size() == value, | 187 assert(parameter_size() == 0 || parameter_size() == value, |
180 "size must not change"); | 188 "size must not change"); |
214 } | 222 } |
215 return false; // default: not resolved | 223 return false; // default: not resolved |
216 } | 224 } |
217 | 225 |
218 // Accessors | 226 // Accessors |
219 int constant_pool_index() const { return _indices & 0xFFFF; } | 227 bool is_secondary_entry() const { return (_indices & 0xFFFF) == 0; } |
228 int constant_pool_index() const { assert((_indices & 0xFFFF) != 0, "must be main entry"); | |
229 return (_indices & 0xFFFF); } | |
230 int main_entry_index() const { assert((_indices & 0xFFFF) == 0, "must be secondary entry"); | |
231 return ((uintx)_indices >> 16); } | |
220 Bytecodes::Code bytecode_1() const { return Bytecodes::cast((_indices >> 16) & 0xFF); } | 232 Bytecodes::Code bytecode_1() const { return Bytecodes::cast((_indices >> 16) & 0xFF); } |
221 Bytecodes::Code bytecode_2() const { return Bytecodes::cast((_indices >> 24) & 0xFF); } | 233 Bytecodes::Code bytecode_2() const { return Bytecodes::cast((_indices >> 24) & 0xFF); } |
222 volatile oop f1() const { return _f1; } | 234 volatile oop f1() const { return _f1; } |
223 intx f2() const { return _f2; } | 235 intx f2() const { return _f2; } |
224 int field_index() const; | 236 int field_index() const; |
312 | 324 |
313 public: | 325 public: |
314 // Initialization | 326 // Initialization |
315 void initialize(intArray& inverse_index_map); | 327 void initialize(intArray& inverse_index_map); |
316 | 328 |
329 // Secondary indexes. | |
330 // They must look completely different from normal indexes. | |
331 // The main reason is that byte swapping is sometimes done on normal indexes. | |
332 // Also, it is helpful for debugging to tell the two apart. | |
333 static bool is_secondary_index(int i) { return (i < 0); } | |
334 static int decode_secondary_index(int i) { assert(is_secondary_index(i), ""); return ~i; } | |
335 static int encode_secondary_index(int i) { assert(!is_secondary_index(i), ""); return ~i; } | |
336 | |
317 // Accessors | 337 // Accessors |
318 void set_constant_pool(constantPoolOop pool) { oop_store_without_check((oop*)&_constant_pool, (oop)pool); } | 338 void set_constant_pool(constantPoolOop pool) { oop_store_without_check((oop*)&_constant_pool, (oop)pool); } |
319 constantPoolOop constant_pool() const { return _constant_pool; } | 339 constantPoolOop constant_pool() const { return _constant_pool; } |
320 ConstantPoolCacheEntry* entry_at(int i) const { assert(0 <= i && i < length(), "index out of bounds"); return base() + i; } | 340 ConstantPoolCacheEntry* entry_at(int i) const { assert(0 <= i && i < length(), "index out of bounds"); return base() + i; } |
341 ConstantPoolCacheEntry* main_entry_at(int i) const { | |
342 ConstantPoolCacheEntry* e; | |
343 if (is_secondary_index(i)) { | |
344 // run through an extra level of indirection: | |
345 i = decode_secondary_index(i); | |
346 e = entry_at(i); | |
347 i = e->main_entry_index(); | |
348 } | |
349 e = entry_at(i); | |
350 assert(!e->is_secondary_entry(), "only one level of indirection"); | |
351 return e; | |
352 } | |
321 | 353 |
322 // GC support | 354 // GC support |
323 // If the _length field has not been set, the size of the | 355 // If the _length field has not been set, the size of the |
324 // constantPoolCache cannot be correctly calculated. | 356 // constantPoolCache cannot be correctly calculated. |
325 bool is_conc_safe() { return _is_conc_safe; } | 357 bool is_conc_safe() { return _is_conc_safe; } |