hotspot/src/share/vm/prims/methodHandles.cpp
changeset 5050 47ecd86932ce
parent 4571 80b553bddc26
child 5420 586d3988e72b
equal deleted inserted replaced
5049:cdeb352c6bbe 5050:47ecd86932ce
     1 /*
     1 /*
     2  * Copyright 2008-2009 Sun Microsystems, Inc.  All Rights Reserved.
     2  * Copyright 2008-2010 Sun Microsystems, Inc.  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.
    80   "adapter_spread_args/more",
    80   "adapter_spread_args/more",
    81 
    81 
    82   NULL
    82   NULL
    83 };
    83 };
    84 
    84 
       
    85 // Adapters.
       
    86 MethodHandlesAdapterBlob* MethodHandles::_adapter_code      = NULL;
       
    87 int                       MethodHandles::_adapter_code_size = StubRoutines::method_handles_adapters_code_size;
       
    88 
    85 jobject MethodHandles::_raise_exception_method;
    89 jobject MethodHandles::_raise_exception_method;
    86 
    90 
    87 #ifdef ASSERT
    91 #ifdef ASSERT
    88 bool MethodHandles::spot_check_entry_names() {
    92 bool MethodHandles::spot_check_entry_names() {
    89   assert(!strcmp(entry_name(_invokestatic_mh), "invokestatic"), "");
    93   assert(!strcmp(entry_name(_invokestatic_mh), "invokestatic"), "");
    92   assert(!strcmp(entry_name(_adapter_ricochet), "adapter_ricochet"), "");
    96   assert(!strcmp(entry_name(_adapter_ricochet), "adapter_ricochet"), "");
    93   assert(!strcmp(entry_name(_adapter_opt_unboxi), "adapter_ref_to_prim/unboxi"), "");
    97   assert(!strcmp(entry_name(_adapter_opt_unboxi), "adapter_ref_to_prim/unboxi"), "");
    94   return true;
    98   return true;
    95 }
    99 }
    96 #endif
   100 #endif
       
   101 
       
   102 
       
   103 //------------------------------------------------------------------------------
       
   104 // MethodHandles::generate_adapters
       
   105 //
       
   106 void MethodHandles::generate_adapters() {
       
   107   if (!EnableMethodHandles || SystemDictionary::MethodHandle_klass() == NULL)  return;
       
   108 
       
   109   assert(_adapter_code == NULL, "generate only once");
       
   110 
       
   111   ResourceMark rm;
       
   112   TraceTime timer("MethodHandles adapters generation", TraceStartupTime);
       
   113   _adapter_code = MethodHandlesAdapterBlob::create(_adapter_code_size);
       
   114   if (_adapter_code == NULL)
       
   115     vm_exit_out_of_memory(_adapter_code_size, "CodeCache: no room for MethodHandles adapters");
       
   116   CodeBuffer code(_adapter_code->instructions_begin(), _adapter_code->instructions_size());
       
   117 
       
   118   MethodHandlesAdapterGenerator g(&code);
       
   119   g.generate();
       
   120 }
       
   121 
       
   122 
       
   123 //------------------------------------------------------------------------------
       
   124 // MethodHandlesAdapterGenerator::generate
       
   125 //
       
   126 void MethodHandlesAdapterGenerator::generate() {
       
   127   // Generate generic method handle adapters.
       
   128   for (MethodHandles::EntryKind ek = MethodHandles::_EK_FIRST;
       
   129        ek < MethodHandles::_EK_LIMIT;
       
   130        ek = MethodHandles::EntryKind(1 + (int)ek)) {
       
   131     StubCodeMark mark(this, "MethodHandle", MethodHandles::entry_name(ek));
       
   132     MethodHandles::generate_method_handle_stub(_masm, ek);
       
   133   }
       
   134 }
       
   135 
    97 
   136 
    98 void MethodHandles::set_enabled(bool z) {
   137 void MethodHandles::set_enabled(bool z) {
    99   if (_enabled != z) {
   138   if (_enabled != z) {
   100     guarantee(z && EnableMethodHandles, "can only enable once, and only if -XX:+EnableMethodHandles");
   139     guarantee(z && EnableMethodHandles, "can only enable once, and only if -XX:+EnableMethodHandles");
   101     _enabled = z;
   140     _enabled = z;