hotspot/src/share/vm/classfile/javaClasses.cpp
changeset 8675 e9fef2a9bef7
parent 8076 96d498ec7ae1
child 8676 9098d4e927e1
equal deleted inserted replaced
8674:303a2149d371 8675:e9fef2a9bef7
     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