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