comparison src/share/vm/classfile/javaClasses.cpp @ 2356:72dee110246f

6839872: remove implementation inheritance from JSR 292 APIs Summary: consolidate runtime support in java.dyn.MethodHandleNatives; include transitional compatibility logic Reviewed-by: twisti
author jrose
date Fri, 11 Mar 2011 22:33:47 -0800
parents 3582bf76420e
children 8033953d67ff
comparison
equal deleted inserted replaced
2355:799d8ccf63cf 2356:72dee110246f
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