Mercurial > hg > truffle
comparison src/share/vm/classfile/dictionary.hpp @ 1507:cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
Summary: split MethodHandle.invoke into invokeExact and invokeGeneric; also clean up JVM-to-Java interfaces
Reviewed-by: twisti
author | jrose |
---|---|
date | Sat, 01 May 2010 02:42:18 -0700 |
parents | e5b0439ef4ae |
children | c18cbe5936b8 |
comparison
equal
deleted
inserted
replaced
1506:2338d41fbd81 | 1507:cd5dbf694d45 |
---|---|
221 // Entry in a SymbolPropertyTable, mapping a single symbolOop | 221 // Entry in a SymbolPropertyTable, mapping a single symbolOop |
222 // to a managed and an unmanaged pointer. | 222 // to a managed and an unmanaged pointer. |
223 class SymbolPropertyEntry : public HashtableEntry { | 223 class SymbolPropertyEntry : public HashtableEntry { |
224 friend class VMStructs; | 224 friend class VMStructs; |
225 private: | 225 private: |
226 intptr_t _symbol_mode; // secondary key | |
226 oop _property_oop; | 227 oop _property_oop; |
227 address _property_data; | 228 address _property_data; |
228 | 229 |
229 public: | 230 public: |
230 symbolOop symbol() const { return (symbolOop) literal(); } | 231 symbolOop symbol() const { return (symbolOop) literal(); } |
231 | 232 |
233 intptr_t symbol_mode() const { return _symbol_mode; } | |
234 void set_symbol_mode(intptr_t m) { _symbol_mode = m; } | |
235 | |
232 oop property_oop() const { return _property_oop; } | 236 oop property_oop() const { return _property_oop; } |
233 void set_property_oop(oop p) { _property_oop = p; } | 237 void set_property_oop(oop p) { _property_oop = p; } |
234 | 238 |
235 address property_data() const { return _property_data; } | 239 address property_data() const { return _property_data; } |
236 void set_property_data(address p) { _property_data = p; } | 240 void set_property_data(address p) { _property_data = p; } |
246 oop* symbol_addr() { return literal_addr(); } | 250 oop* symbol_addr() { return literal_addr(); } |
247 oop* property_oop_addr() { return &_property_oop; } | 251 oop* property_oop_addr() { return &_property_oop; } |
248 | 252 |
249 void print_on(outputStream* st) const { | 253 void print_on(outputStream* st) const { |
250 symbol()->print_value_on(st); | 254 symbol()->print_value_on(st); |
255 st->print("/mode="INTX_FORMAT, symbol_mode()); | |
251 st->print(" -> "); | 256 st->print(" -> "); |
252 bool printed = false; | 257 bool printed = false; |
253 if (property_oop() != NULL) { | 258 if (property_oop() != NULL) { |
254 property_oop()->print_value_on(st); | 259 property_oop()->print_value_on(st); |
255 printed = true; | 260 printed = true; |
283 } | 288 } |
284 void set_entry(int index, SymbolPropertyEntry* new_entry) { | 289 void set_entry(int index, SymbolPropertyEntry* new_entry) { |
285 ShouldNotReachHere(); | 290 ShouldNotReachHere(); |
286 } | 291 } |
287 | 292 |
288 SymbolPropertyEntry* new_entry(unsigned int hash, symbolOop symbol) { | 293 SymbolPropertyEntry* new_entry(unsigned int hash, symbolOop symbol, intptr_t symbol_mode) { |
289 SymbolPropertyEntry* entry = (SymbolPropertyEntry*) Hashtable::new_entry(hash, symbol); | 294 SymbolPropertyEntry* entry = (SymbolPropertyEntry*) Hashtable::new_entry(hash, symbol); |
295 entry->set_symbol_mode(symbol_mode); | |
290 entry->set_property_oop(NULL); | 296 entry->set_property_oop(NULL); |
291 entry->set_property_data(NULL); | 297 entry->set_property_data(NULL); |
292 return entry; | 298 return entry; |
293 } | 299 } |
294 | 300 |
298 | 304 |
299 void free_entry(SymbolPropertyEntry* entry) { | 305 void free_entry(SymbolPropertyEntry* entry) { |
300 Hashtable::free_entry(entry); | 306 Hashtable::free_entry(entry); |
301 } | 307 } |
302 | 308 |
303 unsigned int compute_hash(symbolHandle sym) { | 309 unsigned int compute_hash(symbolHandle sym, intptr_t symbol_mode) { |
304 // Use the regular identity_hash. | 310 // Use the regular identity_hash. |
305 return Hashtable::compute_hash(sym); | 311 return Hashtable::compute_hash(sym) ^ symbol_mode; |
312 } | |
313 | |
314 int index_for(symbolHandle name, intptr_t symbol_mode) { | |
315 return hash_to_index(compute_hash(name, symbol_mode)); | |
306 } | 316 } |
307 | 317 |
308 // need not be locked; no state change | 318 // need not be locked; no state change |
309 SymbolPropertyEntry* find_entry(int index, unsigned int hash, symbolHandle name); | 319 SymbolPropertyEntry* find_entry(int index, unsigned int hash, symbolHandle name, intptr_t name_mode); |
310 | 320 |
311 // must be done under SystemDictionary_lock | 321 // must be done under SystemDictionary_lock |
312 SymbolPropertyEntry* add_entry(int index, unsigned int hash, symbolHandle name); | 322 SymbolPropertyEntry* add_entry(int index, unsigned int hash, symbolHandle name, intptr_t name_mode); |
313 | 323 |
314 // GC support | 324 // GC support |
315 void oops_do(OopClosure* f); | 325 void oops_do(OopClosure* f); |
316 void methods_do(void f(methodOop)); | 326 void methods_do(void f(methodOop)); |
317 | 327 |