methodHandles.cpp revision 10061:197538942788
1/*
2 * Copyright (c) 2008, 2015, 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 *
23 */
24
25#include "precompiled.hpp"
26#include "classfile/javaClasses.inline.hpp"
27#include "classfile/stringTable.hpp"
28#include "code/codeCache.hpp"
29#include "code/codeCacheExtensions.hpp"
30#include "code/dependencyContext.hpp"
31#include "compiler/compileBroker.hpp"
32#include "interpreter/interpreter.hpp"
33#include "interpreter/oopMapCache.hpp"
34#include "interpreter/linkResolver.hpp"
35#include "memory/allocation.inline.hpp"
36#include "memory/oopFactory.hpp"
37#include "oops/objArrayOop.inline.hpp"
38#include "oops/oop.inline.hpp"
39#include "prims/methodHandles.hpp"
40#include "prims/jvmtiRedefineClassesTrace.hpp"
41#include "runtime/compilationPolicy.hpp"
42#include "runtime/javaCalls.hpp"
43#include "runtime/reflection.hpp"
44#include "runtime/signature.hpp"
45#include "runtime/stubRoutines.hpp"
46#include "utilities/exceptions.hpp"
47
48
49/*
50 * JSR 292 reference implementation: method handles
51 * The JDK 7 reference implementation represented method handle
52 * combinations as chains.  Each link in the chain had a "vmentry"
53 * field which pointed at a bit of assembly code which performed
54 * one transformation before dispatching to the next link in the chain.
55 *
56 * The current reference implementation pushes almost all code generation
57 * responsibility to (trusted) Java code.  A method handle contains a
58 * pointer to its "LambdaForm", which embodies all details of the method
59 * handle's behavior.  The LambdaForm is a normal Java object, managed
60 * by a runtime coded in Java.
61 */
62
63bool MethodHandles::_enabled = false; // set true after successful native linkage
64MethodHandlesAdapterBlob* MethodHandles::_adapter_code = NULL;
65
66
67/**
68 * Generates method handle adapters. Returns 'false' if memory allocation
69 * failed and true otherwise.
70 */
71bool MethodHandles::generate_adapters() {
72  if (SystemDictionary::MethodHandle_klass() == NULL) {
73    return true;
74  }
75
76  assert(_adapter_code == NULL, "generate only once");
77
78  ResourceMark rm;
79  TraceTime timer("MethodHandles adapters generation", TraceStartupTime);
80  _adapter_code = MethodHandlesAdapterBlob::create(adapter_code_size);
81  if (_adapter_code == NULL) {
82     return false;
83  }
84
85  CodeBuffer code(_adapter_code);
86  MethodHandlesAdapterGenerator g(&code);
87  g.generate();
88  code.log_section_sizes("MethodHandlesAdapterBlob");
89  return true;
90}
91
92//------------------------------------------------------------------------------
93// MethodHandlesAdapterGenerator::generate
94//
95void MethodHandlesAdapterGenerator::generate() {
96  // Generate generic method handle adapters.
97  // Generate interpreter entries
98  for (Interpreter::MethodKind mk = Interpreter::method_handle_invoke_FIRST;
99       mk <= Interpreter::method_handle_invoke_LAST;
100       mk = Interpreter::MethodKind(1 + (int)mk)) {
101    vmIntrinsics::ID iid = Interpreter::method_handle_intrinsic(mk);
102    StubCodeMark mark(this, "MethodHandle::interpreter_entry", vmIntrinsics::name_at(iid));
103    address entry = MethodHandles::generate_method_handle_interpreter_entry(_masm, iid);
104    if (entry != NULL) {
105      CodeCacheExtensions::handle_generated_pc(entry, vmIntrinsics::name_at(iid));
106      Interpreter::set_entry_for_kind(mk, entry);
107    }
108    // If the entry is not set, it will throw AbstractMethodError.
109  }
110}
111
112void MethodHandles::set_enabled(bool z) {
113  if (_enabled != z) {
114    guarantee(z, "can only enable once");
115    _enabled = z;
116  }
117}
118
119// MemberName support
120
121// import java_lang_invoke_MemberName.*
122enum {
123  IS_METHOD            = java_lang_invoke_MemberName::MN_IS_METHOD,
124  IS_CONSTRUCTOR       = java_lang_invoke_MemberName::MN_IS_CONSTRUCTOR,
125  IS_FIELD             = java_lang_invoke_MemberName::MN_IS_FIELD,
126  IS_TYPE              = java_lang_invoke_MemberName::MN_IS_TYPE,
127  CALLER_SENSITIVE     = java_lang_invoke_MemberName::MN_CALLER_SENSITIVE,
128  REFERENCE_KIND_SHIFT = java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT,
129  REFERENCE_KIND_MASK  = java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK,
130  SEARCH_SUPERCLASSES  = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES,
131  SEARCH_INTERFACES    = java_lang_invoke_MemberName::MN_SEARCH_INTERFACES,
132  ALL_KINDS      = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE
133};
134
135Handle MethodHandles::new_MemberName(TRAPS) {
136  Handle empty;
137  instanceKlassHandle k(THREAD, SystemDictionary::MemberName_klass());
138  if (!k->is_initialized())  k->initialize(CHECK_(empty));
139  return Handle(THREAD, k->allocate_instance(THREAD));
140}
141
142oop MethodHandles::init_MemberName(Handle mname, Handle target) {
143  // This method is used from java.lang.invoke.MemberName constructors.
144  // It fills in the new MemberName from a java.lang.reflect.Member.
145  Thread* thread = Thread::current();
146  oop target_oop = target();
147  Klass* target_klass = target_oop->klass();
148  if (target_klass == SystemDictionary::reflect_Field_klass()) {
149    oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder()
150    int slot  = java_lang_reflect_Field::slot(target_oop);  // fd.index()
151    KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
152    if (!k.is_null() && k->is_instance_klass()) {
153      fieldDescriptor fd(InstanceKlass::cast(k()), slot);
154      oop mname2 = init_field_MemberName(mname, fd);
155      if (mname2 != NULL) {
156        // Since we have the reified name and type handy, add them to the result.
157        if (java_lang_invoke_MemberName::name(mname2) == NULL)
158          java_lang_invoke_MemberName::set_name(mname2, java_lang_reflect_Field::name(target_oop));
159        if (java_lang_invoke_MemberName::type(mname2) == NULL)
160          java_lang_invoke_MemberName::set_type(mname2, java_lang_reflect_Field::type(target_oop));
161      }
162      return mname2;
163    }
164  } else if (target_klass == SystemDictionary::reflect_Method_klass()) {
165    oop clazz  = java_lang_reflect_Method::clazz(target_oop);
166    int slot   = java_lang_reflect_Method::slot(target_oop);
167    KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
168    if (!k.is_null() && k->is_instance_klass()) {
169      Method* m = InstanceKlass::cast(k())->method_with_idnum(slot);
170      if (m == NULL || is_signature_polymorphic(m->intrinsic_id()))
171        return NULL;            // do not resolve unless there is a concrete signature
172      CallInfo info(m, k());
173      return init_method_MemberName(mname, info);
174    }
175  } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) {
176    oop clazz  = java_lang_reflect_Constructor::clazz(target_oop);
177    int slot   = java_lang_reflect_Constructor::slot(target_oop);
178    KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
179    if (!k.is_null() && k->is_instance_klass()) {
180      Method* m = InstanceKlass::cast(k())->method_with_idnum(slot);
181      if (m == NULL)  return NULL;
182      CallInfo info(m, k());
183      return init_method_MemberName(mname, info);
184    }
185  }
186  return NULL;
187}
188
189oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) {
190  assert(info.resolved_appendix().is_null(), "only normal methods here");
191  methodHandle m = info.resolved_method();
192  assert(m.not_null(), "null method handle");
193  KlassHandle m_klass = m->method_holder();
194  assert(m.not_null(), "null holder for method handle");
195  int flags = (jushort)( m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS );
196  int vmindex = Method::invalid_vtable_index;
197
198  switch (info.call_kind()) {
199  case CallInfo::itable_call:
200    vmindex = info.itable_index();
201    // More importantly, the itable index only works with the method holder.
202    assert(m_klass->verify_itable_index(vmindex), "");
203    flags |= IS_METHOD | (JVM_REF_invokeInterface << REFERENCE_KIND_SHIFT);
204    if (TraceInvokeDynamic) {
205      ttyLocker ttyl;
206      ResourceMark rm;
207      tty->print_cr("memberName: invokeinterface method_holder::method: %s, itableindex: %d, access_flags:",
208            Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
209            vmindex);
210       m->access_flags().print_on(tty);
211       if (!m->is_abstract()) {
212         tty->print("default");
213       }
214       tty->cr();
215    }
216    break;
217
218  case CallInfo::vtable_call:
219    vmindex = info.vtable_index();
220    flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT);
221    assert(info.resolved_klass()->is_subtype_of(m_klass()), "virtual call must be type-safe");
222    if (m_klass->is_interface()) {
223      // This is a vtable call to an interface method (abstract "miranda method" or default method).
224      // The vtable index is meaningless without a class (not interface) receiver type, so get one.
225      // (LinkResolver should help us figure this out.)
226      KlassHandle m_klass_non_interface = info.resolved_klass();
227      if (m_klass_non_interface->is_interface()) {
228        m_klass_non_interface = SystemDictionary::Object_klass();
229#ifdef ASSERT
230        { ResourceMark rm;
231          Method* m2 = m_klass_non_interface->vtable()->method_at(vmindex);
232          assert(m->name() == m2->name() && m->signature() == m2->signature(),
233                 "at %d, %s != %s", vmindex,
234                 m->name_and_sig_as_C_string(), m2->name_and_sig_as_C_string());
235        }
236#endif //ASSERT
237      }
238      if (!m->is_public()) {
239        assert(m->is_public(), "virtual call must be to public interface method");
240        return NULL;  // elicit an error later in product build
241      }
242      assert(info.resolved_klass()->is_subtype_of(m_klass_non_interface()), "virtual call must be type-safe");
243      m_klass = m_klass_non_interface;
244    }
245    if (TraceInvokeDynamic) {
246      ttyLocker ttyl;
247      ResourceMark rm;
248      tty->print_cr("memberName: invokevirtual method_holder::method: %s, receiver: %s, vtableindex: %d, access_flags:",
249            Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
250            m_klass->internal_name(), vmindex);
251       m->access_flags().print_on(tty);
252       if (m->is_default_method()) {
253         tty->print("default");
254       }
255       tty->cr();
256    }
257    break;
258
259  case CallInfo::direct_call:
260    vmindex = Method::nonvirtual_vtable_index;
261    if (m->is_static()) {
262      flags |= IS_METHOD      | (JVM_REF_invokeStatic  << REFERENCE_KIND_SHIFT);
263    } else if (m->is_initializer()) {
264      flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
265    } else {
266      flags |= IS_METHOD      | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
267    }
268    break;
269
270  default:  assert(false, "bad CallInfo");  return NULL;
271  }
272
273  // @CallerSensitive annotation detected
274  if (m->caller_sensitive()) {
275    flags |= CALLER_SENSITIVE;
276  }
277
278  oop mname_oop = mname();
279  java_lang_invoke_MemberName::set_flags(   mname_oop, flags);
280  java_lang_invoke_MemberName::set_vmtarget(mname_oop, m());
281  java_lang_invoke_MemberName::set_vmindex( mname_oop, vmindex);   // vtable/itable index
282  java_lang_invoke_MemberName::set_clazz(   mname_oop, m_klass->java_mirror());
283  // Note:  name and type can be lazily computed by resolve_MemberName,
284  // if Java code needs them as resolved String and MethodType objects.
285  // The clazz must be eagerly stored, because it provides a GC
286  // root to help keep alive the Method*.
287  // If relevant, the vtable or itable value is stored as vmindex.
288  // This is done eagerly, since it is readily available without
289  // constructing any new objects.
290  // TO DO: maybe intern mname_oop
291  if (m->method_holder()->add_member_name(mname)) {
292    return mname();
293  } else {
294    // Redefinition caused this to fail.  Return NULL (and an exception?)
295    return NULL;
296  }
297}
298
299oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
300  int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
301  flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
302  if (is_setter)  flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT);
303  Metadata* vmtarget = fd.field_holder();
304  int vmindex        = fd.offset();  // determines the field uniquely when combined with static bit
305  oop mname_oop = mname();
306  java_lang_invoke_MemberName::set_flags(mname_oop,    flags);
307  java_lang_invoke_MemberName::set_vmtarget(mname_oop, vmtarget);
308  java_lang_invoke_MemberName::set_vmindex(mname_oop,  vmindex);
309  java_lang_invoke_MemberName::set_clazz(mname_oop,    fd.field_holder()->java_mirror());
310  oop type = field_signature_type_or_null(fd.signature());
311  oop name = field_name_or_null(fd.name());
312  if (name != NULL)
313    java_lang_invoke_MemberName::set_name(mname_oop,   name);
314  if (type != NULL)
315    java_lang_invoke_MemberName::set_type(mname_oop,   type);
316  // Note:  name and type can be lazily computed by resolve_MemberName,
317  // if Java code needs them as resolved String and Class objects.
318  // Note that the incoming type oop might be pre-resolved (non-null).
319  // The base clazz and field offset (vmindex) must be eagerly stored,
320  // because they unambiguously identify the field.
321  // Although the fieldDescriptor::_index would also identify the field,
322  // we do not use it, because it is harder to decode.
323  // TO DO: maybe intern mname_oop
324  return mname();
325}
326
327// JVM 2.9 Special Methods:
328// A method is signature polymorphic if and only if all of the following conditions hold :
329// * It is declared in the java.lang.invoke.MethodHandle class.
330// * It has a single formal parameter of type Object[].
331// * It has a return type of Object.
332// * It has the ACC_VARARGS and ACC_NATIVE flags set.
333bool MethodHandles::is_method_handle_invoke_name(Klass* klass, Symbol* name) {
334  if (klass == NULL)
335    return false;
336  // The following test will fail spuriously during bootstrap of MethodHandle itself:
337  //    if (klass != SystemDictionary::MethodHandle_klass())
338  // Test the name instead:
339  if (klass->name() != vmSymbols::java_lang_invoke_MethodHandle())
340    return false;
341  Symbol* poly_sig = vmSymbols::object_array_object_signature();
342  Method* m = InstanceKlass::cast(klass)->find_method(name, poly_sig);
343  if (m == NULL)  return false;
344  int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS;
345  int flags = m->access_flags().as_int();
346  return (flags & required) == required;
347}
348
349
350Symbol* MethodHandles::signature_polymorphic_intrinsic_name(vmIntrinsics::ID iid) {
351  assert(is_signature_polymorphic_intrinsic(iid), "%d %s", iid, vmIntrinsics::name_at(iid));
352  switch (iid) {
353  case vmIntrinsics::_invokeBasic:      return vmSymbols::invokeBasic_name();
354  case vmIntrinsics::_linkToVirtual:    return vmSymbols::linkToVirtual_name();
355  case vmIntrinsics::_linkToStatic:     return vmSymbols::linkToStatic_name();
356  case vmIntrinsics::_linkToSpecial:    return vmSymbols::linkToSpecial_name();
357  case vmIntrinsics::_linkToInterface:  return vmSymbols::linkToInterface_name();
358  }
359  fatal("unexpected intrinsic id: %d %s", iid, vmIntrinsics::name_at(iid));
360  return 0;
361}
362
363Bytecodes::Code MethodHandles::signature_polymorphic_intrinsic_bytecode(vmIntrinsics::ID id) {
364  switch(id) {
365    case vmIntrinsics::_linkToVirtual:   return Bytecodes::_invokevirtual;
366    case vmIntrinsics::_linkToInterface: return Bytecodes::_invokeinterface;
367    case vmIntrinsics::_linkToStatic:    return Bytecodes::_invokestatic;
368    case vmIntrinsics::_linkToSpecial:   return Bytecodes::_invokespecial;
369    case vmIntrinsics::_invokeBasic:     return Bytecodes::_invokehandle;
370    default:
371      fatal("unexpected id: (%d) %s", (uint)id, vmIntrinsics::name_at(id));
372      return Bytecodes::_illegal;
373  }
374}
375
376int MethodHandles::signature_polymorphic_intrinsic_ref_kind(vmIntrinsics::ID iid) {
377  switch (iid) {
378  case vmIntrinsics::_invokeBasic:      return 0;
379  case vmIntrinsics::_linkToVirtual:    return JVM_REF_invokeVirtual;
380  case vmIntrinsics::_linkToStatic:     return JVM_REF_invokeStatic;
381  case vmIntrinsics::_linkToSpecial:    return JVM_REF_invokeSpecial;
382  case vmIntrinsics::_linkToInterface:  return JVM_REF_invokeInterface;
383  }
384  fatal("unexpected intrinsic id: %d %s", iid, vmIntrinsics::name_at(iid));
385  return 0;
386}
387
388vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Symbol* name) {
389  vmSymbols::SID name_id = vmSymbols::find_sid(name);
390  switch (name_id) {
391  // The ID _invokeGeneric stands for all non-static signature-polymorphic methods, except built-ins.
392  case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name):           return vmIntrinsics::_invokeGeneric;
393  // The only built-in non-static signature-polymorphic method is MethodHandle.invokeBasic:
394  case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeBasic_name):      return vmIntrinsics::_invokeBasic;
395
396  // There is one static signature-polymorphic method for each JVM invocation mode.
397  case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToVirtual_name):    return vmIntrinsics::_linkToVirtual;
398  case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToStatic_name):     return vmIntrinsics::_linkToStatic;
399  case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToSpecial_name):    return vmIntrinsics::_linkToSpecial;
400  case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToInterface_name):  return vmIntrinsics::_linkToInterface;
401  }
402
403  // Cover the case of invokeExact and any future variants of invokeFoo.
404  Klass* mh_klass = SystemDictionary::well_known_klass(
405                              SystemDictionary::WK_KLASS_ENUM_NAME(MethodHandle_klass) );
406  if (mh_klass != NULL && is_method_handle_invoke_name(mh_klass, name))
407    return vmIntrinsics::_invokeGeneric;
408
409  // Note: The pseudo-intrinsic _compiledLambdaForm is never linked against.
410  // Instead it is used to mark lambda forms bound to invokehandle or invokedynamic.
411  return vmIntrinsics::_none;
412}
413
414vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Klass* klass, Symbol* name) {
415  if (klass != NULL &&
416      klass->name() == vmSymbols::java_lang_invoke_MethodHandle()) {
417    vmIntrinsics::ID iid = signature_polymorphic_name_id(name);
418    if (iid != vmIntrinsics::_none)
419      return iid;
420    if (is_method_handle_invoke_name(klass, name))
421      return vmIntrinsics::_invokeGeneric;
422  }
423  return vmIntrinsics::_none;
424}
425
426
427// convert the external string or reflective type to an internal signature
428Symbol* MethodHandles::lookup_signature(oop type_str, bool intern_if_not_found, TRAPS) {
429  if (java_lang_invoke_MethodType::is_instance(type_str)) {
430    return java_lang_invoke_MethodType::as_signature(type_str, intern_if_not_found, THREAD);
431  } else if (java_lang_Class::is_instance(type_str)) {
432    return java_lang_Class::as_signature(type_str, false, THREAD);
433  } else if (java_lang_String::is_instance_inlined(type_str)) {
434    if (intern_if_not_found) {
435      return java_lang_String::as_symbol(type_str, THREAD);
436    } else {
437      return java_lang_String::as_symbol_or_null(type_str);
438    }
439  } else {
440    THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized type", NULL);
441  }
442}
443
444static const char OBJ_SIG[] = "Ljava/lang/Object;";
445enum { OBJ_SIG_LEN = 18 };
446
447bool MethodHandles::is_basic_type_signature(Symbol* sig) {
448  assert(vmSymbols::object_signature()->utf8_length() == (int)OBJ_SIG_LEN, "");
449  assert(vmSymbols::object_signature()->equals(OBJ_SIG), "");
450  const int len = sig->utf8_length();
451  for (int i = 0; i < len; i++) {
452    switch (sig->byte_at(i)) {
453    case 'L':
454      // only java/lang/Object is valid here
455      if (sig->index_of_at(i, OBJ_SIG, OBJ_SIG_LEN) != i)
456        return false;
457      i += OBJ_SIG_LEN-1;  //-1 because of i++ in loop
458      continue;
459    case '(': case ')': case 'V':
460    case 'I': case 'J': case 'F': case 'D':
461      continue;
462    //case '[':
463    //case 'Z': case 'B': case 'C': case 'S':
464    default:
465      return false;
466    }
467  }
468  return true;
469}
470
471Symbol* MethodHandles::lookup_basic_type_signature(Symbol* sig, bool keep_last_arg, TRAPS) {
472  Symbol* bsig = NULL;
473  if (sig == NULL) {
474    return sig;
475  } else if (is_basic_type_signature(sig)) {
476    sig->increment_refcount();
477    return sig;  // that was easy
478  } else if (sig->byte_at(0) != '(') {
479    BasicType bt = char2type(sig->byte_at(0));
480    if (is_subword_type(bt)) {
481      bsig = vmSymbols::int_signature();
482    } else {
483      assert(bt == T_OBJECT || bt == T_ARRAY, "is_basic_type_signature was false");
484      bsig = vmSymbols::object_signature();
485    }
486  } else {
487    ResourceMark rm;
488    stringStream buffer(128);
489    buffer.put('(');
490    int arg_pos = 0, keep_arg_pos = -1;
491    if (keep_last_arg)
492      keep_arg_pos = ArgumentCount(sig).size() - 1;
493    for (SignatureStream ss(sig); !ss.is_done(); ss.next()) {
494      BasicType bt = ss.type();
495      size_t this_arg_pos = buffer.size();
496      if (ss.at_return_type()) {
497        buffer.put(')');
498      }
499      if (arg_pos == keep_arg_pos) {
500        buffer.write((char*) ss.raw_bytes(),
501                     (int)   ss.raw_length());
502      } else if (bt == T_OBJECT || bt == T_ARRAY) {
503        buffer.write(OBJ_SIG, OBJ_SIG_LEN);
504      } else {
505        if (is_subword_type(bt))
506          bt = T_INT;
507        buffer.put(type2char(bt));
508      }
509      arg_pos++;
510    }
511    const char* sigstr =       buffer.base();
512    int         siglen = (int) buffer.size();
513    bsig = SymbolTable::new_symbol(sigstr, siglen, THREAD);
514  }
515  assert(is_basic_type_signature(bsig) ||
516         // detune assert in case the injected argument is not a basic type:
517         keep_last_arg, "");
518  return bsig;
519}
520
521void MethodHandles::print_as_basic_type_signature_on(outputStream* st,
522                                                     Symbol* sig,
523                                                     bool keep_arrays,
524                                                     bool keep_basic_names) {
525  st = st ? st : tty;
526  int len  = sig->utf8_length();
527  int array = 0;
528  bool prev_type = false;
529  for (int i = 0; i < len; i++) {
530    char ch = sig->byte_at(i);
531    switch (ch) {
532    case '(': case ')':
533      prev_type = false;
534      st->put(ch);
535      continue;
536    case '[':
537      if (!keep_basic_names && keep_arrays)
538        st->put(ch);
539      array++;
540      continue;
541    case 'L':
542      {
543        if (prev_type)  st->put(',');
544        int start = i+1, slash = start;
545        while (++i < len && (ch = sig->byte_at(i)) != ';') {
546          if (ch == '/' || ch == '.' || ch == '$')  slash = i+1;
547        }
548        if (slash < i)  start = slash;
549        if (!keep_basic_names) {
550          st->put('L');
551        } else {
552          for (int j = start; j < i; j++)
553            st->put(sig->byte_at(j));
554          prev_type = true;
555        }
556        break;
557      }
558    default:
559      {
560        if (array && char2type(ch) != T_ILLEGAL && !keep_arrays) {
561          ch = '[';
562          array = 0;
563        }
564        if (prev_type)  st->put(',');
565        const char* n = NULL;
566        if (keep_basic_names)
567          n = type2name(char2type(ch));
568        if (n == NULL) {
569          // unknown letter, or we don't want to know its name
570          st->put(ch);
571        } else {
572          st->print("%s", n);
573          prev_type = true;
574        }
575        break;
576      }
577    }
578    // Switch break goes here to take care of array suffix:
579    if (prev_type) {
580      while (array > 0) {
581        st->print("[]");
582        --array;
583      }
584    }
585    array = 0;
586  }
587}
588
589
590
591static oop object_java_mirror() {
592  return SystemDictionary::Object_klass()->java_mirror();
593}
594
595oop MethodHandles::field_name_or_null(Symbol* s) {
596  if (s == NULL)  return NULL;
597  return StringTable::lookup(s);
598}
599
600oop MethodHandles::field_signature_type_or_null(Symbol* s) {
601  if (s == NULL)  return NULL;
602  BasicType bt = FieldType::basic_type(s);
603  if (is_java_primitive(bt)) {
604    assert(s->utf8_length() == 1, "");
605    return java_lang_Class::primitive_mirror(bt);
606  }
607  // Here are some more short cuts for common types.
608  // They are optional, since reference types can be resolved lazily.
609  if (bt == T_OBJECT) {
610    if (s == vmSymbols::object_signature()) {
611      return object_java_mirror();
612    } else if (s == vmSymbols::class_signature()) {
613      return SystemDictionary::Class_klass()->java_mirror();
614    } else if (s == vmSymbols::string_signature()) {
615      return SystemDictionary::String_klass()->java_mirror();
616    }
617  }
618  return NULL;
619}
620
621
622// An unresolved member name is a mere symbolic reference.
623// Resolving it plants a vmtarget/vmindex in it,
624// which refers directly to JVM internals.
625Handle MethodHandles::resolve_MemberName(Handle mname, KlassHandle caller, TRAPS) {
626  Handle empty;
627  assert(java_lang_invoke_MemberName::is_instance(mname()), "");
628
629  if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) {
630    // Already resolved.
631    DEBUG_ONLY(int vmindex = java_lang_invoke_MemberName::vmindex(mname()));
632    assert(vmindex >= Method::nonvirtual_vtable_index, "");
633    return mname;
634  }
635
636  Handle defc_oop(THREAD, java_lang_invoke_MemberName::clazz(mname()));
637  Handle name_str(THREAD, java_lang_invoke_MemberName::name( mname()));
638  Handle type_str(THREAD, java_lang_invoke_MemberName::type( mname()));
639  int    flags    =       java_lang_invoke_MemberName::flags(mname());
640  int    ref_kind =       (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
641  if (!ref_kind_is_valid(ref_kind)) {
642    THROW_MSG_(vmSymbols::java_lang_InternalError(), "obsolete MemberName format", empty);
643  }
644
645  DEBUG_ONLY(int old_vmindex);
646  assert((old_vmindex = java_lang_invoke_MemberName::vmindex(mname())) == 0, "clean input");
647
648  if (defc_oop.is_null() || name_str.is_null() || type_str.is_null()) {
649    THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "nothing to resolve", empty);
650  }
651
652  instanceKlassHandle defc;
653  {
654    Klass* defc_klass = java_lang_Class::as_Klass(defc_oop());
655    if (defc_klass == NULL)  return empty;  // a primitive; no resolution possible
656    if (!defc_klass->is_instance_klass()) {
657      if (!defc_klass->is_array_klass())  return empty;
658      defc_klass = SystemDictionary::Object_klass();
659    }
660    defc = instanceKlassHandle(THREAD, defc_klass);
661  }
662  if (defc.is_null()) {
663    THROW_MSG_(vmSymbols::java_lang_InternalError(), "primitive class", empty);
664  }
665  defc->link_class(CHECK_(empty));  // possible safepoint
666
667  // convert the external string name to an internal symbol
668  TempNewSymbol name = java_lang_String::as_symbol_or_null(name_str());
669  if (name == NULL)  return empty;  // no such name
670  if (name == vmSymbols::class_initializer_name())
671    return empty; // illegal name
672
673  vmIntrinsics::ID mh_invoke_id = vmIntrinsics::_none;
674  if ((flags & ALL_KINDS) == IS_METHOD &&
675      (defc() == SystemDictionary::MethodHandle_klass()) &&
676      (ref_kind == JVM_REF_invokeVirtual ||
677       ref_kind == JVM_REF_invokeSpecial ||
678       // static invocation mode is required for _linkToVirtual, etc.:
679       ref_kind == JVM_REF_invokeStatic)) {
680    vmIntrinsics::ID iid = signature_polymorphic_name_id(name);
681    if (iid != vmIntrinsics::_none &&
682        ((ref_kind == JVM_REF_invokeStatic) == is_signature_polymorphic_static(iid))) {
683      // Virtual methods invoke and invokeExact, plus internal invokers like _invokeBasic.
684      // For a static reference it could an internal linkage routine like _linkToVirtual, etc.
685      mh_invoke_id = iid;
686    }
687  }
688
689  // convert the external string or reflective type to an internal signature
690  TempNewSymbol type = lookup_signature(type_str(), (mh_invoke_id != vmIntrinsics::_none), CHECK_(empty));
691  if (type == NULL)  return empty;  // no such signature exists in the VM
692
693  // Time to do the lookup.
694  switch (flags & ALL_KINDS) {
695  case IS_METHOD:
696    {
697      CallInfo result;
698      LinkInfo link_info(defc, name, type, caller, caller.not_null());
699      {
700        assert(!HAS_PENDING_EXCEPTION, "");
701        if (ref_kind == JVM_REF_invokeStatic) {
702          LinkResolver::resolve_static_call(result,
703                        link_info, false, THREAD);
704        } else if (ref_kind == JVM_REF_invokeInterface) {
705          LinkResolver::resolve_interface_call(result, Handle(), defc,
706                        link_info, false, THREAD);
707        } else if (mh_invoke_id != vmIntrinsics::_none) {
708          assert(!is_signature_polymorphic_static(mh_invoke_id), "");
709          LinkResolver::resolve_handle_call(result, link_info, THREAD);
710        } else if (ref_kind == JVM_REF_invokeSpecial) {
711          LinkResolver::resolve_special_call(result,
712                        link_info, THREAD);
713        } else if (ref_kind == JVM_REF_invokeVirtual) {
714          LinkResolver::resolve_virtual_call(result, Handle(), defc,
715                        link_info, false, THREAD);
716        } else {
717          assert(false, "ref_kind=%d", ref_kind);
718        }
719        if (HAS_PENDING_EXCEPTION) {
720          return empty;
721        }
722      }
723      if (result.resolved_appendix().not_null()) {
724        // The resolved MemberName must not be accompanied by an appendix argument,
725        // since there is no way to bind this value into the MemberName.
726        // Caller is responsible to prevent this from happening.
727        THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty);
728      }
729      oop mname2 = init_method_MemberName(mname, result);
730      return Handle(THREAD, mname2);
731    }
732  case IS_CONSTRUCTOR:
733    {
734      CallInfo result;
735      LinkInfo link_info(defc, name, type, caller, caller.not_null());
736      {
737        assert(!HAS_PENDING_EXCEPTION, "");
738        if (name == vmSymbols::object_initializer_name()) {
739          LinkResolver::resolve_special_call(result, link_info, THREAD);
740        } else {
741          break;                // will throw after end of switch
742        }
743        if (HAS_PENDING_EXCEPTION) {
744          return empty;
745        }
746      }
747      assert(result.is_statically_bound(), "");
748      oop mname2 = init_method_MemberName(mname, result);
749      return Handle(THREAD, mname2);
750    }
751  case IS_FIELD:
752    {
753      fieldDescriptor result; // find_field initializes fd if found
754      {
755        assert(!HAS_PENDING_EXCEPTION, "");
756        LinkInfo link_info(defc, name, type, caller, /*check_access*/false);
757        LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, false, THREAD);
758        if (HAS_PENDING_EXCEPTION) {
759          return empty;
760        }
761      }
762      oop mname2 = init_field_MemberName(mname, result, ref_kind_is_setter(ref_kind));
763      return Handle(THREAD, mname2);
764    }
765  default:
766    THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format", empty);
767  }
768
769  return empty;
770}
771
772// Conversely, a member name which is only initialized from JVM internals
773// may have null defc, name, and type fields.
774// Resolving it plants a vmtarget/vmindex in it,
775// which refers directly to JVM internals.
776void MethodHandles::expand_MemberName(Handle mname, int suppress, TRAPS) {
777  assert(java_lang_invoke_MemberName::is_instance(mname()), "");
778  Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(mname());
779  int vmindex  = java_lang_invoke_MemberName::vmindex(mname());
780  if (vmtarget == NULL) {
781    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nothing to expand");
782  }
783
784  bool have_defc = (java_lang_invoke_MemberName::clazz(mname()) != NULL);
785  bool have_name = (java_lang_invoke_MemberName::name(mname()) != NULL);
786  bool have_type = (java_lang_invoke_MemberName::type(mname()) != NULL);
787  int flags      = java_lang_invoke_MemberName::flags(mname());
788
789  if (suppress != 0) {
790    if (suppress & _suppress_defc)  have_defc = true;
791    if (suppress & _suppress_name)  have_name = true;
792    if (suppress & _suppress_type)  have_type = true;
793  }
794
795  if (have_defc && have_name && have_type)  return;  // nothing needed
796
797  switch (flags & ALL_KINDS) {
798  case IS_METHOD:
799  case IS_CONSTRUCTOR:
800    {
801      assert(vmtarget->is_method(), "method or constructor vmtarget is Method*");
802      methodHandle m(THREAD, (Method*)vmtarget);
803      DEBUG_ONLY(vmtarget = NULL);  // safety
804      if (m.is_null())  break;
805      if (!have_defc) {
806        InstanceKlass* defc = m->method_holder();
807        java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror());
808      }
809      if (!have_name) {
810        //not java_lang_String::create_from_symbol; let's intern member names
811        Handle name = StringTable::intern(m->name(), CHECK);
812        java_lang_invoke_MemberName::set_name(mname(), name());
813      }
814      if (!have_type) {
815        Handle type = java_lang_String::create_from_symbol(m->signature(), CHECK);
816        java_lang_invoke_MemberName::set_type(mname(), type());
817      }
818      return;
819    }
820  case IS_FIELD:
821    {
822      assert(vmtarget->is_klass(), "field vmtarget is Klass*");
823      if (!((Klass*) vmtarget)->is_instance_klass())  break;
824      instanceKlassHandle defc(THREAD, (Klass*) vmtarget);
825      DEBUG_ONLY(vmtarget = NULL);  // safety
826      bool is_static = ((flags & JVM_ACC_STATIC) != 0);
827      fieldDescriptor fd; // find_field initializes fd if found
828      if (!defc->find_field_from_offset(vmindex, is_static, &fd))
829        break;                  // cannot expand
830      if (!have_defc) {
831        java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror());
832      }
833      if (!have_name) {
834        //not java_lang_String::create_from_symbol; let's intern member names
835        Handle name = StringTable::intern(fd.name(), CHECK);
836        java_lang_invoke_MemberName::set_name(mname(), name());
837      }
838      if (!have_type) {
839        // If it is a primitive field type, don't mess with short strings like "I".
840        Handle type = field_signature_type_or_null(fd.signature());
841        if (type.is_null()) {
842          java_lang_String::create_from_symbol(fd.signature(), CHECK);
843        }
844        java_lang_invoke_MemberName::set_type(mname(), type());
845      }
846      return;
847    }
848  }
849  THROW_MSG(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format");
850}
851
852int MethodHandles::find_MemberNames(KlassHandle k,
853                                    Symbol* name, Symbol* sig,
854                                    int mflags, KlassHandle caller,
855                                    int skip, objArrayHandle results) {
856  // %%% take caller into account!
857
858  Thread* thread = Thread::current();
859
860  if (k.is_null() || !k->is_instance_klass())  return -1;
861
862  int rfill = 0, rlimit = results->length(), rskip = skip;
863  // overflow measurement:
864  int overflow = 0, overflow_limit = MAX2(1000, rlimit);
865
866  int match_flags = mflags;
867  bool search_superc = ((match_flags & SEARCH_SUPERCLASSES) != 0);
868  bool search_intfc  = ((match_flags & SEARCH_INTERFACES)   != 0);
869  bool local_only = !(search_superc | search_intfc);
870  bool classes_only = false;
871
872  if (name != NULL) {
873    if (name->utf8_length() == 0)  return 0; // a match is not possible
874  }
875  if (sig != NULL) {
876    if (sig->utf8_length() == 0)  return 0; // a match is not possible
877    if (sig->byte_at(0) == '(')
878      match_flags &= ~(IS_FIELD | IS_TYPE);
879    else
880      match_flags &= ~(IS_CONSTRUCTOR | IS_METHOD);
881  }
882
883  if ((match_flags & IS_TYPE) != 0) {
884    // NYI, and Core Reflection works quite well for this query
885  }
886
887  if ((match_flags & IS_FIELD) != 0) {
888    for (FieldStream st(k(), local_only, !search_intfc); !st.eos(); st.next()) {
889      if (name != NULL && st.name() != name)
890          continue;
891      if (sig != NULL && st.signature() != sig)
892        continue;
893      // passed the filters
894      if (rskip > 0) {
895        --rskip;
896      } else if (rfill < rlimit) {
897        Handle result(thread, results->obj_at(rfill++));
898        if (!java_lang_invoke_MemberName::is_instance(result()))
899          return -99;  // caller bug!
900        oop saved = MethodHandles::init_field_MemberName(result, st.field_descriptor());
901        if (saved != result())
902          results->obj_at_put(rfill-1, saved);  // show saved instance to user
903      } else if (++overflow >= overflow_limit) {
904        match_flags = 0; break; // got tired of looking at overflow
905      }
906    }
907  }
908
909  if ((match_flags & (IS_METHOD | IS_CONSTRUCTOR)) != 0) {
910    // watch out for these guys:
911    Symbol* init_name   = vmSymbols::object_initializer_name();
912    Symbol* clinit_name = vmSymbols::class_initializer_name();
913    if (name == clinit_name)  clinit_name = NULL; // hack for exposing <clinit>
914    bool negate_name_test = false;
915    // fix name so that it captures the intention of IS_CONSTRUCTOR
916    if (!(match_flags & IS_METHOD)) {
917      // constructors only
918      if (name == NULL) {
919        name = init_name;
920      } else if (name != init_name) {
921        return 0;               // no constructors of this method name
922      }
923    } else if (!(match_flags & IS_CONSTRUCTOR)) {
924      // methods only
925      if (name == NULL) {
926        name = init_name;
927        negate_name_test = true; // if we see the name, we *omit* the entry
928      } else if (name == init_name) {
929        return 0;               // no methods of this constructor name
930      }
931    } else {
932      // caller will accept either sort; no need to adjust name
933    }
934    for (MethodStream st(k(), local_only, !search_intfc); !st.eos(); st.next()) {
935      Method* m = st.method();
936      Symbol* m_name = m->name();
937      if (m_name == clinit_name)
938        continue;
939      if (name != NULL && ((m_name != name) ^ negate_name_test))
940          continue;
941      if (sig != NULL && m->signature() != sig)
942        continue;
943      // passed the filters
944      if (rskip > 0) {
945        --rskip;
946      } else if (rfill < rlimit) {
947        Handle result(thread, results->obj_at(rfill++));
948        if (!java_lang_invoke_MemberName::is_instance(result()))
949          return -99;  // caller bug!
950        CallInfo info(m);
951        oop saved = MethodHandles::init_method_MemberName(result, info);
952        if (saved != result())
953          results->obj_at_put(rfill-1, saved);  // show saved instance to user
954      } else if (++overflow >= overflow_limit) {
955        match_flags = 0; break; // got tired of looking at overflow
956      }
957    }
958  }
959
960  // return number of elements we at leasted wanted to initialize
961  return rfill + overflow;
962}
963
964// Is it safe to remove stale entries from a dependency list?
965static bool safe_to_expunge() {
966  // Since parallel GC threads can concurrently iterate over a dependency
967  // list during safepoint, it is safe to remove entries only when
968  // CodeCache lock is held.
969  return CodeCache_lock->owned_by_self();
970}
971
972void MethodHandles::add_dependent_nmethod(oop call_site, nmethod* nm) {
973  assert_locked_or_safepoint(CodeCache_lock);
974
975  oop context = java_lang_invoke_CallSite::context(call_site);
976  DependencyContext deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
977  // Try to purge stale entries on updates.
978  // Since GC doesn't clean dependency contexts rooted at CallSiteContext objects,
979  // in order to avoid memory leak, stale entries are purged whenever a dependency list
980  // is changed (both on addition and removal). Though memory reclamation is delayed,
981  // it avoids indefinite memory usage growth.
982  deps.add_dependent_nmethod(nm, /*expunge_stale_entries=*/safe_to_expunge());
983}
984
985void MethodHandles::remove_dependent_nmethod(oop call_site, nmethod* nm) {
986  assert_locked_or_safepoint(CodeCache_lock);
987
988  oop context = java_lang_invoke_CallSite::context(call_site);
989  DependencyContext deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
990  deps.remove_dependent_nmethod(nm, /*expunge_stale_entries=*/safe_to_expunge());
991}
992
993void MethodHandles::flush_dependent_nmethods(Handle call_site, Handle target) {
994  assert_lock_strong(Compile_lock);
995
996  int marked = 0;
997  CallSiteDepChange changes(call_site(), target());
998  {
999    NoSafepointVerifier nsv;
1000    MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag);
1001
1002    oop context = java_lang_invoke_CallSite::context(call_site());
1003    DependencyContext deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
1004    marked = deps.mark_dependent_nmethods(changes);
1005  }
1006  if (marked > 0) {
1007    // At least one nmethod has been marked for deoptimization.
1008    VM_Deoptimize op;
1009    VMThread::execute(&op);
1010  }
1011}
1012
1013//------------------------------------------------------------------------------
1014// MemberNameTable
1015//
1016
1017MemberNameTable::MemberNameTable(int methods_cnt)
1018                  : GrowableArray<jweak>(methods_cnt, true) {
1019  assert_locked_or_safepoint(MemberNameTable_lock);
1020}
1021
1022MemberNameTable::~MemberNameTable() {
1023  assert_locked_or_safepoint(MemberNameTable_lock);
1024  int len = this->length();
1025
1026  for (int idx = 0; idx < len; idx++) {
1027    jweak ref = this->at(idx);
1028    JNIHandles::destroy_weak_global(ref);
1029  }
1030}
1031
1032void MemberNameTable::add_member_name(jweak mem_name_wref) {
1033  assert_locked_or_safepoint(MemberNameTable_lock);
1034  this->push(mem_name_wref);
1035}
1036
1037#if INCLUDE_JVMTI
1038// It is called at safepoint only for RedefineClasses
1039void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) {
1040  assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
1041  // For each redefined method
1042  for (int idx = 0; idx < length(); idx++) {
1043    oop mem_name = JNIHandles::resolve(this->at(idx));
1044    if (mem_name == NULL) {
1045      continue;
1046    }
1047    Method* old_method = (Method*)java_lang_invoke_MemberName::vmtarget(mem_name);
1048
1049    if (old_method == NULL || !old_method->is_old()) {
1050      continue; // skip uninteresting entries
1051    }
1052    if (old_method->is_deleted()) {
1053      // skip entries with deleted methods
1054      continue;
1055    }
1056    Method* new_method = holder->method_with_idnum(old_method->orig_method_idnum());
1057
1058    assert(new_method != NULL, "method_with_idnum() should not be NULL");
1059    assert(old_method != new_method, "sanity check");
1060
1061    java_lang_invoke_MemberName::set_vmtarget(mem_name, new_method);
1062
1063    if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) {
1064      if (!(*trace_name_printed)) {
1065        // RC_TRACE_MESG macro has an embedded ResourceMark
1066        RC_TRACE_MESG(("adjust: name=%s",
1067                       old_method->method_holder()->external_name()));
1068        *trace_name_printed = true;
1069      }
1070      // RC_TRACE macro has an embedded ResourceMark
1071      RC_TRACE(0x00400000, ("MemberName method update: %s(%s)",
1072                            new_method->name()->as_C_string(),
1073                            new_method->signature()->as_C_string()));
1074    }
1075  }
1076}
1077#endif // INCLUDE_JVMTI
1078
1079//
1080// Here are the native methods in java.lang.invoke.MethodHandleNatives
1081// They are the private interface between this JVM and the HotSpot-specific
1082// Java code that implements JSR 292 method handles.
1083//
1084// Note:  We use a JVM_ENTRY macro to define each of these, for this is the way
1085// that intrinsic (non-JNI) native methods are defined in HotSpot.
1086//
1087
1088#ifndef PRODUCT
1089#define EACH_NAMED_CON(template, requirement) \
1090    template(java_lang_invoke_MemberName,MN_IS_METHOD) \
1091    template(java_lang_invoke_MemberName,MN_IS_CONSTRUCTOR) \
1092    template(java_lang_invoke_MemberName,MN_IS_FIELD) \
1093    template(java_lang_invoke_MemberName,MN_IS_TYPE) \
1094    template(java_lang_invoke_MemberName,MN_CALLER_SENSITIVE) \
1095    template(java_lang_invoke_MemberName,MN_SEARCH_SUPERCLASSES) \
1096    template(java_lang_invoke_MemberName,MN_SEARCH_INTERFACES) \
1097    template(java_lang_invoke_MemberName,MN_REFERENCE_KIND_SHIFT) \
1098    template(java_lang_invoke_MemberName,MN_REFERENCE_KIND_MASK) \
1099    /*end*/
1100
1101#define IGNORE_REQ(req_expr) /* req_expr */
1102#define ONE_PLUS(scope,value) 1+
1103static const int con_value_count = EACH_NAMED_CON(ONE_PLUS, IGNORE_REQ) 0;
1104#define VALUE_COMMA(scope,value) scope::value,
1105static const int con_values[con_value_count+1] = { EACH_NAMED_CON(VALUE_COMMA, IGNORE_REQ) 0 };
1106#define STRING_NULL(scope,value) #value "\0"
1107static const char con_names[] = { EACH_NAMED_CON(STRING_NULL, IGNORE_REQ) };
1108
1109static bool advertise_con_value(int which) {
1110  if (which < 0)  return false;
1111  bool ok = true;
1112  int count = 0;
1113#define INC_COUNT(scope,value) \
1114  ++count;
1115#define CHECK_REQ(req_expr) \
1116  if (which < count)  return ok; \
1117  ok = (req_expr);
1118  EACH_NAMED_CON(INC_COUNT, CHECK_REQ);
1119#undef INC_COUNT
1120#undef CHECK_REQ
1121  assert(count == con_value_count, "");
1122  if (which < count)  return ok;
1123  return false;
1124}
1125
1126#undef ONE_PLUS
1127#undef VALUE_COMMA
1128#undef STRING_NULL
1129#undef EACH_NAMED_CON
1130#endif // PRODUCT
1131
1132JVM_ENTRY(jint, MHN_getNamedCon(JNIEnv *env, jobject igcls, jint which, jobjectArray box_jh)) {
1133#ifndef PRODUCT
1134  if (advertise_con_value(which)) {
1135    assert(which >= 0 && which < con_value_count, "");
1136    int con = con_values[which];
1137    objArrayHandle box(THREAD, (objArrayOop) JNIHandles::resolve(box_jh));
1138    if (box.not_null() && box->klass() == Universe::objectArrayKlassObj() && box->length() > 0) {
1139      const char* str = &con_names[0];
1140      for (int i = 0; i < which; i++)
1141        str += strlen(str) + 1;   // skip name and null
1142      oop name = java_lang_String::create_oop_from_str(str, CHECK_0);  // possible safepoint
1143      box->obj_at_put(0, name);
1144    }
1145    return con;
1146  }
1147#endif
1148  return 0;
1149}
1150JVM_END
1151
1152// void init(MemberName self, AccessibleObject ref)
1153JVM_ENTRY(void, MHN_init_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jobject target_jh)) {
1154  if (mname_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "mname is null"); }
1155  if (target_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "target is null"); }
1156  Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
1157  Handle target(THREAD, JNIHandles::resolve_non_null(target_jh));
1158  MethodHandles::init_MemberName(mname, target);
1159}
1160JVM_END
1161
1162// void expand(MemberName self)
1163JVM_ENTRY(void, MHN_expand_Mem(JNIEnv *env, jobject igcls, jobject mname_jh)) {
1164  if (mname_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "mname is null"); }
1165  Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
1166  MethodHandles::expand_MemberName(mname, 0, CHECK);
1167}
1168JVM_END
1169
1170// void resolve(MemberName self, Class<?> caller)
1171JVM_ENTRY(jobject, MHN_resolve_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jclass caller_jh)) {
1172  if (mname_jh == NULL) { THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "mname is null"); }
1173  Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
1174
1175  // The trusted Java code that calls this method should already have performed
1176  // access checks on behalf of the given caller.  But, we can verify this.
1177  if (VerifyMethodHandles && caller_jh != NULL &&
1178      java_lang_invoke_MemberName::clazz(mname()) != NULL) {
1179    Klass* reference_klass = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(mname()));
1180    if (reference_klass != NULL && reference_klass->is_objArray_klass()) {
1181      reference_klass = ObjArrayKlass::cast(reference_klass)->bottom_klass();
1182    }
1183
1184    // Reflection::verify_class_access can only handle instance classes.
1185    if (reference_klass != NULL && reference_klass->is_instance_klass()) {
1186      // Emulate LinkResolver::check_klass_accessability.
1187      Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
1188      if (!Reflection::verify_class_access(caller,
1189                                           reference_klass,
1190                                           true)) {
1191        THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), reference_klass->external_name());
1192      }
1193    }
1194  }
1195
1196  KlassHandle caller(THREAD,
1197                     caller_jh == NULL ? (Klass*) NULL :
1198                     java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh)));
1199  Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL);
1200
1201  if (resolved.is_null()) {
1202    int flags = java_lang_invoke_MemberName::flags(mname());
1203    int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
1204    if (!MethodHandles::ref_kind_is_valid(ref_kind)) {
1205      THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "obsolete MemberName format");
1206    }
1207    if ((flags & ALL_KINDS) == IS_FIELD) {
1208      THROW_MSG_NULL(vmSymbols::java_lang_NoSuchMethodError(), "field resolution failed");
1209    } else if ((flags & ALL_KINDS) == IS_METHOD ||
1210               (flags & ALL_KINDS) == IS_CONSTRUCTOR) {
1211      THROW_MSG_NULL(vmSymbols::java_lang_NoSuchFieldError(), "method resolution failed");
1212    } else {
1213      THROW_MSG_NULL(vmSymbols::java_lang_LinkageError(), "resolution failed");
1214    }
1215  }
1216
1217  return JNIHandles::make_local(THREAD, resolved());
1218}
1219JVM_END
1220
1221static jlong find_member_field_offset(oop mname, bool must_be_static, TRAPS) {
1222  if (mname == NULL ||
1223      java_lang_invoke_MemberName::vmtarget(mname) == NULL) {
1224    THROW_MSG_0(vmSymbols::java_lang_InternalError(), "mname not resolved");
1225  } else {
1226    int flags = java_lang_invoke_MemberName::flags(mname);
1227    if ((flags & IS_FIELD) != 0 &&
1228        (must_be_static
1229         ? (flags & JVM_ACC_STATIC) != 0
1230         : (flags & JVM_ACC_STATIC) == 0)) {
1231      int vmindex = java_lang_invoke_MemberName::vmindex(mname);
1232      return (jlong) vmindex;
1233    }
1234  }
1235  const char* msg = (must_be_static ? "static field required" : "non-static field required");
1236  THROW_MSG_0(vmSymbols::java_lang_InternalError(), msg);
1237  return 0;
1238}
1239
1240JVM_ENTRY(jlong, MHN_objectFieldOffset(JNIEnv *env, jobject igcls, jobject mname_jh)) {
1241  return find_member_field_offset(JNIHandles::resolve(mname_jh), false, THREAD);
1242}
1243JVM_END
1244
1245JVM_ENTRY(jlong, MHN_staticFieldOffset(JNIEnv *env, jobject igcls, jobject mname_jh)) {
1246  return find_member_field_offset(JNIHandles::resolve(mname_jh), true, THREAD);
1247}
1248JVM_END
1249
1250JVM_ENTRY(jobject, MHN_staticFieldBase(JNIEnv *env, jobject igcls, jobject mname_jh)) {
1251  // use the other function to perform sanity checks:
1252  jlong ignore = find_member_field_offset(JNIHandles::resolve(mname_jh), true, CHECK_NULL);
1253  oop clazz = java_lang_invoke_MemberName::clazz(JNIHandles::resolve_non_null(mname_jh));
1254  return JNIHandles::make_local(THREAD, clazz);
1255}
1256JVM_END
1257
1258JVM_ENTRY(jobject, MHN_getMemberVMInfo(JNIEnv *env, jobject igcls, jobject mname_jh)) {
1259  if (mname_jh == NULL)  return NULL;
1260  Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
1261  intptr_t vmindex  = java_lang_invoke_MemberName::vmindex(mname());
1262  Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(mname());
1263  objArrayHandle result = oopFactory::new_objArray(SystemDictionary::Object_klass(), 2, CHECK_NULL);
1264  jvalue vmindex_value; vmindex_value.j = (long)vmindex;
1265  oop x = java_lang_boxing_object::create(T_LONG, &vmindex_value, CHECK_NULL);
1266  result->obj_at_put(0, x);
1267  x = NULL;
1268  if (vmtarget == NULL) {
1269    x = NULL;
1270  } else if (vmtarget->is_klass()) {
1271    x = ((Klass*) vmtarget)->java_mirror();
1272  } else if (vmtarget->is_method()) {
1273    x = mname();
1274  }
1275  result->obj_at_put(1, x);
1276  return JNIHandles::make_local(env, result());
1277}
1278JVM_END
1279
1280
1281
1282//  static native int getMembers(Class<?> defc, String matchName, String matchSig,
1283//          int matchFlags, Class<?> caller, int skip, MemberName[] results);
1284JVM_ENTRY(jint, MHN_getMembers(JNIEnv *env, jobject igcls,
1285                               jclass clazz_jh, jstring name_jh, jstring sig_jh,
1286                               int mflags, jclass caller_jh, jint skip, jobjectArray results_jh)) {
1287  if (clazz_jh == NULL || results_jh == NULL)  return -1;
1288  KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz_jh)));
1289
1290  objArrayHandle results(THREAD, (objArrayOop) JNIHandles::resolve(results_jh));
1291  if (results.is_null() || !results->is_objArray())  return -1;
1292
1293  TempNewSymbol name = NULL;
1294  TempNewSymbol sig = NULL;
1295  if (name_jh != NULL) {
1296    name = java_lang_String::as_symbol_or_null(JNIHandles::resolve_non_null(name_jh));
1297    if (name == NULL)  return 0; // a match is not possible
1298  }
1299  if (sig_jh != NULL) {
1300    sig = java_lang_String::as_symbol_or_null(JNIHandles::resolve_non_null(sig_jh));
1301    if (sig == NULL)  return 0; // a match is not possible
1302  }
1303
1304  KlassHandle caller;
1305  if (caller_jh != NULL) {
1306    oop caller_oop = JNIHandles::resolve_non_null(caller_jh);
1307    if (!java_lang_Class::is_instance(caller_oop))  return -1;
1308    caller = KlassHandle(THREAD, java_lang_Class::as_Klass(caller_oop));
1309  }
1310
1311  if (name != NULL && sig != NULL && results.not_null()) {
1312    // try a direct resolve
1313    // %%% TO DO
1314  }
1315
1316  int res = MethodHandles::find_MemberNames(k, name, sig, mflags,
1317                                            caller, skip, results);
1318  // TO DO: expand at least some of the MemberNames, to avoid massive callbacks
1319  return res;
1320}
1321JVM_END
1322
1323JVM_ENTRY(void, MHN_setCallSiteTargetNormal(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) {
1324  Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh));
1325  Handle target   (THREAD, JNIHandles::resolve_non_null(target_jh));
1326  {
1327    // Walk all nmethods depending on this call site.
1328    MutexLocker mu(Compile_lock, thread);
1329    MethodHandles::flush_dependent_nmethods(call_site, target);
1330    java_lang_invoke_CallSite::set_target(call_site(), target());
1331  }
1332}
1333JVM_END
1334
1335JVM_ENTRY(void, MHN_setCallSiteTargetVolatile(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) {
1336  Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh));
1337  Handle target   (THREAD, JNIHandles::resolve_non_null(target_jh));
1338  {
1339    // Walk all nmethods depending on this call site.
1340    MutexLocker mu(Compile_lock, thread);
1341    MethodHandles::flush_dependent_nmethods(call_site, target);
1342    java_lang_invoke_CallSite::set_target_volatile(call_site(), target());
1343  }
1344}
1345JVM_END
1346
1347// It is called by a Cleaner object which ensures that dropped CallSites properly
1348// deallocate their dependency information.
1349JVM_ENTRY(void, MHN_clearCallSiteContext(JNIEnv* env, jobject igcls, jobject context_jh)) {
1350  Handle context(THREAD, JNIHandles::resolve_non_null(context_jh));
1351  {
1352    // Walk all nmethods depending on this call site.
1353    MutexLocker mu1(Compile_lock, thread);
1354
1355    int marked = 0;
1356    {
1357      NoSafepointVerifier nsv;
1358      MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag);
1359      assert(safe_to_expunge(), "removal is not safe");
1360      DependencyContext deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context());
1361      marked = deps.remove_all_dependents();
1362    }
1363    if (marked > 0) {
1364      // At least one nmethod has been marked for deoptimization
1365      VM_Deoptimize op;
1366      VMThread::execute(&op);
1367    }
1368  }
1369}
1370JVM_END
1371
1372/**
1373 * Throws a java/lang/UnsupportedOperationException unconditionally.
1374 * This is required by the specification of MethodHandle.invoke if
1375 * invoked directly.
1376 */
1377JVM_ENTRY(jobject, MH_invoke_UOE(JNIEnv* env, jobject mh, jobjectArray args)) {
1378  THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "MethodHandle.invoke cannot be invoked reflectively");
1379  return NULL;
1380}
1381JVM_END
1382
1383/**
1384 * Throws a java/lang/UnsupportedOperationException unconditionally.
1385 * This is required by the specification of MethodHandle.invokeExact if
1386 * invoked directly.
1387 */
1388JVM_ENTRY(jobject, MH_invokeExact_UOE(JNIEnv* env, jobject mh, jobjectArray args)) {
1389  THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "MethodHandle.invokeExact cannot be invoked reflectively");
1390  return NULL;
1391}
1392JVM_END
1393
1394/// JVM_RegisterMethodHandleMethods
1395
1396#undef CS  // Solaris builds complain
1397
1398#define LANG "Ljava/lang/"
1399#define JLINV "Ljava/lang/invoke/"
1400
1401#define OBJ   LANG "Object;"
1402#define CLS   LANG "Class;"
1403#define STRG  LANG "String;"
1404#define CS    JLINV "CallSite;"
1405#define MT    JLINV "MethodType;"
1406#define MH    JLINV "MethodHandle;"
1407#define MEM   JLINV "MemberName;"
1408#define CTX   JLINV "MethodHandleNatives$CallSiteContext;"
1409
1410#define CC (char*)  /*cast a literal from (const char*)*/
1411#define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
1412
1413// These are the native methods on java.lang.invoke.MethodHandleNatives.
1414static JNINativeMethod MHN_methods[] = {
1415  {CC "init",                      CC "(" MEM "" OBJ ")V",                   FN_PTR(MHN_init_Mem)},
1416  {CC "expand",                    CC "(" MEM ")V",                          FN_PTR(MHN_expand_Mem)},
1417  {CC "resolve",                   CC "(" MEM "" CLS ")" MEM,                FN_PTR(MHN_resolve_Mem)},
1418  //  static native int getNamedCon(int which, Object[] name)
1419  {CC "getNamedCon",               CC "(I[" OBJ ")I",                        FN_PTR(MHN_getNamedCon)},
1420  //  static native int getMembers(Class<?> defc, String matchName, String matchSig,
1421  //          int matchFlags, Class<?> caller, int skip, MemberName[] results);
1422  {CC "getMembers",                CC "(" CLS "" STRG "" STRG "I" CLS "I[" MEM ")I", FN_PTR(MHN_getMembers)},
1423  {CC "objectFieldOffset",         CC "(" MEM ")J",                          FN_PTR(MHN_objectFieldOffset)},
1424  {CC "setCallSiteTargetNormal",   CC "(" CS "" MH ")V",                     FN_PTR(MHN_setCallSiteTargetNormal)},
1425  {CC "setCallSiteTargetVolatile", CC "(" CS "" MH ")V",                     FN_PTR(MHN_setCallSiteTargetVolatile)},
1426  {CC "clearCallSiteContext",      CC "(" CTX ")V",                          FN_PTR(MHN_clearCallSiteContext)},
1427  {CC "staticFieldOffset",         CC "(" MEM ")J",                          FN_PTR(MHN_staticFieldOffset)},
1428  {CC "staticFieldBase",           CC "(" MEM ")" OBJ,                        FN_PTR(MHN_staticFieldBase)},
1429  {CC "getMemberVMInfo",           CC "(" MEM ")" OBJ,                        FN_PTR(MHN_getMemberVMInfo)}
1430};
1431
1432static JNINativeMethod MH_methods[] = {
1433  // UnsupportedOperationException throwers
1434  {CC "invoke",                    CC "([" OBJ ")" OBJ,                       FN_PTR(MH_invoke_UOE)},
1435  {CC "invokeExact",               CC "([" OBJ ")" OBJ,                       FN_PTR(MH_invokeExact_UOE)}
1436};
1437
1438/**
1439 * Helper method to register native methods.
1440 */
1441static bool register_natives(JNIEnv* env, jclass clazz, const JNINativeMethod* methods, jint nMethods) {
1442  int status = env->RegisterNatives(clazz, methods, nMethods);
1443  if (status != JNI_OK || env->ExceptionOccurred()) {
1444    warning("JSR 292 method handle code is mismatched to this JVM.  Disabling support.");
1445    env->ExceptionClear();
1446    return false;
1447  }
1448  return true;
1449}
1450
1451/**
1452 * This one function is exported, used by NativeLookup.
1453 */
1454JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) {
1455  assert(!MethodHandles::enabled(), "must not be enabled");
1456  bool enable_MH = true;
1457
1458  jclass MH_class = NULL;
1459  if (SystemDictionary::MethodHandle_klass() == NULL) {
1460    enable_MH = false;
1461  } else {
1462    oop mirror = SystemDictionary::MethodHandle_klass()->java_mirror();
1463    MH_class = (jclass) JNIHandles::make_local(env, mirror);
1464  }
1465
1466  if (enable_MH) {
1467    ThreadToNativeFromVM ttnfv(thread);
1468
1469    if (enable_MH) {
1470      enable_MH = register_natives(env, MHN_class, MHN_methods, sizeof(MHN_methods)/sizeof(JNINativeMethod));
1471    }
1472    if (enable_MH) {
1473      enable_MH = register_natives(env, MH_class, MH_methods, sizeof(MH_methods)/sizeof(JNINativeMethod));
1474    }
1475  }
1476
1477  if (TraceInvokeDynamic) {
1478    tty->print_cr("MethodHandle support loaded (using LambdaForms)");
1479  }
1480
1481  if (enable_MH) {
1482    if (MethodHandles::generate_adapters() == false) {
1483      THROW_MSG(vmSymbols::java_lang_VirtualMachineError(), "Out of space in CodeCache for method handle adapters");
1484    }
1485    MethodHandles::set_enabled(true);
1486  }
1487}
1488JVM_END
1489