Mercurial > hg > truffle
annotate src/share/vm/prims/methodHandles.cpp @ 8733:9def4075da6d
8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
Summary: Update the task local finger to the start of the next object when marking aborts, in order to avoid the redundant scanning of all 0's when the marking task restarts, if otherwise updating to the next word. In addition, reuse the routine nextObject() in routine iterate().
Reviewed-by: johnc, ysr
Contributed-by: tamao <tao.mao@oracle.com>
author | tamao |
---|---|
date | Tue, 05 Mar 2013 15:36:56 -0800 |
parents | 5c0931d15474 |
children | 16885e702c88 |
rev | line source |
---|---|
710 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
2 * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. |
710 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1508
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1508
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1508
diff
changeset
|
21 * questions. |
710 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/symbolTable.hpp" | |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3781
diff
changeset
|
27 #include "compiler/compileBroker.hpp" |
1972 | 28 #include "interpreter/interpreter.hpp" |
3388
a80577f854f9
7045513: JSR 292 inlining causes crashes in methodHandleWalk.cpp
never
parents:
3371
diff
changeset
|
29 #include "interpreter/oopMapCache.hpp" |
1972 | 30 #include "memory/allocation.inline.hpp" |
31 #include "memory/oopFactory.hpp" | |
32 #include "prims/methodHandles.hpp" | |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3781
diff
changeset
|
33 #include "runtime/compilationPolicy.hpp" |
1972 | 34 #include "runtime/javaCalls.hpp" |
35 #include "runtime/reflection.hpp" | |
36 #include "runtime/signature.hpp" | |
37 #include "runtime/stubRoutines.hpp" | |
38 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
39 |
710 | 40 /* |
41 * JSR 292 reference implementation: method handles | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
42 * The JDK 7 reference implementation represented method handle |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
43 * combinations as chains. Each link in the chain had a "vmentry" |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
44 * field which pointed at a bit of assembly code which performed |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
45 * one transformation before dispatching to the next link in the chain. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
46 * |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
47 * The current reference implementation pushes almost all code generation |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
48 * responsibility to (trusted) Java code. A method handle contains a |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
49 * pointer to its "LambdaForm", which embodies all details of the method |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
50 * handle's behavior. The LambdaForm is a normal Java object, managed |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
51 * by a runtime coded in Java. |
710 | 52 */ |
53 | |
54 bool MethodHandles::_enabled = false; // set true after successful native linkage | |
3753
cba7b5c2d53f
7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents:
3744
diff
changeset
|
55 MethodHandlesAdapterBlob* MethodHandles::_adapter_code = NULL; |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
56 |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
57 //------------------------------------------------------------------------------ |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
58 // MethodHandles::generate_adapters |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
59 // |
2116
d810e9a3fc33
7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents:
2088
diff
changeset
|
60 void MethodHandles::generate_adapters() { |
2416
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2357
diff
changeset
|
61 if (!EnableInvokeDynamic || SystemDictionary::MethodHandle_klass() == NULL) return; |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
62 |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
63 assert(_adapter_code == NULL, "generate only once"); |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
64 |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
65 ResourceMark rm; |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
66 TraceTime timer("MethodHandles adapters generation", TraceStartupTime); |
3753
cba7b5c2d53f
7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents:
3744
diff
changeset
|
67 _adapter_code = MethodHandlesAdapterBlob::create(adapter_code_size); |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
68 if (_adapter_code == NULL) |
3753
cba7b5c2d53f
7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents:
3744
diff
changeset
|
69 vm_exit_out_of_memory(adapter_code_size, "CodeCache: no room for MethodHandles adapters"); |
4059
44ce519bc3d1
7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents:
4043
diff
changeset
|
70 { |
44ce519bc3d1
7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents:
4043
diff
changeset
|
71 CodeBuffer code(_adapter_code); |
44ce519bc3d1
7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents:
4043
diff
changeset
|
72 MethodHandlesAdapterGenerator g(&code); |
44ce519bc3d1
7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents:
4043
diff
changeset
|
73 g.generate(); |
44ce519bc3d1
7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents:
4043
diff
changeset
|
74 code.log_section_sizes("MethodHandlesAdapterBlob"); |
44ce519bc3d1
7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents:
4043
diff
changeset
|
75 } |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
76 } |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
77 |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
78 //------------------------------------------------------------------------------ |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
79 // MethodHandlesAdapterGenerator::generate |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
80 // |
2116
d810e9a3fc33
7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents:
2088
diff
changeset
|
81 void MethodHandlesAdapterGenerator::generate() { |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
82 // Generate generic method handle adapters. |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
83 // Generate interpreter entries |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
84 for (Interpreter::MethodKind mk = Interpreter::method_handle_invoke_FIRST; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
85 mk <= Interpreter::method_handle_invoke_LAST; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
86 mk = Interpreter::MethodKind(1 + (int)mk)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
87 vmIntrinsics::ID iid = Interpreter::method_handle_intrinsic(mk); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
88 StubCodeMark mark(this, "MethodHandle::interpreter_entry", vmIntrinsics::name_at(iid)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
89 address entry = MethodHandles::generate_method_handle_interpreter_entry(_masm, iid); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
90 if (entry != NULL) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
91 Interpreter::set_entry_for_kind(mk, entry); |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
92 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
93 // If the entry is not set, it will throw AbstractMethodError. |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
94 } |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
95 } |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1142
diff
changeset
|
96 |
710 | 97 void MethodHandles::set_enabled(bool z) { |
98 if (_enabled != z) { | |
2416
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2357
diff
changeset
|
99 guarantee(z && EnableInvokeDynamic, "can only enable once, and only if -XX:+EnableInvokeDynamic"); |
710 | 100 _enabled = z; |
101 } | |
102 } | |
103 | |
104 // MemberName support | |
105 | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
106 // import java_lang_invoke_MemberName.* |
710 | 107 enum { |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
108 IS_METHOD = java_lang_invoke_MemberName::MN_IS_METHOD, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
109 IS_CONSTRUCTOR = java_lang_invoke_MemberName::MN_IS_CONSTRUCTOR, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
110 IS_FIELD = java_lang_invoke_MemberName::MN_IS_FIELD, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
111 IS_TYPE = java_lang_invoke_MemberName::MN_IS_TYPE, |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
112 REFERENCE_KIND_SHIFT = java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
113 REFERENCE_KIND_MASK = java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK, |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
114 SEARCH_SUPERCLASSES = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
115 SEARCH_INTERFACES = java_lang_invoke_MemberName::MN_SEARCH_INTERFACES, |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
116 ALL_KINDS = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE |
710 | 117 }; |
118 | |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
119 Handle MethodHandles::new_MemberName(TRAPS) { |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
120 Handle empty; |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
121 instanceKlassHandle k(THREAD, SystemDictionary::MemberName_klass()); |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
122 if (!k->is_initialized()) k->initialize(CHECK_(empty)); |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
123 return Handle(THREAD, k->allocate_instance(THREAD)); |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
124 } |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
125 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
126 oop MethodHandles::init_MemberName(oop mname_oop, oop target_oop) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
127 Klass* target_klass = target_oop->klass(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
128 if (target_klass == SystemDictionary::reflect_Field_klass()) { |
710 | 129 oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder() |
130 int slot = java_lang_reflect_Field::slot(target_oop); // fd.index() | |
131 int mods = java_lang_reflect_Field::modifiers(target_oop); | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
132 oop type = java_lang_reflect_Field::type(target_oop); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
133 oop name = java_lang_reflect_Field::name(target_oop); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
134 Klass* k = java_lang_Class::as_Klass(clazz); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
135 intptr_t offset = InstanceKlass::cast(k)->field_offset(slot); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
136 return init_field_MemberName(mname_oop, k, accessFlags_from(mods), type, name, offset); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
137 } else if (target_klass == SystemDictionary::reflect_Method_klass()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
138 oop clazz = java_lang_reflect_Method::clazz(target_oop); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
139 int slot = java_lang_reflect_Method::slot(target_oop); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
140 Klass* k = java_lang_Class::as_Klass(clazz); |
6983 | 141 if (k != NULL && k->oop_is_instance()) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
142 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
143 return init_method_MemberName(mname_oop, m, true, k); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
144 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
145 } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
146 oop clazz = java_lang_reflect_Constructor::clazz(target_oop); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
147 int slot = java_lang_reflect_Constructor::slot(target_oop); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
148 Klass* k = java_lang_Class::as_Klass(clazz); |
6983 | 149 if (k != NULL && k->oop_is_instance()) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
150 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
151 return init_method_MemberName(mname_oop, m, false, k); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
152 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
153 } else if (target_klass == SystemDictionary::MemberName_klass()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
154 // Note: This only works if the MemberName has already been resolved. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
155 oop clazz = java_lang_invoke_MemberName::clazz(target_oop); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
156 int flags = java_lang_invoke_MemberName::flags(target_oop); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
157 Metadata* vmtarget=java_lang_invoke_MemberName::vmtarget(target_oop); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
158 intptr_t vmindex = java_lang_invoke_MemberName::vmindex(target_oop); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
159 Klass* k = java_lang_Class::as_Klass(clazz); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
160 int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
161 if (vmtarget == NULL) return NULL; // not resolved |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
162 if ((flags & IS_FIELD) != 0) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
163 assert(vmtarget->is_klass(), "field vmtarget is Klass*"); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
164 int basic_mods = (ref_kind_is_static(ref_kind) ? JVM_ACC_STATIC : 0); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
165 // FIXME: how does k (receiver_limit) contribute? |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
166 return init_field_MemberName(mname_oop, (Klass*)vmtarget, accessFlags_from(basic_mods), NULL, NULL, vmindex); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
167 } else if ((flags & (IS_METHOD | IS_CONSTRUCTOR)) != 0) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
168 assert(vmtarget->is_method(), "method or constructor vmtarget is Method*"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
169 return init_method_MemberName(mname_oop, (Method*)vmtarget, ref_kind_does_dispatch(ref_kind), k); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
170 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
171 return NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
172 } |
710 | 173 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
174 return NULL; |
710 | 175 } |
176 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
177 oop MethodHandles::init_method_MemberName(oop mname_oop, Method* m, bool do_dispatch, |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
178 Klass* receiver_limit) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
179 AccessFlags mods = m->access_flags(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
180 int flags = (jushort)( mods.as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS ); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
181 int vmindex = Method::nonvirtual_vtable_index; // implies never any dispatch |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
182 Klass* mklass = m->method_holder(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
183 if (receiver_limit == NULL) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
184 receiver_limit = mklass; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
185 if (m->is_initializer()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
186 flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
187 } else if (mods.is_static()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
188 flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
189 } else if (receiver_limit != mklass && |
6983 | 190 !receiver_limit->is_subtype_of(mklass)) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
191 return NULL; // bad receiver limit |
6983 | 192 } else if (receiver_limit->is_interface() && |
193 mklass->is_interface()) { | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
194 flags |= IS_METHOD | (JVM_REF_invokeInterface << REFERENCE_KIND_SHIFT); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
195 receiver_limit = mklass; // ignore passed-in limit; interfaces are interconvertible |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
196 vmindex = klassItable::compute_itable_index(m); |
6983 | 197 } else if (mklass != receiver_limit && mklass->is_interface()) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
198 flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
199 // it is a miranda method, so m->vtable_index is not what we want |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
200 ResourceMark rm; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
201 klassVtable* vt = InstanceKlass::cast(receiver_limit)->vtable(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
202 vmindex = vt->index_of_miranda(m->name(), m->signature()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
203 } else if (!do_dispatch || m->can_be_statically_bound()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
204 flags |= IS_METHOD | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
205 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
206 flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
207 vmindex = m->vtable_index(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
208 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
209 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
210 java_lang_invoke_MemberName::set_flags(mname_oop, flags); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
211 java_lang_invoke_MemberName::set_vmtarget(mname_oop, m); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
212 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); // vtable/itable index |
6983 | 213 java_lang_invoke_MemberName::set_clazz(mname_oop, receiver_limit->java_mirror()); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
214 // Note: name and type can be lazily computed by resolve_MemberName, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
215 // if Java code needs them as resolved String and MethodType objects. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
216 // The clazz must be eagerly stored, because it provides a GC |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
217 // root to help keep alive the Method*. |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
218 // If relevant, the vtable or itable value is stored as vmindex. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
219 // This is done eagerly, since it is readily available without |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
220 // constructing any new objects. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
221 // TO DO: maybe intern mname_oop |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
222 return mname_oop; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
223 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
224 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
225 Handle MethodHandles::init_method_MemberName(oop mname_oop, CallInfo& info, TRAPS) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
226 Handle empty; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
227 if (info.resolved_appendix().not_null()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
228 // The resolved MemberName must not be accompanied by an appendix argument, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
229 // since there is no way to bind this value into the MemberName. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
230 // Caller is responsible to prevent this from happening. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
231 THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
232 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
233 methodHandle m = info.resolved_method(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
234 KlassHandle defc = info.resolved_klass(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
235 int vmindex = -1; |
6940
18fb7da42534
8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents:
6852
diff
changeset
|
236 if (defc->is_interface() && m->method_holder()->is_interface()) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
237 // LinkResolver does not report itable indexes! (fix this?) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
238 vmindex = klassItable::compute_itable_index(m()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
239 } else if (m->can_be_statically_bound()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
240 // LinkResolver reports vtable index even for final methods! |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
241 vmindex = Method::nonvirtual_vtable_index; |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
242 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
243 vmindex = info.vtable_index(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
244 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
245 oop res = init_method_MemberName(mname_oop, m(), (vmindex >= 0), defc()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
246 assert(res == NULL || (java_lang_invoke_MemberName::vmindex(res) == vmindex), ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
247 return Handle(THREAD, res); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
248 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
249 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
250 oop MethodHandles::init_field_MemberName(oop mname_oop, Klass* field_holder, |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
251 AccessFlags mods, oop type, oop name, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
252 intptr_t offset, bool is_setter) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
253 int flags = (jushort)( mods.as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS ); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
254 flags |= IS_FIELD | ((mods.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
255 if (is_setter) flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
256 Metadata* vmtarget = field_holder; |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
257 int vmindex = offset; // determines the field uniquely when combined with static bit |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
258 java_lang_invoke_MemberName::set_flags(mname_oop, flags); |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
259 java_lang_invoke_MemberName::set_vmtarget(mname_oop, vmtarget); |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
260 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); |
6983 | 261 java_lang_invoke_MemberName::set_clazz(mname_oop, field_holder->java_mirror()); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
262 if (name != NULL) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
263 java_lang_invoke_MemberName::set_name(mname_oop, name); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
264 if (type != NULL) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
265 java_lang_invoke_MemberName::set_type(mname_oop, type); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
266 // Note: name and type can be lazily computed by resolve_MemberName, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
267 // if Java code needs them as resolved String and Class objects. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
268 // Note that the incoming type oop might be pre-resolved (non-null). |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
269 // The base clazz and field offset (vmindex) must be eagerly stored, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
270 // because they unambiguously identify the field. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
271 // Although the fieldDescriptor::_index would also identify the field, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
272 // we do not use it, because it is harder to decode. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
273 // TO DO: maybe intern mname_oop |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
274 return mname_oop; |
710 | 275 } |
276 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
277 Handle MethodHandles::init_field_MemberName(oop mname_oop, FieldAccessInfo& info, TRAPS) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
278 return Handle(); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
279 #if 0 // FIXME |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
280 KlassHandle field_holder = info.klass(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
281 intptr_t field_offset = info.field_offset(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
282 return init_field_MemberName(mname_oop, field_holder(), |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
283 info.access_flags(), |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
284 type, name, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
285 field_offset, false /*is_setter*/); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
286 #endif |
710 | 287 } |
288 | |
289 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
290 // JVM 2.9 Special Methods: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
291 // A method is signature polymorphic if and only if all of the following conditions hold : |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
292 // * It is declared in the java.lang.invoke.MethodHandle class. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
293 // * It has a single formal parameter of type Object[]. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
294 // * It has a return type of Object. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
295 // * It has the ACC_VARARGS and ACC_NATIVE flags set. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
296 bool MethodHandles::is_method_handle_invoke_name(Klass* klass, Symbol* name) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
297 if (klass == NULL) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
298 return false; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
299 // The following test will fail spuriously during bootstrap of MethodHandle itself: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
300 // if (klass != SystemDictionary::MethodHandle_klass()) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
301 // Test the name instead: |
6983 | 302 if (klass->name() != vmSymbols::java_lang_invoke_MethodHandle()) |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
303 return false; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
304 Symbol* poly_sig = vmSymbols::object_array_object_signature(); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
305 Method* m = InstanceKlass::cast(klass)->find_method(name, poly_sig); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
306 if (m == NULL) return false; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
307 int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
308 int flags = m->access_flags().as_int(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
309 return (flags & required) == required; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
310 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
311 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
312 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
313 Symbol* MethodHandles::signature_polymorphic_intrinsic_name(vmIntrinsics::ID iid) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
314 assert(is_signature_polymorphic_intrinsic(iid), err_msg("iid=%d", iid)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
315 switch (iid) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
316 case vmIntrinsics::_invokeBasic: return vmSymbols::invokeBasic_name(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
317 case vmIntrinsics::_linkToVirtual: return vmSymbols::linkToVirtual_name(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
318 case vmIntrinsics::_linkToStatic: return vmSymbols::linkToStatic_name(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
319 case vmIntrinsics::_linkToSpecial: return vmSymbols::linkToSpecial_name(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
320 case vmIntrinsics::_linkToInterface: return vmSymbols::linkToInterface_name(); |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
726
diff
changeset
|
321 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
322 assert(false, ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
323 return 0; |
710 | 324 } |
325 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
326 int MethodHandles::signature_polymorphic_intrinsic_ref_kind(vmIntrinsics::ID iid) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
327 switch (iid) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
328 case vmIntrinsics::_invokeBasic: return 0; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
329 case vmIntrinsics::_linkToVirtual: return JVM_REF_invokeVirtual; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
330 case vmIntrinsics::_linkToStatic: return JVM_REF_invokeStatic; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
331 case vmIntrinsics::_linkToSpecial: return JVM_REF_invokeSpecial; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
332 case vmIntrinsics::_linkToInterface: return JVM_REF_invokeInterface; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
333 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
334 assert(false, err_msg("iid=%d", iid)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
335 return 0; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
336 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
337 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
338 vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Symbol* name) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
339 vmSymbols::SID name_id = vmSymbols::find_sid(name); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
340 switch (name_id) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
341 // The ID _invokeGeneric stands for all non-static signature-polymorphic methods, except built-ins. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
342 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name): return vmIntrinsics::_invokeGeneric; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
343 // The only built-in non-static signature-polymorphic method is MethodHandle.invokeBasic: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
344 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeBasic_name): return vmIntrinsics::_invokeBasic; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
345 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
346 // There is one static signature-polymorphic method for each JVM invocation mode. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
347 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToVirtual_name): return vmIntrinsics::_linkToVirtual; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
348 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToStatic_name): return vmIntrinsics::_linkToStatic; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
349 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToSpecial_name): return vmIntrinsics::_linkToSpecial; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
350 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToInterface_name): return vmIntrinsics::_linkToInterface; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
351 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
352 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
353 // Cover the case of invokeExact and any future variants of invokeFoo. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
354 Klass* mh_klass = SystemDictionary::well_known_klass( |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
355 SystemDictionary::WK_KLASS_ENUM_NAME(MethodHandle_klass) ); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
356 if (mh_klass != NULL && is_method_handle_invoke_name(mh_klass, name)) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
357 return vmIntrinsics::_invokeGeneric; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
358 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
359 // Note: The pseudo-intrinsic _compiledLambdaForm is never linked against. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
360 // Instead it is used to mark lambda forms bound to invokehandle or invokedynamic. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
361 return vmIntrinsics::_none; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
362 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
363 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
364 vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Klass* klass, Symbol* name) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
365 if (klass != NULL && |
6983 | 366 klass->name() == vmSymbols::java_lang_invoke_MethodHandle()) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
367 vmIntrinsics::ID iid = signature_polymorphic_name_id(name); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
368 if (iid != vmIntrinsics::_none) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
369 return iid; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
370 if (is_method_handle_invoke_name(klass, name)) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
371 return vmIntrinsics::_invokeGeneric; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
372 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
373 return vmIntrinsics::_none; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
374 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
375 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
376 |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
377 // convert the external string or reflective type to an internal signature |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
378 Symbol* MethodHandles::lookup_signature(oop type_str, bool intern_if_not_found, TRAPS) { |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
379 if (java_lang_invoke_MethodType::is_instance(type_str)) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
380 return java_lang_invoke_MethodType::as_signature(type_str, intern_if_not_found, CHECK_NULL); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
381 } else if (java_lang_Class::is_instance(type_str)) { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
382 return java_lang_Class::as_signature(type_str, false, CHECK_NULL); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
383 } else if (java_lang_String::is_instance(type_str)) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
384 if (intern_if_not_found) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
385 return java_lang_String::as_symbol(type_str, CHECK_NULL); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
386 } else { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
387 return java_lang_String::as_symbol_or_null(type_str); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
388 } |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
389 } else { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
390 THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized type", NULL); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
391 } |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
392 } |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
393 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
394 static const char OBJ_SIG[] = "Ljava/lang/Object;"; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
395 enum { OBJ_SIG_LEN = 18 }; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
396 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
397 bool MethodHandles::is_basic_type_signature(Symbol* sig) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
398 assert(vmSymbols::object_signature()->utf8_length() == (int)OBJ_SIG_LEN, ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
399 assert(vmSymbols::object_signature()->equals(OBJ_SIG), ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
400 const int len = sig->utf8_length(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
401 for (int i = 0; i < len; i++) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
402 switch (sig->byte_at(i)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
403 case 'L': |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
404 // only java/lang/Object is valid here |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
405 if (sig->index_of_at(i, OBJ_SIG, OBJ_SIG_LEN) != i) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
406 return false; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
407 i += OBJ_SIG_LEN-1; //-1 because of i++ in loop |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
408 continue; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
409 case '(': case ')': case 'V': |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
410 case 'I': case 'J': case 'F': case 'D': |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
411 continue; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
412 //case '[': |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
413 //case 'Z': case 'B': case 'C': case 'S': |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
414 default: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
415 return false; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
416 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
417 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
418 return true; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
419 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
420 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
421 Symbol* MethodHandles::lookup_basic_type_signature(Symbol* sig, bool keep_last_arg, TRAPS) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
422 Symbol* bsig = NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
423 if (sig == NULL) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
424 return sig; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
425 } else if (is_basic_type_signature(sig)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
426 sig->increment_refcount(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
427 return sig; // that was easy |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
428 } else if (sig->byte_at(0) != '(') { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
429 BasicType bt = char2type(sig->byte_at(0)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
430 if (is_subword_type(bt)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
431 bsig = vmSymbols::int_signature(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
432 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
433 assert(bt == T_OBJECT || bt == T_ARRAY, "is_basic_type_signature was false"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
434 bsig = vmSymbols::object_signature(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
435 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
436 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
437 ResourceMark rm; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
438 stringStream buffer(128); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
439 buffer.put('('); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
440 int arg_pos = 0, keep_arg_pos = -1; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
441 if (keep_last_arg) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
442 keep_arg_pos = ArgumentCount(sig).size() - 1; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
443 for (SignatureStream ss(sig); !ss.is_done(); ss.next()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
444 BasicType bt = ss.type(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
445 size_t this_arg_pos = buffer.size(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
446 if (ss.at_return_type()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
447 buffer.put(')'); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
448 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
449 if (arg_pos == keep_arg_pos) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
450 buffer.write((char*) ss.raw_bytes(), |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
451 (int) ss.raw_length()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
452 } else if (bt == T_OBJECT || bt == T_ARRAY) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
453 buffer.write(OBJ_SIG, OBJ_SIG_LEN); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
454 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
455 if (is_subword_type(bt)) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
456 bt = T_INT; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
457 buffer.put(type2char(bt)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
458 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
459 arg_pos++; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
460 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
461 const char* sigstr = buffer.base(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
462 int siglen = (int) buffer.size(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
463 bsig = SymbolTable::new_symbol(sigstr, siglen, THREAD); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
464 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
465 assert(is_basic_type_signature(bsig) || |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
466 // detune assert in case the injected argument is not a basic type: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
467 keep_last_arg, ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
468 return bsig; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
469 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
470 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
471 void MethodHandles::print_as_basic_type_signature_on(outputStream* st, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
472 Symbol* sig, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
473 bool keep_arrays, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
474 bool keep_basic_names) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
475 st = st ? st : tty; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
476 int len = sig->utf8_length(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
477 int array = 0; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
478 bool prev_type = false; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
479 for (int i = 0; i < len; i++) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
480 char ch = sig->byte_at(i); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
481 switch (ch) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
482 case '(': case ')': |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
483 prev_type = false; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
484 st->put(ch); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
485 continue; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
486 case '[': |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
487 if (!keep_basic_names && keep_arrays) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
488 st->put(ch); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
489 array++; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
490 continue; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
491 case 'L': |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
492 { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
493 if (prev_type) st->put(','); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
494 int start = i+1, slash = start; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
495 while (++i < len && (ch = sig->byte_at(i)) != ';') { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
496 if (ch == '/' || ch == '.' || ch == '$') slash = i+1; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
497 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
498 if (slash < i) start = slash; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
499 if (!keep_basic_names) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
500 st->put('L'); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
501 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
502 for (int j = start; j < i; j++) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
503 st->put(sig->byte_at(j)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
504 prev_type = true; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
505 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
506 break; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
507 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
508 default: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
509 { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
510 if (array && char2type(ch) != T_ILLEGAL && !keep_arrays) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
511 ch = '['; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
512 array = 0; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
513 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
514 if (prev_type) st->put(','); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
515 const char* n = NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
516 if (keep_basic_names) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
517 n = type2name(char2type(ch)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
518 if (n == NULL) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
519 // unknown letter, or we don't want to know its name |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
520 st->put(ch); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
521 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
522 st->print(n); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
523 prev_type = true; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
524 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
525 break; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
526 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
527 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
528 // Switch break goes here to take care of array suffix: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
529 if (prev_type) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
530 while (array > 0) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
531 st->print("[]"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
532 --array; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
533 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
534 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
535 array = 0; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
536 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
537 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
538 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
539 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
540 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
541 static oop object_java_mirror() { |
6983 | 542 return SystemDictionary::Object_klass()->java_mirror(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
543 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
544 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
545 static oop field_name_or_null(Symbol* s) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
546 if (s == NULL) return NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
547 return StringTable::lookup(s); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
548 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
549 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
550 static oop field_signature_type_or_null(Symbol* s) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
551 if (s == NULL) return NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
552 BasicType bt = FieldType::basic_type(s); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
553 if (is_java_primitive(bt)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
554 assert(s->utf8_length() == 1, ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
555 return java_lang_Class::primitive_mirror(bt); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
556 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
557 // Here are some more short cuts for common types. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
558 // They are optional, since reference types can be resolved lazily. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
559 if (bt == T_OBJECT) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
560 if (s == vmSymbols::object_signature()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
561 return object_java_mirror(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
562 } else if (s == vmSymbols::class_signature()) { |
6983 | 563 return SystemDictionary::Class_klass()->java_mirror(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
564 } else if (s == vmSymbols::string_signature()) { |
6983 | 565 return SystemDictionary::String_klass()->java_mirror(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
566 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
567 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
568 return NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
569 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
570 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
571 |
710 | 572 // An unresolved member name is a mere symbolic reference. |
573 // Resolving it plants a vmtarget/vmindex in it, | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
574 // which refers directly to JVM internals. |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
575 Handle MethodHandles::resolve_MemberName(Handle mname, TRAPS) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
576 Handle empty; |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
577 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
578 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
579 if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
580 // Already resolved. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
581 DEBUG_ONLY(int vmindex = java_lang_invoke_MemberName::vmindex(mname())); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
582 assert(vmindex >= Method::nonvirtual_vtable_index, ""); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
583 return mname; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
584 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
585 |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
586 Handle defc_oop(THREAD, java_lang_invoke_MemberName::clazz(mname())); |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
587 Handle name_str(THREAD, java_lang_invoke_MemberName::name( mname())); |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
588 Handle type_str(THREAD, java_lang_invoke_MemberName::type( mname())); |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
589 int flags = java_lang_invoke_MemberName::flags(mname()); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
590 int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
591 if (!ref_kind_is_valid(ref_kind)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
592 THROW_MSG_(vmSymbols::java_lang_InternalError(), "obsolete MemberName format", empty); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
593 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
594 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
595 DEBUG_ONLY(int old_vmindex); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
596 assert((old_vmindex = java_lang_invoke_MemberName::vmindex(mname())) == 0, "clean input"); |
710 | 597 |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
598 if (defc_oop.is_null() || name_str.is_null() || type_str.is_null()) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
599 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "nothing to resolve", empty); |
710 | 600 } |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
601 |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
602 instanceKlassHandle defc; |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
603 { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
604 Klass* defc_klass = java_lang_Class::as_Klass(defc_oop()); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
605 if (defc_klass == NULL) return empty; // a primitive; no resolution possible |
6983 | 606 if (!defc_klass->oop_is_instance()) { |
607 if (!defc_klass->oop_is_array()) return empty; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
608 defc_klass = SystemDictionary::Object_klass(); |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
609 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
610 defc = instanceKlassHandle(THREAD, defc_klass); |
710 | 611 } |
612 if (defc.is_null()) { | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
613 THROW_MSG_(vmSymbols::java_lang_InternalError(), "primitive class", empty); |
710 | 614 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
615 defc->link_class(CHECK_(empty)); // possible safepoint |
710 | 616 |
617 // convert the external string name to an internal symbol | |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
618 TempNewSymbol name = java_lang_String::as_symbol_or_null(name_str()); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
619 if (name == NULL) return empty; // no such name |
3781
d83ac25d0304
7055355: JSR 292: crash while throwing WrongMethodTypeException
never
parents:
3757
diff
changeset
|
620 if (name == vmSymbols::class_initializer_name()) |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
621 return empty; // illegal name |
710 | 622 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
623 vmIntrinsics::ID mh_invoke_id = vmIntrinsics::_none; |
1508
2ffde6cfe049
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
1507
diff
changeset
|
624 if ((flags & ALL_KINDS) == IS_METHOD && |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
625 (defc() == SystemDictionary::MethodHandle_klass()) && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
626 (ref_kind == JVM_REF_invokeVirtual || |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
627 ref_kind == JVM_REF_invokeSpecial || |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
628 // static invocation mode is required for _linkToVirtual, etc.: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
629 ref_kind == JVM_REF_invokeStatic)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
630 vmIntrinsics::ID iid = signature_polymorphic_name_id(name); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
631 if (iid != vmIntrinsics::_none && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
632 ((ref_kind == JVM_REF_invokeStatic) == is_signature_polymorphic_static(iid))) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
633 // Virtual methods invoke and invokeExact, plus internal invokers like _invokeBasic. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
634 // For a static reference it could an internal linkage routine like _linkToVirtual, etc. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
635 mh_invoke_id = iid; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
636 } |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
637 } |
1508
2ffde6cfe049
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
1507
diff
changeset
|
638 |
710 | 639 // convert the external string or reflective type to an internal signature |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
640 TempNewSymbol type = lookup_signature(type_str(), (mh_invoke_id != vmIntrinsics::_none), CHECK_(empty)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
641 if (type == NULL) return empty; // no such signature exists in the VM |
710 | 642 |
643 // Time to do the lookup. | |
644 switch (flags & ALL_KINDS) { | |
645 case IS_METHOD: | |
646 { | |
647 CallInfo result; | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
648 bool do_dispatch = true; // default, neutral setting |
710 | 649 { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
650 assert(!HAS_PENDING_EXCEPTION, ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
651 if (ref_kind == JVM_REF_invokeStatic) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
652 //do_dispatch = false; // no need, since statics are never dispatched |
710 | 653 LinkResolver::resolve_static_call(result, |
654 defc, name, type, KlassHandle(), false, false, THREAD); | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
655 } else if (ref_kind == JVM_REF_invokeInterface) { |
710 | 656 LinkResolver::resolve_interface_call(result, Handle(), defc, |
657 defc, name, type, KlassHandle(), false, false, THREAD); | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
658 } else if (mh_invoke_id != vmIntrinsics::_none) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
659 assert(!is_signature_polymorphic_static(mh_invoke_id), ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
660 LinkResolver::resolve_handle_call(result, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
661 defc, name, type, KlassHandle(), THREAD); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
662 } else if (ref_kind == JVM_REF_invokeSpecial) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
663 do_dispatch = false; // force non-virtual linkage |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
664 LinkResolver::resolve_special_call(result, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
665 defc, name, type, KlassHandle(), false, THREAD); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
666 } else if (ref_kind == JVM_REF_invokeVirtual) { |
710 | 667 LinkResolver::resolve_virtual_call(result, Handle(), defc, |
668 defc, name, type, KlassHandle(), false, false, THREAD); | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
669 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
670 assert(false, err_msg("ref_kind=%d", ref_kind)); |
710 | 671 } |
672 if (HAS_PENDING_EXCEPTION) { | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
673 return empty; |
710 | 674 } |
675 } | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
676 return init_method_MemberName(mname(), result, THREAD); |
710 | 677 } |
678 case IS_CONSTRUCTOR: | |
679 { | |
680 CallInfo result; | |
681 { | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
682 assert(!HAS_PENDING_EXCEPTION, ""); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
683 if (name == vmSymbols::object_initializer_name()) { |
710 | 684 LinkResolver::resolve_special_call(result, |
685 defc, name, type, KlassHandle(), false, THREAD); | |
686 } else { | |
687 break; // will throw after end of switch | |
688 } | |
689 if (HAS_PENDING_EXCEPTION) { | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
690 return empty; |
710 | 691 } |
692 } | |
693 assert(result.is_statically_bound(), ""); | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
694 return init_method_MemberName(mname(), result, THREAD); |
710 | 695 } |
696 case IS_FIELD: | |
697 { | |
698 // This is taken from LinkResolver::resolve_field, sans access checks. | |
699 fieldDescriptor fd; // find_field initializes fd if found | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
700 KlassHandle sel_klass(THREAD, InstanceKlass::cast(defc())->find_field(name, type, &fd)); |
710 | 701 // check if field exists; i.e., if a klass containing the field def has been selected |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
702 if (sel_klass.is_null()) return empty; // should not happen |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
703 oop type = field_signature_type_or_null(fd.signature()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
704 oop name = field_name_or_null(fd.name()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
705 bool is_setter = (ref_kind_is_valid(ref_kind) && ref_kind_is_setter(ref_kind)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
706 mname = Handle(THREAD, |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
707 init_field_MemberName(mname(), sel_klass(), |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
708 fd.access_flags(), type, name, fd.offset(), is_setter)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
709 return mname; |
710 | 710 } |
1508
2ffde6cfe049
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
1507
diff
changeset
|
711 default: |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
712 THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format", empty); |
710 | 713 } |
1508
2ffde6cfe049
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
1507
diff
changeset
|
714 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
715 return empty; |
710 | 716 } |
717 | |
718 // Conversely, a member name which is only initialized from JVM internals | |
719 // may have null defc, name, and type fields. | |
720 // Resolving it plants a vmtarget/vmindex in it, | |
721 // which refers directly to JVM internals. | |
722 void MethodHandles::expand_MemberName(Handle mname, int suppress, TRAPS) { | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
723 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
724 Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
725 int vmindex = java_lang_invoke_MemberName::vmindex(mname()); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
726 if (vmtarget == NULL) { |
710 | 727 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nothing to expand"); |
728 } | |
729 | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
730 bool have_defc = (java_lang_invoke_MemberName::clazz(mname()) != NULL); |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
731 bool have_name = (java_lang_invoke_MemberName::name(mname()) != NULL); |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
732 bool have_type = (java_lang_invoke_MemberName::type(mname()) != NULL); |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
733 int flags = java_lang_invoke_MemberName::flags(mname()); |
710 | 734 |
735 if (suppress != 0) { | |
736 if (suppress & _suppress_defc) have_defc = true; | |
737 if (suppress & _suppress_name) have_name = true; | |
738 if (suppress & _suppress_type) have_type = true; | |
739 } | |
740 | |
741 if (have_defc && have_name && have_type) return; // nothing needed | |
742 | |
743 switch (flags & ALL_KINDS) { | |
744 case IS_METHOD: | |
745 case IS_CONSTRUCTOR: | |
746 { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
747 assert(vmtarget->is_method(), "method or constructor vmtarget is Method*"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
748 methodHandle m(THREAD, (Method*)vmtarget); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
749 DEBUG_ONLY(vmtarget = NULL); // safety |
710 | 750 if (m.is_null()) break; |
751 if (!have_defc) { | |
6940
18fb7da42534
8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents:
6852
diff
changeset
|
752 InstanceKlass* defc = m->method_holder(); |
18fb7da42534
8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents:
6852
diff
changeset
|
753 java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror()); |
710 | 754 } |
755 if (!have_name) { | |
756 //not java_lang_String::create_from_symbol; let's intern member names | |
757 Handle name = StringTable::intern(m->name(), CHECK); | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
758 java_lang_invoke_MemberName::set_name(mname(), name()); |
710 | 759 } |
760 if (!have_type) { | |
761 Handle type = java_lang_String::create_from_symbol(m->signature(), CHECK); | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
762 java_lang_invoke_MemberName::set_type(mname(), type()); |
710 | 763 } |
764 return; | |
765 } | |
766 case IS_FIELD: | |
767 { | |
768 // This is taken from LinkResolver::resolve_field, sans access checks. | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
769 assert(vmtarget->is_klass(), "field vmtarget is Klass*"); |
6983 | 770 if (!((Klass*) vmtarget)->oop_is_instance()) break; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
771 instanceKlassHandle defc(THREAD, (Klass*) vmtarget); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
772 DEBUG_ONLY(vmtarget = NULL); // safety |
710 | 773 bool is_static = ((flags & JVM_ACC_STATIC) != 0); |
774 fieldDescriptor fd; // find_field initializes fd if found | |
775 if (!defc->find_field_from_offset(vmindex, is_static, &fd)) | |
776 break; // cannot expand | |
777 if (!have_defc) { | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
778 java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror()); |
710 | 779 } |
780 if (!have_name) { | |
781 //not java_lang_String::create_from_symbol; let's intern member names | |
782 Handle name = StringTable::intern(fd.name(), CHECK); | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
783 java_lang_invoke_MemberName::set_name(mname(), name()); |
710 | 784 } |
785 if (!have_type) { | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
786 // If it is a primitive field type, don't mess with short strings like "I". |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
787 Handle type = field_signature_type_or_null(fd.signature()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
788 if (type.is_null()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
789 java_lang_String::create_from_symbol(fd.signature(), CHECK); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
790 } |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
791 java_lang_invoke_MemberName::set_type(mname(), type()); |
710 | 792 } |
793 return; | |
794 } | |
795 } | |
796 THROW_MSG(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format"); | |
797 } | |
798 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
799 int MethodHandles::find_MemberNames(Klass* k, |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
800 Symbol* name, Symbol* sig, |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
801 int mflags, Klass* caller, |
710 | 802 int skip, objArrayOop results) { |
803 DEBUG_ONLY(No_Safepoint_Verifier nsv); | |
804 // this code contains no safepoints! | |
805 | |
806 // %%% take caller into account! | |
807 | |
6983 | 808 if (k == NULL || !k->oop_is_instance()) return -1; |
710 | 809 |
810 int rfill = 0, rlimit = results->length(), rskip = skip; | |
811 // overflow measurement: | |
812 int overflow = 0, overflow_limit = MAX2(1000, rlimit); | |
813 | |
814 int match_flags = mflags; | |
815 bool search_superc = ((match_flags & SEARCH_SUPERCLASSES) != 0); | |
816 bool search_intfc = ((match_flags & SEARCH_INTERFACES) != 0); | |
817 bool local_only = !(search_superc | search_intfc); | |
818 bool classes_only = false; | |
819 | |
820 if (name != NULL) { | |
821 if (name->utf8_length() == 0) return 0; // a match is not possible | |
822 } | |
823 if (sig != NULL) { | |
824 if (sig->utf8_length() == 0) return 0; // a match is not possible | |
825 if (sig->byte_at(0) == '(') | |
826 match_flags &= ~(IS_FIELD | IS_TYPE); | |
827 else | |
828 match_flags &= ~(IS_CONSTRUCTOR | IS_METHOD); | |
829 } | |
830 | |
831 if ((match_flags & IS_TYPE) != 0) { | |
832 // NYI, and Core Reflection works quite well for this query | |
833 } | |
834 | |
835 if ((match_flags & IS_FIELD) != 0) { | |
836 for (FieldStream st(k, local_only, !search_intfc); !st.eos(); st.next()) { | |
837 if (name != NULL && st.name() != name) | |
838 continue; | |
839 if (sig != NULL && st.signature() != sig) | |
840 continue; | |
841 // passed the filters | |
842 if (rskip > 0) { | |
843 --rskip; | |
844 } else if (rfill < rlimit) { | |
845 oop result = results->obj_at(rfill++); | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
846 if (!java_lang_invoke_MemberName::is_instance(result)) |
710 | 847 return -99; // caller bug! |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
848 oop type = field_signature_type_or_null(st.signature()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
849 oop name = field_name_or_null(st.name()); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
850 oop saved = MethodHandles::init_field_MemberName(result, st.klass()(), |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
851 st.access_flags(), type, name, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
852 st.offset()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
853 if (saved != result) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
854 results->obj_at_put(rfill-1, saved); // show saved instance to user |
710 | 855 } else if (++overflow >= overflow_limit) { |
856 match_flags = 0; break; // got tired of looking at overflow | |
857 } | |
858 } | |
859 } | |
860 | |
861 if ((match_flags & (IS_METHOD | IS_CONSTRUCTOR)) != 0) { | |
862 // watch out for these guys: | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
863 Symbol* init_name = vmSymbols::object_initializer_name(); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
864 Symbol* clinit_name = vmSymbols::class_initializer_name(); |
710 | 865 if (name == clinit_name) clinit_name = NULL; // hack for exposing <clinit> |
866 bool negate_name_test = false; | |
867 // fix name so that it captures the intention of IS_CONSTRUCTOR | |
868 if (!(match_flags & IS_METHOD)) { | |
869 // constructors only | |
870 if (name == NULL) { | |
871 name = init_name; | |
872 } else if (name != init_name) { | |
873 return 0; // no constructors of this method name | |
874 } | |
875 } else if (!(match_flags & IS_CONSTRUCTOR)) { | |
876 // methods only | |
877 if (name == NULL) { | |
878 name = init_name; | |
879 negate_name_test = true; // if we see the name, we *omit* the entry | |
880 } else if (name == init_name) { | |
881 return 0; // no methods of this constructor name | |
882 } | |
883 } else { | |
884 // caller will accept either sort; no need to adjust name | |
885 } | |
886 for (MethodStream st(k, local_only, !search_intfc); !st.eos(); st.next()) { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
887 Method* m = st.method(); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
888 Symbol* m_name = m->name(); |
710 | 889 if (m_name == clinit_name) |
890 continue; | |
891 if (name != NULL && ((m_name != name) ^ negate_name_test)) | |
892 continue; | |
893 if (sig != NULL && m->signature() != sig) | |
894 continue; | |
895 // passed the filters | |
896 if (rskip > 0) { | |
897 --rskip; | |
898 } else if (rfill < rlimit) { | |
899 oop result = results->obj_at(rfill++); | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
900 if (!java_lang_invoke_MemberName::is_instance(result)) |
710 | 901 return -99; // caller bug! |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
902 oop saved = MethodHandles::init_method_MemberName(result, m, true, NULL); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
903 if (saved != result) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
904 results->obj_at_put(rfill-1, saved); // show saved instance to user |
710 | 905 } else if (++overflow >= overflow_limit) { |
906 match_flags = 0; break; // got tired of looking at overflow | |
907 } | |
908 } | |
909 } | |
910 | |
911 // return number of elements we at leasted wanted to initialize | |
912 return rfill + overflow; | |
913 } | |
914 // | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
915 // Here are the native methods in java.lang.invoke.MethodHandleNatives |
710 | 916 // They are the private interface between this JVM and the HotSpot-specific |
917 // Java code that implements JSR 292 method handles. | |
918 // | |
919 // Note: We use a JVM_ENTRY macro to define each of these, for this is the way | |
920 // that intrinsic (non-JNI) native methods are defined in HotSpot. | |
921 // | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
922 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
923 JVM_ENTRY(jint, MHN_getConstant(JNIEnv *env, jobject igcls, jint which)) { |
710 | 924 switch (which) { |
3905
c26de9aef2ed
7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents:
3837
diff
changeset
|
925 case MethodHandles::GC_COUNT_GWT: |
c26de9aef2ed
7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents:
3837
diff
changeset
|
926 #ifdef COMPILER2 |
c26de9aef2ed
7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents:
3837
diff
changeset
|
927 return true; |
c26de9aef2ed
7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents:
3837
diff
changeset
|
928 #else |
c26de9aef2ed
7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents:
3837
diff
changeset
|
929 return false; |
c26de9aef2ed
7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents:
3837
diff
changeset
|
930 #endif |
710 | 931 } |
932 return 0; | |
933 } | |
934 JVM_END | |
935 | |
936 #ifndef PRODUCT | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
937 #define EACH_NAMED_CON(template, requirement) \ |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
938 template(MethodHandles,GC_COUNT_GWT) \ |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
939 template(java_lang_invoke_MemberName,MN_IS_METHOD) \ |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
940 template(java_lang_invoke_MemberName,MN_IS_CONSTRUCTOR) \ |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
941 template(java_lang_invoke_MemberName,MN_IS_FIELD) \ |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
942 template(java_lang_invoke_MemberName,MN_IS_TYPE) \ |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
943 template(java_lang_invoke_MemberName,MN_SEARCH_SUPERCLASSES) \ |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
944 template(java_lang_invoke_MemberName,MN_SEARCH_INTERFACES) \ |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
945 template(java_lang_invoke_MemberName,MN_REFERENCE_KIND_SHIFT) \ |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
946 template(java_lang_invoke_MemberName,MN_REFERENCE_KIND_MASK) \ |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
947 template(MethodHandles,GC_LAMBDA_SUPPORT) \ |
710 | 948 /*end*/ |
949 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
950 #define IGNORE_REQ(req_expr) /* req_expr */ |
710 | 951 #define ONE_PLUS(scope,value) 1+ |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
952 static const int con_value_count = EACH_NAMED_CON(ONE_PLUS, IGNORE_REQ) 0; |
710 | 953 #define VALUE_COMMA(scope,value) scope::value, |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
954 static const int con_values[con_value_count+1] = { EACH_NAMED_CON(VALUE_COMMA, IGNORE_REQ) 0 }; |
710 | 955 #define STRING_NULL(scope,value) #value "\0" |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
956 static const char con_names[] = { EACH_NAMED_CON(STRING_NULL, IGNORE_REQ) }; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
957 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
958 static bool advertise_con_value(int which) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
959 if (which < 0) return false; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
960 bool ok = true; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
961 int count = 0; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
962 #define INC_COUNT(scope,value) \ |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
963 ++count; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
964 #define CHECK_REQ(req_expr) \ |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
965 if (which < count) return ok; \ |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
966 ok = (req_expr); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
967 EACH_NAMED_CON(INC_COUNT, CHECK_REQ); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
968 #undef INC_COUNT |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
969 #undef CHECK_REQ |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
970 assert(count == con_value_count, ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
971 if (which < count) return ok; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
972 return false; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
973 } |
710 | 974 |
975 #undef ONE_PLUS | |
976 #undef VALUE_COMMA | |
977 #undef STRING_NULL | |
978 #undef EACH_NAMED_CON | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
979 #endif // PRODUCT |
710 | 980 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
981 JVM_ENTRY(jint, MHN_getNamedCon(JNIEnv *env, jobject igcls, jint which, jobjectArray box_jh)) { |
710 | 982 #ifndef PRODUCT |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
983 if (advertise_con_value(which)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
984 assert(which >= 0 && which < con_value_count, ""); |
710 | 985 int con = con_values[which]; |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
986 objArrayHandle box(THREAD, (objArrayOop) JNIHandles::resolve(box_jh)); |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
987 if (box.not_null() && box->klass() == Universe::objectArrayKlassObj() && box->length() > 0) { |
710 | 988 const char* str = &con_names[0]; |
989 for (int i = 0; i < which; i++) | |
990 str += strlen(str) + 1; // skip name and null | |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
991 oop name = java_lang_String::create_oop_from_str(str, CHECK_0); // possible safepoint |
710 | 992 box->obj_at_put(0, name); |
993 } | |
994 return con; | |
995 } | |
996 #endif | |
997 return 0; | |
998 } | |
999 JVM_END | |
1000 | |
1001 // void init(MemberName self, AccessibleObject ref) | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
1002 JVM_ENTRY(void, MHN_init_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jobject target_jh)) { |
3740
5ac411b3b8fc
7047961: JSR 292 MethodHandleWalk swap args doesn't handle T_LONG and T_DOUBLE properly
never
parents:
3389
diff
changeset
|
1003 if (mname_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "mname is null"); } |
5ac411b3b8fc
7047961: JSR 292 MethodHandleWalk swap args doesn't handle T_LONG and T_DOUBLE properly
never
parents:
3389
diff
changeset
|
1004 if (target_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "target is null"); } |
710 | 1005 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1006 oop target_oop = JNIHandles::resolve_non_null(target_jh); | |
1007 MethodHandles::init_MemberName(mname(), target_oop); | |
1008 } | |
1009 JVM_END | |
1010 | |
1011 // void expand(MemberName self) | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
1012 JVM_ENTRY(void, MHN_expand_Mem(JNIEnv *env, jobject igcls, jobject mname_jh)) { |
3740
5ac411b3b8fc
7047961: JSR 292 MethodHandleWalk swap args doesn't handle T_LONG and T_DOUBLE properly
never
parents:
3389
diff
changeset
|
1013 if (mname_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "mname is null"); } |
710 | 1014 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1015 MethodHandles::expand_MemberName(mname, 0, CHECK); | |
1016 } | |
1017 JVM_END | |
1018 | |
1019 // void resolve(MemberName self, Class<?> caller) | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1020 JVM_ENTRY(jobject, MHN_resolve_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jclass caller_jh)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1021 if (mname_jh == NULL) { THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "mname is null"); } |
710 | 1022 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1023 |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1024 // The trusted Java code that calls this method should already have performed |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1025 // access checks on behalf of the given caller. But, we can verify this. |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1026 if (VerifyMethodHandles && caller_jh != NULL && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1027 java_lang_invoke_MemberName::clazz(mname()) != NULL) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
1028 Klass* reference_klass = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(mname())); |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1029 if (reference_klass != NULL) { |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1030 // Emulate LinkResolver::check_klass_accessability. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
1031 Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh)); |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1032 if (!Reflection::verify_class_access(caller, |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1033 reference_klass, |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1034 true)) { |
6983 | 1035 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), reference_klass->external_name()); |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1036 } |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1037 } |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1038 } |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1299
diff
changeset
|
1039 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1040 Handle resolved = MethodHandles::resolve_MemberName(mname, CHECK_NULL); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1041 if (resolved.is_null()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1042 int flags = java_lang_invoke_MemberName::flags(mname()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1043 int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1044 if (!MethodHandles::ref_kind_is_valid(ref_kind)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1045 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "obsolete MemberName format"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1046 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1047 if ((flags & ALL_KINDS) == IS_FIELD) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1048 THROW_MSG_NULL(vmSymbols::java_lang_NoSuchMethodError(), "field resolution failed"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1049 } else if ((flags & ALL_KINDS) == IS_METHOD || |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1050 (flags & ALL_KINDS) == IS_CONSTRUCTOR) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1051 THROW_MSG_NULL(vmSymbols::java_lang_NoSuchFieldError(), "method resolution failed"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1052 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1053 THROW_MSG_NULL(vmSymbols::java_lang_LinkageError(), "resolution failed"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1054 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1055 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1056 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1057 return JNIHandles::make_local(THREAD, resolved()); |
710 | 1058 } |
1059 JVM_END | |
1060 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1061 static jlong find_member_field_offset(oop mname, bool must_be_static, TRAPS) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1062 if (mname == NULL || |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1063 java_lang_invoke_MemberName::vmtarget(mname) == NULL) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1064 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "mname not resolved"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1065 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1066 int flags = java_lang_invoke_MemberName::flags(mname); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1067 if ((flags & IS_FIELD) != 0 && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1068 (must_be_static |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1069 ? (flags & JVM_ACC_STATIC) != 0 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1070 : (flags & JVM_ACC_STATIC) == 0)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1071 int vmindex = java_lang_invoke_MemberName::vmindex(mname); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1072 return (jlong) vmindex; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1073 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1074 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1075 const char* msg = (must_be_static ? "static field required" : "non-static field required"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1076 THROW_MSG_0(vmSymbols::java_lang_InternalError(), msg); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1077 return 0; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1078 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1079 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1080 JVM_ENTRY(jlong, MHN_objectFieldOffset(JNIEnv *env, jobject igcls, jobject mname_jh)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1081 return find_member_field_offset(JNIHandles::resolve(mname_jh), false, THREAD); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1082 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1083 JVM_END |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1084 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1085 JVM_ENTRY(jlong, MHN_staticFieldOffset(JNIEnv *env, jobject igcls, jobject mname_jh)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1086 return find_member_field_offset(JNIHandles::resolve(mname_jh), true, THREAD); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1087 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1088 JVM_END |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1089 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1090 JVM_ENTRY(jobject, MHN_staticFieldBase(JNIEnv *env, jobject igcls, jobject mname_jh)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1091 // use the other function to perform sanity checks: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1092 jlong ignore = find_member_field_offset(JNIHandles::resolve(mname_jh), true, CHECK_NULL); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1093 oop clazz = java_lang_invoke_MemberName::clazz(JNIHandles::resolve_non_null(mname_jh)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1094 return JNIHandles::make_local(THREAD, clazz); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1095 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1096 JVM_END |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1097 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1098 JVM_ENTRY(jobject, MHN_getMemberVMInfo(JNIEnv *env, jobject igcls, jobject mname_jh)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1099 if (mname_jh == NULL) return NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1100 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1101 intptr_t vmindex = java_lang_invoke_MemberName::vmindex(mname()); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
1102 Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1103 objArrayHandle result = oopFactory::new_objArray(SystemDictionary::Object_klass(), 2, CHECK_NULL); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1104 jvalue vmindex_value; vmindex_value.j = (long)vmindex; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1105 oop x = java_lang_boxing_object::create(T_LONG, &vmindex_value, CHECK_NULL); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1106 result->obj_at_put(0, x); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1107 x = NULL; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
1108 if (vmtarget == NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
1109 x = NULL; |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1110 } else if (vmtarget->is_klass()) { |
6983 | 1111 x = ((Klass*) vmtarget)->java_mirror(); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
1112 } else if (vmtarget->is_method()) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1113 Handle mname2 = MethodHandles::new_MemberName(CHECK_NULL); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
1114 x = MethodHandles::init_method_MemberName(mname2(), (Method*)vmtarget, false, NULL); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1115 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1116 result->obj_at_put(1, x); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1117 return JNIHandles::make_local(env, result()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1118 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1119 JVM_END |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1120 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1121 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1122 |
710 | 1123 // static native int getMembers(Class<?> defc, String matchName, String matchSig, |
1124 // int matchFlags, Class<?> caller, int skip, MemberName[] results); | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
1125 JVM_ENTRY(jint, MHN_getMembers(JNIEnv *env, jobject igcls, |
710 | 1126 jclass clazz_jh, jstring name_jh, jstring sig_jh, |
1127 int mflags, jclass caller_jh, jint skip, jobjectArray results_jh)) { | |
1128 if (clazz_jh == NULL || results_jh == NULL) return -1; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
1129 KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz_jh))); |
710 | 1130 |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
1131 objArrayHandle results(THREAD, (objArrayOop) JNIHandles::resolve(results_jh)); |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
1132 if (results.is_null() || !results->is_objArray()) return -1; |
710 | 1133 |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
1134 TempNewSymbol name = NULL; |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
1135 TempNewSymbol sig = NULL; |
710 | 1136 if (name_jh != NULL) { |
1137 name = java_lang_String::as_symbol_or_null(JNIHandles::resolve_non_null(name_jh)); | |
1138 if (name == NULL) return 0; // a match is not possible | |
1139 } | |
1140 if (sig_jh != NULL) { | |
1141 sig = java_lang_String::as_symbol_or_null(JNIHandles::resolve_non_null(sig_jh)); | |
1142 if (sig == NULL) return 0; // a match is not possible | |
1143 } | |
1144 | |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
1145 KlassHandle caller; |
710 | 1146 if (caller_jh != NULL) { |
1147 oop caller_oop = JNIHandles::resolve_non_null(caller_jh); | |
1148 if (!java_lang_Class::is_instance(caller_oop)) return -1; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6271
diff
changeset
|
1149 caller = KlassHandle(THREAD, java_lang_Class::as_Klass(caller_oop)); |
710 | 1150 } |
1151 | |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
1152 if (name != NULL && sig != NULL && results.not_null()) { |
710 | 1153 // try a direct resolve |
1154 // %%% TO DO | |
1155 } | |
1156 | |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
1157 int res = MethodHandles::find_MemberNames(k(), name, sig, mflags, |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2478
diff
changeset
|
1158 caller(), skip, results()); |
710 | 1159 // TO DO: expand at least some of the MemberNames, to avoid massive callbacks |
1160 return res; | |
1161 } | |
1162 JVM_END | |
1163 | |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1164 JVM_ENTRY(void, MHN_setCallSiteTargetNormal(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) { |
4043
12d38ffcba2a
7094138: JSR 292: JRuby junit test fails in CallSite.setTargetNormal: obj->is_oop() failed: sanity check
twisti
parents:
3938
diff
changeset
|
1165 Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh)); |
12d38ffcba2a
7094138: JSR 292: JRuby junit test fails in CallSite.setTargetNormal: obj->is_oop() failed: sanity check
twisti
parents:
3938
diff
changeset
|
1166 Handle target (THREAD, JNIHandles::resolve(target_jh)); |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1167 { |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1168 // Walk all nmethods depending on this call site. |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1169 MutexLocker mu(Compile_lock, thread); |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1170 Universe::flush_dependents_on(call_site, target); |
7418
5c0931d15474
8003238: JSR 292: intermittent exception failure with java/lang/invoke/CallSiteTest.java
twisti
parents:
6983
diff
changeset
|
1171 java_lang_invoke_CallSite::set_target(call_site(), target()); |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1172 } |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1173 } |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1174 JVM_END |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1175 |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1176 JVM_ENTRY(void, MHN_setCallSiteTargetVolatile(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) { |
4043
12d38ffcba2a
7094138: JSR 292: JRuby junit test fails in CallSite.setTargetNormal: obj->is_oop() failed: sanity check
twisti
parents:
3938
diff
changeset
|
1177 Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh)); |
12d38ffcba2a
7094138: JSR 292: JRuby junit test fails in CallSite.setTargetNormal: obj->is_oop() failed: sanity check
twisti
parents:
3938
diff
changeset
|
1178 Handle target (THREAD, JNIHandles::resolve(target_jh)); |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1179 { |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1180 // Walk all nmethods depending on this call site. |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1181 MutexLocker mu(Compile_lock, thread); |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1182 Universe::flush_dependents_on(call_site, target); |
7418
5c0931d15474
8003238: JSR 292: intermittent exception failure with java/lang/invoke/CallSiteTest.java
twisti
parents:
6983
diff
changeset
|
1183 java_lang_invoke_CallSite::set_target_volatile(call_site(), target()); |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1184 } |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1185 } |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1186 JVM_END |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1187 |
710 | 1188 /// JVM_RegisterMethodHandleMethods |
1189 | |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1190 #undef CS // Solaris builds complain |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1191 |
710 | 1192 #define LANG "Ljava/lang/" |
2460 | 1193 #define JLINV "Ljava/lang/invoke/" |
710 | 1194 |
1195 #define OBJ LANG"Object;" | |
1196 #define CLS LANG"Class;" | |
1197 #define STRG LANG"String;" | |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1198 #define CS JLINV"CallSite;" |
2460 | 1199 #define MT JLINV"MethodType;" |
1200 #define MH JLINV"MethodHandle;" | |
1201 #define MEM JLINV"MemberName;" | |
710 | 1202 |
1203 #define CC (char*) /*cast a literal from (const char*)*/ | |
1204 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f) | |
1205 | |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1206 // These are the native methods on java.lang.invoke.MethodHandleNatives. |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1207 static JNINativeMethod required_methods_JDK8[] = { |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1208 {CC"init", CC"("MEM""OBJ")V", FN_PTR(MHN_init_Mem)}, |
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1209 {CC"expand", CC"("MEM")V", FN_PTR(MHN_expand_Mem)}, |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1210 {CC"resolve", CC"("MEM""CLS")"MEM, FN_PTR(MHN_resolve_Mem)}, |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1211 {CC"getConstant", CC"(I)I", FN_PTR(MHN_getConstant)}, |
710 | 1212 // static native int getNamedCon(int which, Object[] name) |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1213 {CC"getNamedCon", CC"(I["OBJ")I", FN_PTR(MHN_getNamedCon)}, |
710 | 1214 // static native int getMembers(Class<?> defc, String matchName, String matchSig, |
1215 // int matchFlags, Class<?> caller, int skip, MemberName[] results); | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1216 {CC"getMembers", CC"("CLS""STRG""STRG"I"CLS"I["MEM")I", FN_PTR(MHN_getMembers)}, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1217 {CC"objectFieldOffset", CC"("MEM")J", FN_PTR(MHN_objectFieldOffset)}, |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1218 {CC"setCallSiteTargetNormal", CC"("CS""MH")V", FN_PTR(MHN_setCallSiteTargetNormal)}, |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1219 {CC"setCallSiteTargetVolatile", CC"("CS""MH")V", FN_PTR(MHN_setCallSiteTargetVolatile)}, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1220 {CC"staticFieldOffset", CC"("MEM")J", FN_PTR(MHN_staticFieldOffset)}, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1221 {CC"staticFieldBase", CC"("MEM")"OBJ, FN_PTR(MHN_staticFieldBase)}, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1222 {CC"getMemberVMInfo", CC"("MEM")"OBJ, FN_PTR(MHN_getMemberVMInfo)} |
710 | 1223 }; |
1224 | |
1225 // This one function is exported, used by NativeLookup. | |
1226 | |
1227 JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { | |
2416
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2357
diff
changeset
|
1228 if (!EnableInvokeDynamic) { |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2357
diff
changeset
|
1229 warning("JSR 292 is disabled in this JVM. Use -XX:+UnlockDiagnosticVMOptions -XX:+EnableInvokeDynamic to enable."); |
710 | 1230 return; // bind nothing |
1231 } | |
1232 | |
3932
b0efc7ee3b31
7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents:
3905
diff
changeset
|
1233 assert(!MethodHandles::enabled(), "must not be enabled"); |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
726
diff
changeset
|
1234 bool enable_MH = true; |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
726
diff
changeset
|
1235 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1236 jclass MH_class = NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1237 if (SystemDictionary::MethodHandle_klass() == NULL) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1238 enable_MH = false; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1239 } else { |
6983 | 1240 oop mirror = SystemDictionary::MethodHandle_klass()->java_mirror(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1241 MH_class = (jclass) JNIHandles::make_local(env, mirror); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1242 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1243 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1244 int status; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1245 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1246 if (enable_MH) { |
710 | 1247 ThreadToNativeFromVM ttnfv(thread); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1248 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1249 status = env->RegisterNatives(MHN_class, required_methods_JDK8, sizeof(required_methods_JDK8)/sizeof(JNINativeMethod)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1250 if (status != JNI_OK || env->ExceptionOccurred()) { |
2460 | 1251 warning("JSR 292 method handle code is mismatched to this JVM. Disabling support."); |
1252 enable_MH = false; | |
710 | 1253 env->ExceptionClear(); |
1254 } | |
1255 } | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
1256 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1257 if (TraceInvokeDynamic) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6224
diff
changeset
|
1258 tty->print_cr("MethodHandle support loaded (using LambdaForms)"); |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
726
diff
changeset
|
1259 } |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
726
diff
changeset
|
1260 |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
726
diff
changeset
|
1261 if (enable_MH) { |
2116
d810e9a3fc33
7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents:
2088
diff
changeset
|
1262 MethodHandles::generate_adapters(); |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
726
diff
changeset
|
1263 MethodHandles::set_enabled(true); |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
726
diff
changeset
|
1264 } |
710 | 1265 } |
1266 JVM_END |