64 if (allow_super) |
64 if (allow_super) |
65 return ik->find_field(name_symbol, signature_symbol, fd) != NULL; |
65 return ik->find_field(name_symbol, signature_symbol, fd) != NULL; |
66 else |
66 else |
67 return ik->find_local_field(name_symbol, signature_symbol, fd); |
67 return ik->find_local_field(name_symbol, signature_symbol, fd); |
68 } |
68 } |
69 |
|
70 static bool find_hacked_field(instanceKlass* ik, |
|
71 Symbol* name_symbol, Symbol* signature_symbol, |
|
72 fieldDescriptor* fd, |
|
73 bool allow_super = false) { |
|
74 bool found = find_field(ik, name_symbol, signature_symbol, fd, allow_super); |
|
75 if (!found && AllowTransitionalJSR292) { |
|
76 Symbol* backup_sig = SystemDictionary::find_backup_signature(signature_symbol); |
|
77 if (backup_sig != NULL) { |
|
78 found = find_field(ik, name_symbol, backup_sig, fd, allow_super); |
|
79 if (TraceMethodHandles) { |
|
80 ResourceMark rm; |
|
81 tty->print_cr("MethodHandles: %s.%s: backup for %s => %s%s", |
|
82 ik->name()->as_C_string(), name_symbol->as_C_string(), |
|
83 signature_symbol->as_C_string(), backup_sig->as_C_string(), |
|
84 (found ? "" : " (NOT FOUND)")); |
|
85 } |
|
86 } |
|
87 } |
|
88 return found; |
|
89 } |
|
90 #define find_field find_hacked_field /* remove after AllowTransitionalJSR292 */ |
|
91 |
69 |
92 // Helpful routine for computing field offsets at run time rather than hardcoding them |
70 // Helpful routine for computing field offsets at run time rather than hardcoding them |
93 static void |
71 static void |
94 compute_offset(int &dest_offset, |
72 compute_offset(int &dest_offset, |
95 klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol, |
73 klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol, |
2331 |
2309 |
2332 void java_lang_invoke_MethodHandle::compute_offsets() { |
2310 void java_lang_invoke_MethodHandle::compute_offsets() { |
2333 klassOop k = SystemDictionary::MethodHandle_klass(); |
2311 klassOop k = SystemDictionary::MethodHandle_klass(); |
2334 if (k != NULL && EnableInvokeDynamic) { |
2312 if (k != NULL && EnableInvokeDynamic) { |
2335 bool allow_super = false; |
2313 bool allow_super = false; |
2336 if (AllowTransitionalJSR292) allow_super = true; // temporary, to access java.dyn.MethodHandleImpl |
|
2337 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature(), allow_super); |
2314 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature(), allow_super); |
2338 compute_offset(_vmtarget_offset, k, vmSymbols::vmtarget_name(), vmSymbols::object_signature(), allow_super); |
2315 compute_offset(_vmtarget_offset, k, vmSymbols::vmtarget_name(), vmSymbols::object_signature(), allow_super); |
2339 compute_offset(_vmentry_offset, k, vmSymbols::vmentry_name(), vmSymbols::machine_word_signature(), allow_super); |
2316 compute_offset(_vmentry_offset, k, vmSymbols::vmentry_name(), vmSymbols::machine_word_signature(), allow_super); |
2340 |
2317 |
2341 // Note: MH.vmslots (if it is present) is a hoisted copy of MH.type.form.vmslots. |
2318 // Note: MH.vmslots (if it is present) is a hoisted copy of MH.type.form.vmslots. |