src/share/vm/classfile/javaClasses.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 6839872 Sdiff src/share/vm/classfile

src/share/vm/classfile/javaClasses.cpp

Print this page
rev 2143 : 6839872: remove implementation inheritance from JSR 292 APIs
Summary: Move all JSR 292 classes into the java.dyn package.
Reviewed-by:
   1 /*
   2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   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
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *


  49 #ifdef TARGET_OS_FAMILY_linux
  50 # include "thread_linux.inline.hpp"
  51 #endif
  52 #ifdef TARGET_OS_FAMILY_solaris
  53 # include "thread_solaris.inline.hpp"
  54 #endif
  55 #ifdef TARGET_OS_FAMILY_windows
  56 # include "thread_windows.inline.hpp"
  57 #endif
  58 
  59 static bool find_field(instanceKlass* ik,
  60                        Symbol* name_symbol, Symbol* signature_symbol,
  61                        fieldDescriptor* fd,
  62                        bool allow_super = false) {
  63   if (allow_super)
  64     return ik->find_field(name_symbol, signature_symbol, fd) != NULL;
  65   else
  66     return ik->find_local_field(name_symbol, signature_symbol, fd);
  67 }
  68 






















  69 // Helpful routine for computing field offsets at run time rather than hardcoding them
  70 static void
  71 compute_offset(int &dest_offset,
  72                klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
  73                bool allow_super = false) {
  74   fieldDescriptor fd;
  75   instanceKlass* ik = instanceKlass::cast(klass_oop);
  76   if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
  77     ResourceMark rm;
  78     tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
  79     fatal("Invalid layout of preloaded class");
  80   }
  81   dest_offset = fd.offset();
  82 }
  83 
  84 // Same as above but for "optional" offsets that might not be present in certain JDK versions
  85 static void
  86 compute_optional_offset(int& dest_offset,
  87                         klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
  88                         bool allow_super = false) {


2183 int java_dyn_MethodHandle::_vmentry_offset;
2184 int java_dyn_MethodHandle::_vmslots_offset;
2185 
2186 int sun_dyn_MemberName::_clazz_offset;
2187 int sun_dyn_MemberName::_name_offset;
2188 int sun_dyn_MemberName::_type_offset;
2189 int sun_dyn_MemberName::_flags_offset;
2190 int sun_dyn_MemberName::_vmtarget_offset;
2191 int sun_dyn_MemberName::_vmindex_offset;
2192 
2193 int sun_dyn_DirectMethodHandle::_vmindex_offset;
2194 
2195 int sun_dyn_BoundMethodHandle::_argument_offset;
2196 int sun_dyn_BoundMethodHandle::_vmargslot_offset;
2197 
2198 int sun_dyn_AdapterMethodHandle::_conversion_offset;
2199 
2200 void java_dyn_MethodHandle::compute_offsets() {
2201   klassOop k = SystemDictionary::MethodHandle_klass();
2202   if (k != NULL && EnableMethodHandles) {
2203     compute_offset(_type_offset,      k, vmSymbols::type_name(),      vmSymbols::java_dyn_MethodType_signature(), true);
2204     compute_offset(_vmtarget_offset,  k, vmSymbols::vmtarget_name(),  vmSymbols::object_signature(), true);
2205     compute_offset(_vmentry_offset,   k, vmSymbols::vmentry_name(),   vmSymbols::machine_word_signature(), true);


2206 
2207     // 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.
2209     compute_optional_offset(_vmslots_offset, k, vmSymbols::vmslots_name(), vmSymbols::int_signature(), true);
2210   }
2211 }
2212 
2213 void sun_dyn_MemberName::compute_offsets() {
2214   klassOop k = SystemDictionary::MemberName_klass();
2215   if (k != NULL && EnableMethodHandles) {
2216     compute_offset(_clazz_offset,     k, vmSymbols::clazz_name(),     vmSymbols::class_signature());
2217     compute_offset(_name_offset,      k, vmSymbols::name_name(),      vmSymbols::string_signature());
2218     compute_offset(_type_offset,      k, vmSymbols::type_name(),      vmSymbols::object_signature());
2219     compute_offset(_flags_offset,     k, vmSymbols::flags_name(),     vmSymbols::int_signature());
2220     compute_offset(_vmtarget_offset,  k, vmSymbols::vmtarget_name(),  vmSymbols::object_signature());
2221     compute_offset(_vmindex_offset,   k, vmSymbols::vmindex_name(),   vmSymbols::int_signature());
2222   }
2223 }
2224 
2225 void sun_dyn_DirectMethodHandle::compute_offsets() {
2226   klassOop k = SystemDictionary::DirectMethodHandle_klass();
2227   if (k != NULL && EnableMethodHandles) {
2228     compute_offset(_vmindex_offset,   k, vmSymbols::vmindex_name(),   vmSymbols::int_signature(),    true);
2229   }


2487 
2488 int java_dyn_MethodTypeForm::vmslots(oop mtform) {
2489   assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2490   return mtform->int_field(_vmslots_offset);
2491 }
2492 
2493 oop java_dyn_MethodTypeForm::erasedType(oop mtform) {
2494   assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2495   return mtform->obj_field(_erasedType_offset);
2496 }
2497 
2498 oop java_dyn_MethodTypeForm::genericInvoker(oop mtform) {
2499   assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2500   return mtform->obj_field(_genericInvoker_offset);
2501 }
2502 
2503 
2504 // Support for java_dyn_CallSite
2505 
2506 int java_dyn_CallSite::_target_offset;
2507 int java_dyn_CallSite::_caller_method_offset;
2508 int java_dyn_CallSite::_caller_bci_offset;
2509 
2510 void java_dyn_CallSite::compute_offsets() {
2511   if (!EnableInvokeDynamic)  return;
2512   klassOop k = SystemDictionary::CallSite_klass();
2513   if (k != NULL) {
2514     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   }
2518 }
2519 
2520 oop java_dyn_CallSite::target(oop site) {
2521   return site->obj_field(_target_offset);
2522 }
2523 
2524 void java_dyn_CallSite::set_target(oop site, oop target) {
2525   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 }
2543 
2544 
2545 // Support for java_security_AccessControlContext
2546 
2547 int java_security_AccessControlContext::_context_offset = 0;
2548 int java_security_AccessControlContext::_privilegedContext_offset = 0;
2549 int java_security_AccessControlContext::_isPrivileged_offset = 0;
2550 
2551 void java_security_AccessControlContext::compute_offsets() {
2552   assert(_isPrivileged_offset == 0, "offsets should be initialized only once");
2553   fieldDescriptor fd;
2554   instanceKlass* ik = instanceKlass::cast(SystemDictionary::AccessControlContext_klass());
2555 
2556   if (!ik->find_local_field(vmSymbols::context_name(), vmSymbols::protectiondomain_signature(), &fd)) {
2557     fatal("Invalid layout of java.security.AccessControlContext");
2558   }
2559   _context_offset = fd.offset();
2560 
2561   if (!ik->find_local_field(vmSymbols::privilegedContext_name(), vmSymbols::accesscontrolcontext_signature(), &fd)) {
2562     fatal("Invalid layout of java.security.AccessControlContext");
2563   }


   1 /*
   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.
   4  *
   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
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *


  49 #ifdef TARGET_OS_FAMILY_linux
  50 # include "thread_linux.inline.hpp"
  51 #endif
  52 #ifdef TARGET_OS_FAMILY_solaris
  53 # include "thread_solaris.inline.hpp"
  54 #endif
  55 #ifdef TARGET_OS_FAMILY_windows
  56 # include "thread_windows.inline.hpp"
  57 #endif
  58 
  59 static bool find_field(instanceKlass* ik,
  60                        Symbol* name_symbol, Symbol* signature_symbol,
  61                        fieldDescriptor* fd,
  62                        bool allow_super = false) {
  63   if (allow_super)
  64     return ik->find_field(name_symbol, signature_symbol, fd) != NULL;
  65   else
  66     return ik->find_local_field(name_symbol, signature_symbol, fd);
  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 */
  90 
  91 // Helpful routine for computing field offsets at run time rather than hardcoding them
  92 static void
  93 compute_offset(int &dest_offset,
  94                klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
  95                bool allow_super = false) {
  96   fieldDescriptor fd;
  97   instanceKlass* ik = instanceKlass::cast(klass_oop);
  98   if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
  99     ResourceMark rm;
 100     tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
 101     fatal("Invalid layout of preloaded class");
 102   }
 103   dest_offset = fd.offset();
 104 }
 105 
 106 // Same as above but for "optional" offsets that might not be present in certain JDK versions
 107 static void
 108 compute_optional_offset(int& dest_offset,
 109                         klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
 110                         bool allow_super = false) {


2205 int java_dyn_MethodHandle::_vmentry_offset;
2206 int java_dyn_MethodHandle::_vmslots_offset;
2207 
2208 int sun_dyn_MemberName::_clazz_offset;
2209 int sun_dyn_MemberName::_name_offset;
2210 int sun_dyn_MemberName::_type_offset;
2211 int sun_dyn_MemberName::_flags_offset;
2212 int sun_dyn_MemberName::_vmtarget_offset;
2213 int sun_dyn_MemberName::_vmindex_offset;
2214 
2215 int sun_dyn_DirectMethodHandle::_vmindex_offset;
2216 
2217 int sun_dyn_BoundMethodHandle::_argument_offset;
2218 int sun_dyn_BoundMethodHandle::_vmargslot_offset;
2219 
2220 int sun_dyn_AdapterMethodHandle::_conversion_offset;
2221 
2222 void java_dyn_MethodHandle::compute_offsets() {
2223   klassOop k = SystemDictionary::MethodHandle_klass();
2224   if (k != NULL && EnableMethodHandles) {
2225     bool allow_super = false;
2226     if (AllowTransitionalJSR292)  allow_super = true;  // temporary, to access sun.dyn.MethodHandleImpl
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);
2230 
2231     // Note:  MH.vmslots (if it is present) is a hoisted copy of MH.type.form.vmslots.
2232     // It is optional pending experiments to keep or toss.
2233     compute_optional_offset(_vmslots_offset, k, vmSymbols::vmslots_name(), vmSymbols::int_signature(), allow_super);
2234   }
2235 }
2236 
2237 void sun_dyn_MemberName::compute_offsets() {
2238   klassOop k = SystemDictionary::MemberName_klass();
2239   if (k != NULL && EnableMethodHandles) {
2240     compute_offset(_clazz_offset,     k, vmSymbols::clazz_name(),     vmSymbols::class_signature());
2241     compute_offset(_name_offset,      k, vmSymbols::name_name(),      vmSymbols::string_signature());
2242     compute_offset(_type_offset,      k, vmSymbols::type_name(),      vmSymbols::object_signature());
2243     compute_offset(_flags_offset,     k, vmSymbols::flags_name(),     vmSymbols::int_signature());
2244     compute_offset(_vmtarget_offset,  k, vmSymbols::vmtarget_name(),  vmSymbols::object_signature());
2245     compute_offset(_vmindex_offset,   k, vmSymbols::vmindex_name(),   vmSymbols::int_signature());
2246   }
2247 }
2248 
2249 void sun_dyn_DirectMethodHandle::compute_offsets() {
2250   klassOop k = SystemDictionary::DirectMethodHandle_klass();
2251   if (k != NULL && EnableMethodHandles) {
2252     compute_offset(_vmindex_offset,   k, vmSymbols::vmindex_name(),   vmSymbols::int_signature(),    true);
2253   }


2511 
2512 int java_dyn_MethodTypeForm::vmslots(oop mtform) {
2513   assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2514   return mtform->int_field(_vmslots_offset);
2515 }
2516 
2517 oop java_dyn_MethodTypeForm::erasedType(oop mtform) {
2518   assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2519   return mtform->obj_field(_erasedType_offset);
2520 }
2521 
2522 oop java_dyn_MethodTypeForm::genericInvoker(oop mtform) {
2523   assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2524   return mtform->obj_field(_genericInvoker_offset);
2525 }
2526 
2527 
2528 // Support for java_dyn_CallSite
2529 
2530 int java_dyn_CallSite::_target_offset;


2531 
2532 void java_dyn_CallSite::compute_offsets() {
2533   if (!EnableInvokeDynamic)  return;
2534   klassOop k = SystemDictionary::CallSite_klass();
2535   if (k != NULL) {
2536     compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_dyn_MethodHandle_signature());


2537   }
2538 }
2539 
2540 oop java_dyn_CallSite::target(oop site) {
2541   return site->obj_field(_target_offset);
2542 }
2543 
2544 void java_dyn_CallSite::set_target(oop site, oop target) {
2545   site->obj_field_put(_target_offset, target);
2546 }
2547 
















2548 
2549 // Support for java_security_AccessControlContext
2550 
2551 int java_security_AccessControlContext::_context_offset = 0;
2552 int java_security_AccessControlContext::_privilegedContext_offset = 0;
2553 int java_security_AccessControlContext::_isPrivileged_offset = 0;
2554 
2555 void java_security_AccessControlContext::compute_offsets() {
2556   assert(_isPrivileged_offset == 0, "offsets should be initialized only once");
2557   fieldDescriptor fd;
2558   instanceKlass* ik = instanceKlass::cast(SystemDictionary::AccessControlContext_klass());
2559 
2560   if (!ik->find_local_field(vmSymbols::context_name(), vmSymbols::protectiondomain_signature(), &fd)) {
2561     fatal("Invalid layout of java.security.AccessControlContext");
2562   }
2563   _context_offset = fd.offset();
2564 
2565   if (!ik->find_local_field(vmSymbols::privilegedContext_name(), vmSymbols::accesscontrolcontext_signature(), &fd)) {
2566     fatal("Invalid layout of java.security.AccessControlContext");
2567   }


src/share/vm/classfile/javaClasses.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File