src/share/vm/interpreter/linkResolver.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 6893081 Sdiff src/share/vm/interpreter

src/share/vm/interpreter/linkResolver.cpp

Print this page
rev 1021 : 6858164: invokedynamic code needs some cleanup (post-6655638)
Note: The bug ID for this change set was erroneously used to call for review of 6815692.
Summary: Fix several crashers, remove needless paths for boxed-style bootstrap method call, refactor & simplify APIs for rewriter constantPoolOop, remove sun.dyn.CallSiteImpl
Reviewed-by: ?
rev 1024 : imported patch indy-cleanup-6893081.patch


  65 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
  66   assert(vtable_index >= 0 || vtable_index == methodOopDesc::nonvirtual_vtable_index, "valid index");
  67   set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
  68 }
  69 
  70 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
  71   assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
  72   _resolved_klass  = resolved_klass;
  73   _selected_klass  = selected_klass;
  74   _resolved_method = resolved_method;
  75   _selected_method = selected_method;
  76   _vtable_index    = vtable_index;
  77   if (CompilationPolicy::mustBeCompiled(selected_method)) {
  78     // Note: with several active threads, the mustBeCompiled may be true
  79     //       while canBeCompiled is false; remove assert
  80     // assert(CompilationPolicy::canBeCompiled(selected_method), "cannot compile");
  81     if (THREAD->is_Compiler_thread()) {
  82       // don't force compilation, resolve was on behalf of compiler
  83       return;
  84     }








  85     CompileBroker::compile_method(selected_method, InvocationEntryBci,
  86                                   methodHandle(), 0, "mustBeCompiled", CHECK);
  87   }
  88 }
  89 
  90 
  91 //------------------------------------------------------------------------------------------------------------------------
  92 // Klass resolution
  93 
  94 void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) {
  95   if (!Reflection::verify_class_access(ref_klass->as_klassOop(),
  96                                        sel_klass->as_klassOop(),
  97                                        true)) {
  98     ResourceMark rm(THREAD);
  99     Exceptions::fthrow(
 100       THREAD_AND_LOCATION,
 101       vmSymbolHandles::java_lang_IllegalAccessError(),
 102       "tried to access class %s from class %s",
 103       sel_klass->external_name(),
 104       ref_klass->external_name()


 206       sel_method->signature()->as_C_string(),
 207       ref_klass->external_name()
 208     );
 209     return;
 210   }
 211 }
 212 
 213 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle& resolved_klass,
 214                                   constantPoolHandle pool, int index, TRAPS) {
 215 
 216   // resolve klass
 217   resolve_klass(resolved_klass, pool, index, CHECK);
 218 
 219   symbolHandle method_name      (THREAD, pool->name_ref_at(index));
 220   symbolHandle method_signature (THREAD, pool->signature_ref_at(index));
 221   KlassHandle  current_klass(THREAD, pool->pool_holder());
 222 
 223   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
 224 }
 225 












 226 void LinkResolver::resolve_interface_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) {
 227 
 228   // resolve klass
 229   resolve_klass(resolved_klass, pool, index, CHECK);
 230   symbolHandle method_name      (THREAD, pool->name_ref_at(index));
 231   symbolHandle method_signature (THREAD, pool->signature_ref_at(index));
 232   KlassHandle  current_klass(THREAD, pool->pool_holder());
 233 
 234   resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
 235 }
 236 
 237 
 238 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
 239                                   symbolHandle method_name, symbolHandle method_signature,
 240                                   KlassHandle current_klass, bool check_access, TRAPS) {
 241 
 242   // 1. check if klass is not interface
 243   if (resolved_klass->is_interface()) {
 244     char buf[200];
 245     jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", Klass::cast(resolved_klass())->external_name());




  65 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
  66   assert(vtable_index >= 0 || vtable_index == methodOopDesc::nonvirtual_vtable_index, "valid index");
  67   set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
  68 }
  69 
  70 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
  71   assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
  72   _resolved_klass  = resolved_klass;
  73   _selected_klass  = selected_klass;
  74   _resolved_method = resolved_method;
  75   _selected_method = selected_method;
  76   _vtable_index    = vtable_index;
  77   if (CompilationPolicy::mustBeCompiled(selected_method)) {
  78     // Note: with several active threads, the mustBeCompiled may be true
  79     //       while canBeCompiled is false; remove assert
  80     // assert(CompilationPolicy::canBeCompiled(selected_method), "cannot compile");
  81     if (THREAD->is_Compiler_thread()) {
  82       // don't force compilation, resolve was on behalf of compiler
  83       return;
  84     }
  85     if (instanceKlass::cast(selected_method->method_holder())->is_not_initialized()) {
  86       // Do not force compilation of methods in uninitialized classes.
  87       // Note that doing this would throw an assert later,
  88       // in CompileBroker::compile_method.
  89       // We sometimes use the link resolver to do reflective lookups
  90       // even before classes are initialized.
  91       return;
  92     }
  93     CompileBroker::compile_method(selected_method, InvocationEntryBci,
  94                                   methodHandle(), 0, "mustBeCompiled", CHECK);
  95   }
  96 }
  97 
  98 
  99 //------------------------------------------------------------------------------------------------------------------------
 100 // Klass resolution
 101 
 102 void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) {
 103   if (!Reflection::verify_class_access(ref_klass->as_klassOop(),
 104                                        sel_klass->as_klassOop(),
 105                                        true)) {
 106     ResourceMark rm(THREAD);
 107     Exceptions::fthrow(
 108       THREAD_AND_LOCATION,
 109       vmSymbolHandles::java_lang_IllegalAccessError(),
 110       "tried to access class %s from class %s",
 111       sel_klass->external_name(),
 112       ref_klass->external_name()


 214       sel_method->signature()->as_C_string(),
 215       ref_klass->external_name()
 216     );
 217     return;
 218   }
 219 }
 220 
 221 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle& resolved_klass,
 222                                   constantPoolHandle pool, int index, TRAPS) {
 223 
 224   // resolve klass
 225   resolve_klass(resolved_klass, pool, index, CHECK);
 226 
 227   symbolHandle method_name      (THREAD, pool->name_ref_at(index));
 228   symbolHandle method_signature (THREAD, pool->signature_ref_at(index));
 229   KlassHandle  current_klass(THREAD, pool->pool_holder());
 230 
 231   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
 232 }
 233 
 234 void LinkResolver::resolve_dynamic_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) {
 235   // The class is java.dyn.MethodHandle
 236   resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
 237 
 238   symbolHandle method_name = vmSymbolHandles::invoke_name();
 239 
 240   symbolHandle method_signature(THREAD, pool->signature_ref_at(index));
 241   KlassHandle  current_klass   (THREAD, pool->pool_holder());
 242 
 243   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
 244 }
 245 
 246 void LinkResolver::resolve_interface_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) {
 247 
 248   // resolve klass
 249   resolve_klass(resolved_klass, pool, index, CHECK);
 250   symbolHandle method_name      (THREAD, pool->name_ref_at(index));
 251   symbolHandle method_signature (THREAD, pool->signature_ref_at(index));
 252   KlassHandle  current_klass(THREAD, pool->pool_holder());
 253 
 254   resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
 255 }
 256 
 257 
 258 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
 259                                   symbolHandle method_name, symbolHandle method_signature,
 260                                   KlassHandle current_klass, bool check_access, TRAPS) {
 261 
 262   // 1. check if klass is not interface
 263   if (resolved_klass->is_interface()) {
 264     char buf[200];
 265     jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", Klass::cast(resolved_klass())->external_name());


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