Print this page


Split Close
Expand all
Collapse all
          --- old/src/share/vm/prims/methodHandles.cpp
          +++ new/src/share/vm/prims/methodHandles.cpp
↓ open down ↓ 103 lines elided ↑ open up ↑
 104  104    assert(!strcmp(entry_name(_adapter_ricochet), "adapter_ricochet"), "");
 105  105    assert(!strcmp(entry_name(_adapter_opt_unboxi), "adapter_ref_to_prim/unboxi"), "");
 106  106    return true;
 107  107  }
 108  108  #endif
 109  109  
 110  110  
 111  111  //------------------------------------------------------------------------------
 112  112  // MethodHandles::generate_adapters
 113  113  //
 114      -void MethodHandles::generate_adapters(TRAPS) {
      114 +void MethodHandles::generate_adapters() {
 115  115    if (!EnableMethodHandles || SystemDictionary::MethodHandle_klass() == NULL)  return;
 116  116  
 117  117    assert(_adapter_code == NULL, "generate only once");
 118  118  
 119  119    ResourceMark rm;
 120  120    TraceTime timer("MethodHandles adapters generation", TraceStartupTime);
 121  121    _adapter_code = MethodHandlesAdapterBlob::create(_adapter_code_size);
 122  122    if (_adapter_code == NULL)
 123  123      vm_exit_out_of_memory(_adapter_code_size, "CodeCache: no room for MethodHandles adapters");
 124  124    CodeBuffer code(_adapter_code);
 125  125    MethodHandlesAdapterGenerator g(&code);
 126      -  g.generate(CHECK);
      126 +  g.generate();
 127  127  }
 128  128  
 129  129  
 130  130  //------------------------------------------------------------------------------
 131  131  // MethodHandlesAdapterGenerator::generate
 132  132  //
 133      -void MethodHandlesAdapterGenerator::generate(TRAPS) {
      133 +void MethodHandlesAdapterGenerator::generate() {
 134  134    // Generate generic method handle adapters.
 135  135    for (MethodHandles::EntryKind ek = MethodHandles::_EK_FIRST;
 136  136         ek < MethodHandles::_EK_LIMIT;
 137  137         ek = MethodHandles::EntryKind(1 + (int)ek)) {
 138  138      StubCodeMark mark(this, "MethodHandle", MethodHandles::entry_name(ek));
 139      -    MethodHandles::generate_method_handle_stub(_masm, ek, CHECK);
      139 +    MethodHandles::generate_method_handle_stub(_masm, ek);
 140  140    }
 141  141  }
 142  142  
 143  143  
 144  144  void MethodHandles::set_enabled(bool z) {
 145  145    if (_enabled != z) {
 146  146      guarantee(z && EnableMethodHandles, "can only enable once, and only if -XX:+EnableMethodHandles");
 147  147      _enabled = z;
 148  148    }
 149  149  }
↓ open down ↓ 2464 lines elided ↑ open up ↑
2614 2614        symbolHandle raiseException_name = oopFactory::new_symbol_handle("raiseException", CHECK);
2615 2615        symbolHandle raiseException_sig  = oopFactory::new_symbol_handle("(ILjava/lang/Object;Ljava/lang/Object;)V", CHECK);
2616 2616        methodOop raiseException_method  = instanceKlass::cast(MHI_klass->as_klassOop())
2617 2617                      ->find_method(raiseException_name(), raiseException_sig());
2618 2618        if (raiseException_method != NULL && raiseException_method->is_static()) {
2619 2619          MethodHandles::set_raise_exception_method(raiseException_method);
2620 2620        } else {
2621 2621          warning("JSR 292 method handle code is mismatched to this JVM.  Disabling support.");
2622 2622          enable_MH = false;
2623 2623        }
     2624 +    } else {
     2625 +      enable_MH = false;
2624 2626      }
2625 2627    }
2626 2628  
2627 2629    if (enable_MH) {
     2630 +    // We need to link the MethodHandleImpl klass before we generate
     2631 +    // the method handle adapters as the _raise_exception adapter uses
     2632 +    // one of its methods (and its c2i-adapter).
     2633 +    KlassHandle    k  = SystemDictionaryHandles::MethodHandleImpl_klass();
     2634 +    instanceKlass* ik = instanceKlass::cast(k());
     2635 +    ik->link_class(CHECK);
     2636 +
     2637 +    MethodHandles::generate_adapters();
2628 2638      MethodHandles::set_enabled(true);
2629 2639    }
2630 2640  
2631 2641    if (!EnableInvokeDynamic) {
2632 2642      warning("JSR 292 invokedynamic is disabled in this JVM.  Use -XX:+UnlockExperimentalVMOptions -XX:+EnableInvokeDynamic to enable.");
2633 2643      return;  // bind nothing
2634 2644    }
2635 2645  
2636 2646    {
2637 2647      ThreadToNativeFromVM ttnfv(thread);
2638 2648  
2639 2649      int status = env->RegisterNatives(MHN_class, methods2, sizeof(methods2)/sizeof(JNINativeMethod));
2640 2650      if (env->ExceptionOccurred()) {
2641 2651        MethodHandles::set_enabled(false);
2642 2652        warning("JSR 292 method handle code is mismatched to this JVM.  Disabling support.");
2643 2653        env->ExceptionClear();
2644 2654      } else {
2645 2655        MethodHandles::set_enabled(true);
2646 2656      }
2647 2657    }
2648      -
2649      -  // Generate method handles adapters if enabled.
2650      -  if (MethodHandles::enabled()) {
2651      -    MethodHandles::generate_adapters(CHECK);
2652      -  }
2653 2658  }
2654 2659  JVM_END
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX