1 /* |
1 /* |
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
63 if (allow_super) |
63 if (allow_super) |
64 return ik->find_field(name_symbol, signature_symbol, fd) != NULL; |
64 return ik->find_field(name_symbol, signature_symbol, fd) != NULL; |
65 else |
65 else |
66 return ik->find_local_field(name_symbol, signature_symbol, fd); |
66 return ik->find_local_field(name_symbol, signature_symbol, fd); |
67 } |
67 } |
|
68 |
|
69 static bool find_hacked_field(instanceKlass* ik, |
|
70 Symbol* name_symbol, Symbol* signature_symbol, |
|
71 fieldDescriptor* fd, |
|
72 bool allow_super = false) { |
|
73 bool found = find_field(ik, name_symbol, signature_symbol, fd, allow_super); |
|
74 if (!found && AllowTransitionalJSR292) { |
|
75 Symbol* backup_sig = SystemDictionary::find_backup_signature(signature_symbol); |
|
76 if (backup_sig != NULL) { |
|
77 found = find_field(ik, name_symbol, backup_sig, fd, allow_super); |
|
78 if (TraceMethodHandles) { |
|
79 ResourceMark rm; |
|
80 tty->print_cr("MethodHandles: %s.%s: backup for %s => %s%s", |
|
81 ik->name()->as_C_string(), name_symbol->as_C_string(), |
|
82 signature_symbol->as_C_string(), backup_sig->as_C_string(), |
|
83 (found ? "" : " (NOT FOUND)")); |
|
84 } |
|
85 } |
|
86 } |
|
87 return found; |
|
88 } |
|
89 #define find_field find_hacked_field /* remove after AllowTransitionalJSR292 */ |
68 |
90 |
69 // Helpful routine for computing field offsets at run time rather than hardcoding them |
91 // Helpful routine for computing field offsets at run time rather than hardcoding them |
70 static void |
92 static void |
71 compute_offset(int &dest_offset, |
93 compute_offset(int &dest_offset, |
72 klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol, |
94 klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol, |
2198 int sun_dyn_AdapterMethodHandle::_conversion_offset; |
2220 int sun_dyn_AdapterMethodHandle::_conversion_offset; |
2199 |
2221 |
2200 void java_dyn_MethodHandle::compute_offsets() { |
2222 void java_dyn_MethodHandle::compute_offsets() { |
2201 klassOop k = SystemDictionary::MethodHandle_klass(); |
2223 klassOop k = SystemDictionary::MethodHandle_klass(); |
2202 if (k != NULL && EnableMethodHandles) { |
2224 if (k != NULL && EnableMethodHandles) { |
2203 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_dyn_MethodType_signature(), true); |
2225 bool allow_super = false; |
2204 compute_offset(_vmtarget_offset, k, vmSymbols::vmtarget_name(), vmSymbols::object_signature(), true); |
2226 if (AllowTransitionalJSR292) allow_super = true; // temporary, to access sun.dyn.MethodHandleImpl |
2205 compute_offset(_vmentry_offset, k, vmSymbols::vmentry_name(), vmSymbols::machine_word_signature(), true); |
2227 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_dyn_MethodType_signature(), allow_super); |
|
2228 compute_offset(_vmtarget_offset, k, vmSymbols::vmtarget_name(), vmSymbols::object_signature(), allow_super); |
|
2229 compute_offset(_vmentry_offset, k, vmSymbols::vmentry_name(), vmSymbols::machine_word_signature(), allow_super); |
2206 |
2230 |
2207 // Note: MH.vmslots (if it is present) is a hoisted copy of MH.type.form.vmslots. |
2231 // Note: MH.vmslots (if it is present) is a hoisted copy of MH.type.form.vmslots. |
2208 // It is optional pending experiments to keep or toss. |
2232 // It is optional pending experiments to keep or toss. |
2209 compute_optional_offset(_vmslots_offset, k, vmSymbols::vmslots_name(), vmSymbols::int_signature(), true); |
2233 compute_optional_offset(_vmslots_offset, k, vmSymbols::vmslots_name(), vmSymbols::int_signature(), allow_super); |
2210 } |
2234 } |
2211 } |
2235 } |
2212 |
2236 |
2213 void sun_dyn_MemberName::compute_offsets() { |
2237 void sun_dyn_MemberName::compute_offsets() { |
2214 klassOop k = SystemDictionary::MemberName_klass(); |
2238 klassOop k = SystemDictionary::MemberName_klass(); |
2502 |
2526 |
2503 |
2527 |
2504 // Support for java_dyn_CallSite |
2528 // Support for java_dyn_CallSite |
2505 |
2529 |
2506 int java_dyn_CallSite::_target_offset; |
2530 int java_dyn_CallSite::_target_offset; |
2507 int java_dyn_CallSite::_caller_method_offset; |
|
2508 int java_dyn_CallSite::_caller_bci_offset; |
|
2509 |
2531 |
2510 void java_dyn_CallSite::compute_offsets() { |
2532 void java_dyn_CallSite::compute_offsets() { |
2511 if (!EnableInvokeDynamic) return; |
2533 if (!EnableInvokeDynamic) return; |
2512 klassOop k = SystemDictionary::CallSite_klass(); |
2534 klassOop k = SystemDictionary::CallSite_klass(); |
2513 if (k != NULL) { |
2535 if (k != NULL) { |
2514 compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_dyn_MethodHandle_signature()); |
2536 compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_dyn_MethodHandle_signature()); |
2515 compute_offset(_caller_method_offset, k, vmSymbols::vmmethod_name(), vmSymbols::sun_dyn_MemberName_signature()); |
|
2516 compute_offset(_caller_bci_offset, k, vmSymbols::vmindex_name(), vmSymbols::int_signature()); |
|
2517 } |
2537 } |
2518 } |
2538 } |
2519 |
2539 |
2520 oop java_dyn_CallSite::target(oop site) { |
2540 oop java_dyn_CallSite::target(oop site) { |
2521 return site->obj_field(_target_offset); |
2541 return site->obj_field(_target_offset); |
2522 } |
2542 } |
2523 |
2543 |
2524 void java_dyn_CallSite::set_target(oop site, oop target) { |
2544 void java_dyn_CallSite::set_target(oop site, oop target) { |
2525 site->obj_field_put(_target_offset, target); |
2545 site->obj_field_put(_target_offset, target); |
2526 } |
|
2527 |
|
2528 oop java_dyn_CallSite::caller_method(oop site) { |
|
2529 return site->obj_field(_caller_method_offset); |
|
2530 } |
|
2531 |
|
2532 void java_dyn_CallSite::set_caller_method(oop site, oop ref) { |
|
2533 site->obj_field_put(_caller_method_offset, ref); |
|
2534 } |
|
2535 |
|
2536 jint java_dyn_CallSite::caller_bci(oop site) { |
|
2537 return site->int_field(_caller_bci_offset); |
|
2538 } |
|
2539 |
|
2540 void java_dyn_CallSite::set_caller_bci(oop site, jint bci) { |
|
2541 site->int_field_put(_caller_bci_offset, bci); |
|
2542 } |
2546 } |
2543 |
2547 |
2544 |
2548 |
2545 // Support for java_security_AccessControlContext |
2549 // Support for java_security_AccessControlContext |
2546 |
2550 |