annotate src/share/vm/prims/methodHandles.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 78bbf4d43a14
children 52b4284cb496 fe34c5ab0b35
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1 /*
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17479
diff changeset
2 * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
4 *
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
7 * published by the Free Software Foundation.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
8 *
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
13 * accompanied this code).
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
14 *
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
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
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
22 *
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
23 */
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1912
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1912
diff changeset
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
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1912
diff changeset
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
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1912
diff changeset
30 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1912
diff changeset
31 #include "memory/oopFactory.hpp"
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
32 #include "prims/jvmtiRedefineClassesTrace.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1912
diff changeset
33 #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
34 #include "runtime/compilationPolicy.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1912
diff changeset
35 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1912
diff changeset
36 #include "runtime/reflection.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1912
diff changeset
37 #include "runtime/signature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1912
diff changeset
38 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1912
diff changeset
39
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
40
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
41 /*
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
42 * 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
43 * 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
44 * 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
45 * 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
46 * 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
47 *
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
48 * 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
49 * 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
50 * 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
51 * 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
52 * by a runtime coded in Java.
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
53 */
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
54
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
55 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
56 MethodHandlesAdapterBlob* MethodHandles::_adapter_code = NULL;
1299
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 //------------------------------------------------------------------------------
9eba43136cb5 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1142
diff changeset
59 // MethodHandles::generate_adapters
9eba43136cb5 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1142
diff changeset
60 //
2116
d810e9a3fc33 7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents: 2088
diff changeset
61 void MethodHandles::generate_adapters() {
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2357
diff changeset
62 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
63
9eba43136cb5 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1142
diff changeset
64 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
65
9eba43136cb5 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1142
diff changeset
66 ResourceMark rm;
9eba43136cb5 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1142
diff changeset
67 TraceTime timer("MethodHandles adapters generation", TraceStartupTime);
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3744
diff changeset
68 _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
69 if (_adapter_code == NULL)
10161
746b070f5022 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 10137
diff changeset
70 vm_exit_out_of_memory(adapter_code_size, OOM_MALLOC_ERROR,
746b070f5022 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 10137
diff changeset
71 "CodeCache: no room for MethodHandles adapters");
4059
44ce519bc3d1 7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents: 4043
diff changeset
72 {
44ce519bc3d1 7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents: 4043
diff changeset
73 CodeBuffer code(_adapter_code);
44ce519bc3d1 7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents: 4043
diff changeset
74 MethodHandlesAdapterGenerator g(&code);
44ce519bc3d1 7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents: 4043
diff changeset
75 g.generate();
44ce519bc3d1 7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents: 4043
diff changeset
76 code.log_section_sizes("MethodHandlesAdapterBlob");
44ce519bc3d1 7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents: 4043
diff changeset
77 }
1299
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
9eba43136cb5 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1142
diff changeset
80 //------------------------------------------------------------------------------
9eba43136cb5 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1142
diff changeset
81 // MethodHandlesAdapterGenerator::generate
9eba43136cb5 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1142
diff changeset
82 //
2116
d810e9a3fc33 7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents: 2088
diff changeset
83 void MethodHandlesAdapterGenerator::generate() {
1299
9eba43136cb5 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1142
diff changeset
84 // 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
85 // Generate interpreter entries
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
86 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
87 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
88 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
89 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
90 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
91 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
92 if (entry != NULL) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
93 Interpreter::set_entry_for_kind(mk, entry);
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3274
diff changeset
94 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
95 // 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
96 }
9eba43136cb5 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1142
diff changeset
97 }
9eba43136cb5 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1142
diff changeset
98
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
99 void MethodHandles::set_enabled(bool z) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
100 if (_enabled != z) {
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2357
diff changeset
101 guarantee(z && EnableInvokeDynamic, "can only enable once, and only if -XX:+EnableInvokeDynamic");
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
102 _enabled = z;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
103 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
104 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
105
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
106 // MemberName support
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
107
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
108 // import java_lang_invoke_MemberName.*
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
109 enum {
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
110 IS_METHOD = java_lang_invoke_MemberName::MN_IS_METHOD,
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
111 IS_CONSTRUCTOR = java_lang_invoke_MemberName::MN_IS_CONSTRUCTOR,
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
112 IS_FIELD = java_lang_invoke_MemberName::MN_IS_FIELD,
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
113 IS_TYPE = java_lang_invoke_MemberName::MN_IS_TYPE,
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
114 CALLER_SENSITIVE = java_lang_invoke_MemberName::MN_CALLER_SENSITIVE,
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
115 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
116 REFERENCE_KIND_MASK = java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK,
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
117 SEARCH_SUPERCLASSES = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES,
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
118 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
119 ALL_KINDS = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
120 };
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
121
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
122 Handle MethodHandles::new_MemberName(TRAPS) {
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
123 Handle empty;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
124 instanceKlassHandle k(THREAD, SystemDictionary::MemberName_klass());
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
125 if (!k->is_initialized()) k->initialize(CHECK_(empty));
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
126 return Handle(THREAD, k->allocate_instance(THREAD));
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
127 }
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
128
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
129 oop MethodHandles::init_MemberName(Handle mname, Handle target) {
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
130 // This method is used from java.lang.invoke.MemberName constructors.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
131 // It fills in the new MemberName from a java.lang.reflect.Member.
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
132 Thread* thread = Thread::current();
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
133 oop target_oop = target();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
134 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
135 if (target_klass == SystemDictionary::reflect_Field_klass()) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
136 oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder()
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
137 int slot = java_lang_reflect_Field::slot(target_oop); // fd.index()
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
138 KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
139 if (!k.is_null() && k->oop_is_instance()) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
140 fieldDescriptor fd(InstanceKlass::cast(k()), slot);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
141 oop mname2 = init_field_MemberName(mname, fd);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
142 if (mname2 != NULL) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
143 // Since we have the reified name and type handy, add them to the result.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
144 if (java_lang_invoke_MemberName::name(mname2) == NULL)
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
145 java_lang_invoke_MemberName::set_name(mname2, java_lang_reflect_Field::name(target_oop));
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
146 if (java_lang_invoke_MemberName::type(mname2) == NULL)
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
147 java_lang_invoke_MemberName::set_type(mname2, java_lang_reflect_Field::type(target_oop));
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
148 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
149 return mname2;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
150 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
151 } 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
152 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
153 int slot = java_lang_reflect_Method::slot(target_oop);
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
154 KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
155 if (!k.is_null() && k->oop_is_instance()) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
156 Method* m = InstanceKlass::cast(k())->method_with_idnum(slot);
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
157 if (m == NULL || is_signature_polymorphic(m->intrinsic_id()))
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
158 return NULL; // do not resolve unless there is a concrete signature
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
159 CallInfo info(m, k());
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
160 return init_method_MemberName(mname, info);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
161 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
162 } 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
163 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
164 int slot = java_lang_reflect_Constructor::slot(target_oop);
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
165 KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
166 if (!k.is_null() && k->oop_is_instance()) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
167 Method* m = InstanceKlass::cast(k())->method_with_idnum(slot);
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
168 if (m == NULL) return NULL;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
169 CallInfo info(m, k());
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
170 return init_method_MemberName(mname, info);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
171 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
172 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
173 return NULL;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
174 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
175
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
176 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
177 assert(info.resolved_appendix().is_null(), "only normal methods here");
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
178 methodHandle m = info.resolved_method();
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
179 KlassHandle m_klass = m->method_holder();
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
180 int flags = (jushort)( m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS );
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
181 int vmindex = Method::invalid_vtable_index;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
182
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
183 switch (info.call_kind()) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
184 case CallInfo::itable_call:
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
185 vmindex = info.itable_index();
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
186 // More importantly, the itable index only works with the method holder.
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
187 assert(m_klass->verify_itable_index(vmindex), "");
6266
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_invokeInterface << REFERENCE_KIND_SHIFT);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
189 if (TraceInvokeDynamic) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
190 ResourceMark rm;
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
191 tty->print_cr("memberName: invokeinterface method_holder::method: %s, itableindex: %d, access_flags:",
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
192 Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
193 vmindex);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
194 m->access_flags().print_on(tty);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
195 if (!m->is_abstract()) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
196 tty->print("default");
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
197 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
198 tty->cr();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
199 }
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
200 break;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
201
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
202 case CallInfo::vtable_call:
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
203 vmindex = info.vtable_index();
6266
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_invokeVirtual << REFERENCE_KIND_SHIFT);
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
205 assert(info.resolved_klass()->is_subtype_of(m_klass()), "virtual call must be type-safe");
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
206 if (m_klass->is_interface()) {
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
207 // This is a vtable call to an interface method (abstract "miranda method" or default method).
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
208 // The vtable index is meaningless without a class (not interface) receiver type, so get one.
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
209 // (LinkResolver should help us figure this out.)
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
210 KlassHandle m_klass_non_interface = info.resolved_klass();
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
211 if (m_klass_non_interface->is_interface()) {
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
212 m_klass_non_interface = SystemDictionary::Object_klass();
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
213 #ifdef ASSERT
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
214 { ResourceMark rm;
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
215 Method* m2 = m_klass_non_interface->vtable()->method_at(vmindex);
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
216 assert(m->name() == m2->name() && m->signature() == m2->signature(),
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
217 err_msg("at %d, %s != %s", vmindex,
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
218 m->name_and_sig_as_C_string(), m2->name_and_sig_as_C_string()));
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
219 }
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
220 #endif //ASSERT
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
221 }
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
222 if (!m->is_public()) {
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
223 assert(m->is_public(), "virtual call must be to public interface method");
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
224 return NULL; // elicit an error later in product build
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
225 }
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
226 assert(info.resolved_klass()->is_subtype_of(m_klass_non_interface()), "virtual call must be type-safe");
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
227 m_klass = m_klass_non_interface;
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
228 }
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
229 if (TraceInvokeDynamic) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
230 ResourceMark rm;
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
231 tty->print_cr("memberName: invokevirtual method_holder::method: %s, receiver: %s, vtableindex: %d, access_flags:",
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
232 Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
233 m_klass->internal_name(), vmindex);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
234 m->access_flags().print_on(tty);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
235 if (m->is_default_method()) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
236 tty->print("default");
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
237 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
238 tty->cr();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
239 }
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
240 break;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
241
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
242 case CallInfo::direct_call:
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
243 vmindex = Method::nonvirtual_vtable_index;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
244 if (m->is_static()) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
245 flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
246 } else if (m->is_initializer()) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
247 flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
248 } else {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
249 flags |= IS_METHOD | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
250 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
251 break;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
252
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
253 default: assert(false, "bad CallInfo"); return NULL;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
254 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
255
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
256 // @CallerSensitive annotation detected
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
257 if (m->caller_sensitive()) {
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
258 flags |= CALLER_SENSITIVE;
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
259 }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
260
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
261 oop mname_oop = mname();
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
262 java_lang_invoke_MemberName::set_flags( mname_oop, flags);
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
263 java_lang_invoke_MemberName::set_vmtarget(mname_oop, m());
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
264 java_lang_invoke_MemberName::set_vmindex( mname_oop, vmindex); // vtable/itable index
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
265 java_lang_invoke_MemberName::set_clazz( mname_oop, m_klass->java_mirror());
6266
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 MethodType objects.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
268 // 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
269 // 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
270 // 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
271 // 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
272 // constructing any new objects.
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
10345
b7fa10a3a69a 8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
sspitsyn
parents: 10283
diff changeset
274 m->method_holder()->add_member_name(m->method_idnum(), mname);
b7fa10a3a69a 8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
sspitsyn
parents: 10283
diff changeset
275
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
276 return mname();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
277 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
278
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
279 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
280 int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
281 flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
282 if (is_setter) flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT);
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
283 Metadata* vmtarget = fd.field_holder();
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
284 int vmindex = fd.offset(); // determines the field uniquely when combined with static bit
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
285 oop mname_oop = mname();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
286 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
287 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
288 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex);
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
289 java_lang_invoke_MemberName::set_clazz(mname_oop, fd.field_holder()->java_mirror());
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
290 oop type = field_signature_type_or_null(fd.signature());
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
291 oop name = field_name_or_null(fd.name());
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
292 if (name != NULL)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
293 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
294 if (type != NULL)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
295 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
296 // 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
297 // 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
298 // 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
299 // 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
300 // 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
301 // 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
302 // 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
303 // TO DO: maybe intern mname_oop
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
304 return mname();
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
305 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
306
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
307 // JVM 2.9 Special Methods:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
308 // 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
309 // * 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
310 // * 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
311 // * 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
312 // * 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
313 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
314 if (klass == NULL)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
315 return false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
316 // 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
317 // if (klass != SystemDictionary::MethodHandle_klass())
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
318 // Test the name instead:
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
319 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
320 return false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
321 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
322 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
323 if (m == NULL) return false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
324 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
325 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
326 return (flags & required) == required;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
327 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
328
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
329
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
330 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
331 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
332 switch (iid) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
333 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
334 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
335 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
336 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
337 case vmIntrinsics::_linkToInterface: return vmSymbols::linkToInterface_name();
1039
987e948ebbc8 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
338 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
339 assert(false, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
340 return 0;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
341 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
342
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
343 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
344 switch (iid) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
345 case vmIntrinsics::_invokeBasic: return 0;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
346 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
347 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
348 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
349 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
350 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
351 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
352 return 0;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
353 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
354
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
355 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
356 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
357 switch (name_id) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
358 // 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
359 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
360 // 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
361 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
362
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
363 // 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
364 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
365 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
366 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
367 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
368 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
369
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
370 // 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
371 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
372 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
373 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
374 return vmIntrinsics::_invokeGeneric;
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 // 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
377 // 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
378 return vmIntrinsics::_none;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
379 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
380
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
381 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
382 if (klass != NULL &&
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
383 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
384 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
385 if (iid != vmIntrinsics::_none)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
386 return iid;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
387 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
388 return vmIntrinsics::_invokeGeneric;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
389 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
390 return vmIntrinsics::_none;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
391 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
392
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
393
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
394 // 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
395 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
396 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
397 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
398 } 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
399 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
400 } 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
401 if (intern_if_not_found) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
402 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
403 } else {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
404 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
405 }
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
406 } else {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
407 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
408 }
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
409 }
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
410
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
411 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
412 enum { OBJ_SIG_LEN = 18 };
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
413
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
414 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
415 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
416 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
417 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
418 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
419 switch (sig->byte_at(i)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
420 case 'L':
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
421 // 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
422 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
423 return false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
424 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
425 continue;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
426 case '(': case ')': case 'V':
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
427 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
428 continue;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
429 //case '[':
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
430 //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
431 default:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
432 return false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
433 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
434 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
435 return true;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
436 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
437
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
438 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
439 Symbol* bsig = NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
440 if (sig == NULL) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
441 return sig;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
442 } 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
443 sig->increment_refcount();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
444 return sig; // that was easy
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
445 } 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
446 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
447 if (is_subword_type(bt)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
448 bsig = vmSymbols::int_signature();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
449 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
450 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
451 bsig = vmSymbols::object_signature();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
452 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
453 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
454 ResourceMark rm;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
455 stringStream buffer(128);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
456 buffer.put('(');
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
457 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
458 if (keep_last_arg)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
459 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
460 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
461 BasicType bt = ss.type();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
462 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
463 if (ss.at_return_type()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
464 buffer.put(')');
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
465 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
466 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
467 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
468 (int) ss.raw_length());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
469 } 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
470 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
471 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
472 if (is_subword_type(bt))
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
473 bt = T_INT;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
474 buffer.put(type2char(bt));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
475 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
476 arg_pos++;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
477 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
478 const char* sigstr = buffer.base();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
479 int siglen = (int) buffer.size();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
480 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
481 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
482 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
483 // 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
484 keep_last_arg, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
485 return bsig;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
486 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
487
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
488 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
489 Symbol* sig,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
490 bool keep_arrays,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
491 bool keep_basic_names) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
492 st = st ? st : tty;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
493 int len = sig->utf8_length();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
494 int array = 0;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
495 bool prev_type = false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
496 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
497 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
498 switch (ch) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
499 case '(': case ')':
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
500 prev_type = false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
501 st->put(ch);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
502 continue;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
503 case '[':
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
504 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
505 st->put(ch);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
506 array++;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
507 continue;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
508 case 'L':
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 (prev_type) st->put(',');
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
511 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
512 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
513 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
514 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
515 if (slash < i) start = slash;
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 st->put('L');
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
518 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
519 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
520 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
521 prev_type = true;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
522 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
523 break;
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 default:
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 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
528 ch = '[';
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
529 array = 0;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
530 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
531 if (prev_type) st->put(',');
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
532 const char* n = NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
533 if (keep_basic_names)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
534 n = type2name(char2type(ch));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
535 if (n == NULL) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
536 // 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
537 st->put(ch);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
538 } else {
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17479
diff changeset
539 st->print("%s", n);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
540 prev_type = true;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
541 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
542 break;
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 // 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
546 if (prev_type) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
547 while (array > 0) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
548 st->print("[]");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
549 --array;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
550 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
551 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
552 array = 0;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
553 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
554 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
555
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
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
558 static oop object_java_mirror() {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
559 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
560 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
561
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
562 oop MethodHandles::field_name_or_null(Symbol* s) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
563 if (s == NULL) return NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
564 return StringTable::lookup(s);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
565 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
566
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
567 oop MethodHandles::field_signature_type_or_null(Symbol* s) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
568 if (s == NULL) return NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
569 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
570 if (is_java_primitive(bt)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
571 assert(s->utf8_length() == 1, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
572 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
573 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
574 // 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
575 // 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
576 if (bt == T_OBJECT) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
577 if (s == vmSymbols::object_signature()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
578 return object_java_mirror();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
579 } else if (s == vmSymbols::class_signature()) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
580 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
581 } else if (s == vmSymbols::string_signature()) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
582 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
583 }
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 return NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
586 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
587
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
588
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
589 // An unresolved member name is a mere symbolic reference.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
590 // 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
591 // which refers directly to JVM internals.
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
592 Handle MethodHandles::resolve_MemberName(Handle mname, KlassHandle caller, TRAPS) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
593 Handle empty;
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
594 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
595
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
596 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
597 // Already resolved.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
598 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
599 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
600 return mname;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
601 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
602
3274
2a23b1b5a0a8 7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents: 2478
diff changeset
603 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
604 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
605 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
606 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
607 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
608 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
609 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
610 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
611
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
612 DEBUG_ONLY(int old_vmindex);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
613 assert((old_vmindex = java_lang_invoke_MemberName::vmindex(mname())) == 0, "clean input");
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
614
3274
2a23b1b5a0a8 7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents: 2478
diff changeset
615 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
616 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "nothing to resolve", empty);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
617 }
3274
2a23b1b5a0a8 7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents: 2478
diff changeset
618
2a23b1b5a0a8 7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents: 2478
diff changeset
619 instanceKlassHandle defc;
2a23b1b5a0a8 7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents: 2478
diff changeset
620 {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
621 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
622 if (defc_klass == NULL) return empty; // a primitive; no resolution possible
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
623 if (!defc_klass->oop_is_instance()) {
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
624 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
625 defc_klass = SystemDictionary::Object_klass();
3274
2a23b1b5a0a8 7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents: 2478
diff changeset
626 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
627 defc = instanceKlassHandle(THREAD, defc_klass);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
628 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
629 if (defc.is_null()) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
630 THROW_MSG_(vmSymbols::java_lang_InternalError(), "primitive class", empty);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
631 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
632 defc->link_class(CHECK_(empty)); // possible safepoint
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
633
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
634 // 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
635 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
636 if (name == NULL) return empty; // no such name
3781
d83ac25d0304 7055355: JSR 292: crash while throwing WrongMethodTypeException
never
parents: 3757
diff changeset
637 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
638 return empty; // illegal name
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
639
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
640 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
641 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
642 (defc() == SystemDictionary::MethodHandle_klass()) &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
643 (ref_kind == JVM_REF_invokeVirtual ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
644 ref_kind == JVM_REF_invokeSpecial ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
645 // 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
646 ref_kind == JVM_REF_invokeStatic)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
647 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
648 if (iid != vmIntrinsics::_none &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
649 ((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
650 // 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
651 // 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
652 mh_invoke_id = iid;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
653 }
3274
2a23b1b5a0a8 7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents: 2478
diff changeset
654 }
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
655
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
656 // 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
657 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
658 if (type == NULL) return empty; // no such signature exists in the VM
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
659
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
660 // Time to do the lookup.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
661 switch (flags & ALL_KINDS) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
662 case IS_METHOD:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
663 {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
664 CallInfo result;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
665 {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
666 assert(!HAS_PENDING_EXCEPTION, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
667 if (ref_kind == JVM_REF_invokeStatic) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
668 LinkResolver::resolve_static_call(result,
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
669 defc, name, type, caller, caller.not_null(), false, THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
670 } else if (ref_kind == JVM_REF_invokeInterface) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
671 LinkResolver::resolve_interface_call(result, Handle(), defc,
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
672 defc, name, type, caller, caller.not_null(), false, THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
673 } 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
674 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
675 LinkResolver::resolve_handle_call(result,
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
676 defc, name, type, caller, THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
677 } 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
678 LinkResolver::resolve_special_call(result,
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
679 defc, name, type, caller, caller.not_null(), THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
680 } else if (ref_kind == JVM_REF_invokeVirtual) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
681 LinkResolver::resolve_virtual_call(result, Handle(), defc,
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
682 defc, name, type, caller, caller.not_null(), false, THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
683 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
684 assert(false, err_msg("ref_kind=%d", ref_kind));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
685 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
686 if (HAS_PENDING_EXCEPTION) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
687 return empty;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
688 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
689 }
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
690 if (result.resolved_appendix().not_null()) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
691 // The resolved MemberName must not be accompanied by an appendix argument,
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
692 // since there is no way to bind this value into the MemberName.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
693 // Caller is responsible to prevent this from happening.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
694 THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
695 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
696 oop mname2 = init_method_MemberName(mname, result);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
697 return Handle(THREAD, mname2);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
698 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
699 case IS_CONSTRUCTOR:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
700 {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
701 CallInfo result;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
702 {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
703 assert(!HAS_PENDING_EXCEPTION, "");
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
704 if (name == vmSymbols::object_initializer_name()) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
705 LinkResolver::resolve_special_call(result,
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
706 defc, name, type, caller, caller.not_null(), THREAD);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
707 } else {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
708 break; // will throw after end of switch
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
709 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
710 if (HAS_PENDING_EXCEPTION) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
711 return empty;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
712 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
713 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
714 assert(result.is_statically_bound(), "");
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
715 oop mname2 = init_method_MemberName(mname, result);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
716 return Handle(THREAD, mname2);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
717 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
718 case IS_FIELD:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
719 {
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
720 fieldDescriptor result; // find_field initializes fd if found
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
721 {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
722 assert(!HAS_PENDING_EXCEPTION, "");
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
723 LinkResolver::resolve_field(result, defc, name, type, caller, Bytecodes::_nop, false, false, THREAD);
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
724 if (HAS_PENDING_EXCEPTION) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
725 return empty;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
726 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
727 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
728 oop mname2 = init_field_MemberName(mname, result, ref_kind_is_setter(ref_kind));
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
729 return Handle(THREAD, mname2);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
730 }
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
731 default:
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
732 THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format", empty);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
733 }
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
734
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
735 return empty;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
736 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
737
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
738 // Conversely, a member name which is only initialized from JVM internals
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
739 // may have null defc, name, and type fields.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
740 // Resolving it plants a vmtarget/vmindex in it,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
741 // which refers directly to JVM internals.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
742 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
743 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
744 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
745 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
746 if (vmtarget == NULL) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
747 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nothing to expand");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
748 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
749
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
750 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
751 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
752 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
753 int flags = java_lang_invoke_MemberName::flags(mname());
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
754
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
755 if (suppress != 0) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
756 if (suppress & _suppress_defc) have_defc = true;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
757 if (suppress & _suppress_name) have_name = true;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
758 if (suppress & _suppress_type) have_type = true;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
759 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
760
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
761 if (have_defc && have_name && have_type) return; // nothing needed
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
762
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
763 switch (flags & ALL_KINDS) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
764 case IS_METHOD:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
765 case IS_CONSTRUCTOR:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
766 {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
767 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
768 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
769 DEBUG_ONLY(vmtarget = NULL); // safety
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
770 if (m.is_null()) break;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
771 if (!have_defc) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6852
diff changeset
772 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
773 java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror());
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
774 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
775 if (!have_name) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
776 //not java_lang_String::create_from_symbol; let's intern member names
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
777 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
778 java_lang_invoke_MemberName::set_name(mname(), name());
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
779 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
780 if (!have_type) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
781 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
782 java_lang_invoke_MemberName::set_type(mname(), type());
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
783 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
784 return;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
785 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
786 case IS_FIELD:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
787 {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
788 assert(vmtarget->is_klass(), "field vmtarget is Klass*");
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
789 if (!((Klass*) vmtarget)->oop_is_instance()) break;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
790 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
791 DEBUG_ONLY(vmtarget = NULL); // safety
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
792 bool is_static = ((flags & JVM_ACC_STATIC) != 0);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
793 fieldDescriptor fd; // find_field initializes fd if found
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
794 if (!defc->find_field_from_offset(vmindex, is_static, &fd))
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
795 break; // cannot expand
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
796 if (!have_defc) {
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
797 java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror());
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
798 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
799 if (!have_name) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
800 //not java_lang_String::create_from_symbol; let's intern member names
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
801 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
802 java_lang_invoke_MemberName::set_name(mname(), name());
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
803 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
804 if (!have_type) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
805 // 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
806 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
807 if (type.is_null()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
808 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
809 }
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
810 java_lang_invoke_MemberName::set_type(mname(), type());
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
811 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
812 return;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
813 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
814 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
815 THROW_MSG(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
816 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
817
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
818 int MethodHandles::find_MemberNames(KlassHandle k,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
819 Symbol* name, Symbol* sig,
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
820 int mflags, KlassHandle caller,
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
821 int skip, objArrayHandle results) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
822 // %%% take caller into account!
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
823
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
824 Thread* thread = Thread::current();
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
825
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
826 if (k.is_null() || !k->oop_is_instance()) return -1;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
827
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
828 int rfill = 0, rlimit = results->length(), rskip = skip;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
829 // overflow measurement:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
830 int overflow = 0, overflow_limit = MAX2(1000, rlimit);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
831
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
832 int match_flags = mflags;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
833 bool search_superc = ((match_flags & SEARCH_SUPERCLASSES) != 0);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
834 bool search_intfc = ((match_flags & SEARCH_INTERFACES) != 0);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
835 bool local_only = !(search_superc | search_intfc);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
836 bool classes_only = false;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
837
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
838 if (name != NULL) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
839 if (name->utf8_length() == 0) return 0; // a match is not possible
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
840 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
841 if (sig != NULL) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
842 if (sig->utf8_length() == 0) return 0; // a match is not possible
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
843 if (sig->byte_at(0) == '(')
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
844 match_flags &= ~(IS_FIELD | IS_TYPE);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
845 else
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
846 match_flags &= ~(IS_CONSTRUCTOR | IS_METHOD);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
847 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
848
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
849 if ((match_flags & IS_TYPE) != 0) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
850 // NYI, and Core Reflection works quite well for this query
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
851 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
852
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
853 if ((match_flags & IS_FIELD) != 0) {
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
854 for (FieldStream st(k(), local_only, !search_intfc); !st.eos(); st.next()) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
855 if (name != NULL && st.name() != name)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
856 continue;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
857 if (sig != NULL && st.signature() != sig)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
858 continue;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
859 // passed the filters
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
860 if (rskip > 0) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
861 --rskip;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
862 } else if (rfill < rlimit) {
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
863 Handle result(thread, results->obj_at(rfill++));
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
864 if (!java_lang_invoke_MemberName::is_instance(result()))
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
865 return -99; // caller bug!
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
866 oop saved = MethodHandles::init_field_MemberName(result, st.field_descriptor());
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
867 if (saved != result())
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
868 results->obj_at_put(rfill-1, saved); // show saved instance to user
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
869 } else if (++overflow >= overflow_limit) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
870 match_flags = 0; break; // got tired of looking at overflow
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
871 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
872 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
873 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
874
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
875 if ((match_flags & (IS_METHOD | IS_CONSTRUCTOR)) != 0) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
876 // watch out for these guys:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
877 Symbol* init_name = vmSymbols::object_initializer_name();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
878 Symbol* clinit_name = vmSymbols::class_initializer_name();
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
879 if (name == clinit_name) clinit_name = NULL; // hack for exposing <clinit>
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
880 bool negate_name_test = false;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
881 // fix name so that it captures the intention of IS_CONSTRUCTOR
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
882 if (!(match_flags & IS_METHOD)) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
883 // constructors only
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
884 if (name == NULL) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
885 name = init_name;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
886 } else if (name != init_name) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
887 return 0; // no constructors of this method name
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
888 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
889 } else if (!(match_flags & IS_CONSTRUCTOR)) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
890 // methods only
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
891 if (name == NULL) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
892 name = init_name;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
893 negate_name_test = true; // if we see the name, we *omit* the entry
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
894 } else if (name == init_name) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
895 return 0; // no methods of this constructor name
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
896 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
897 } else {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
898 // caller will accept either sort; no need to adjust name
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
899 }
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
900 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
901 Method* m = st.method();
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
902 Symbol* m_name = m->name();
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
903 if (m_name == clinit_name)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
904 continue;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
905 if (name != NULL && ((m_name != name) ^ negate_name_test))
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
906 continue;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
907 if (sig != NULL && m->signature() != sig)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
908 continue;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
909 // passed the filters
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
910 if (rskip > 0) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
911 --rskip;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
912 } else if (rfill < rlimit) {
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
913 Handle result(thread, results->obj_at(rfill++));
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
914 if (!java_lang_invoke_MemberName::is_instance(result()))
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
915 return -99; // caller bug!
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
916 CallInfo info(m);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11081
diff changeset
917 oop saved = MethodHandles::init_method_MemberName(result, info);
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
918 if (saved != result())
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
919 results->obj_at_put(rfill-1, saved); // show saved instance to user
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
920 } else if (++overflow >= overflow_limit) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
921 match_flags = 0; break; // got tired of looking at overflow
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
922 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
923 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
924 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
925
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
926 // return number of elements we at leasted wanted to initialize
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
927 return rfill + overflow;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
928 }
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
929
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
930 //------------------------------------------------------------------------------
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
931 // MemberNameTable
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
932 //
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
933
10345
b7fa10a3a69a 8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
sspitsyn
parents: 10283
diff changeset
934 MemberNameTable::MemberNameTable(int methods_cnt)
b7fa10a3a69a 8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
sspitsyn
parents: 10283
diff changeset
935 : GrowableArray<jweak>(methods_cnt, true) {
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
936 assert_locked_or_safepoint(MemberNameTable_lock);
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
937 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
938
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
939 MemberNameTable::~MemberNameTable() {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
940 assert_locked_or_safepoint(MemberNameTable_lock);
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
941 int len = this->length();
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
942
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
943 for (int idx = 0; idx < len; idx++) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
944 jweak ref = this->at(idx);
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
945 JNIHandles::destroy_weak_global(ref);
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
946 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
947 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
948
10345
b7fa10a3a69a 8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
sspitsyn
parents: 10283
diff changeset
949 void MemberNameTable::add_member_name(int index, jweak mem_name_wref) {
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
950 assert_locked_or_safepoint(MemberNameTable_lock);
10345
b7fa10a3a69a 8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
sspitsyn
parents: 10283
diff changeset
951 this->at_put_grow(index, mem_name_wref);
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
952 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
953
10345
b7fa10a3a69a 8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
sspitsyn
parents: 10283
diff changeset
954 // Return a member name oop or NULL.
b7fa10a3a69a 8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
sspitsyn
parents: 10283
diff changeset
955 oop MemberNameTable::get_member_name(int index) {
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
956 assert_locked_or_safepoint(MemberNameTable_lock);
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
957
10345
b7fa10a3a69a 8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
sspitsyn
parents: 10283
diff changeset
958 jweak ref = this->at(index);
b7fa10a3a69a 8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
sspitsyn
parents: 10283
diff changeset
959 oop mem_name = JNIHandles::resolve(ref);
b7fa10a3a69a 8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
sspitsyn
parents: 10283
diff changeset
960 return mem_name;
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
961 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
962
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
963 #if INCLUDE_JVMTI
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
964 oop MemberNameTable::find_member_name_by_method(Method* old_method) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
965 assert_locked_or_safepoint(MemberNameTable_lock);
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
966 oop found = NULL;
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
967 int len = this->length();
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
968
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
969 for (int idx = 0; idx < len; idx++) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
970 oop mem_name = JNIHandles::resolve(this->at(idx));
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
971 if (mem_name == NULL) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
972 continue;
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
973 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
974 Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mem_name);
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
975 if (method == old_method) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
976 found = mem_name;
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
977 break;
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
978 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
979 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
980 return found;
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
981 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
982
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
983 // It is called at safepoint only
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
984 void MemberNameTable::adjust_method_entries(Method** old_methods, Method** new_methods,
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
985 int methods_length, bool *trace_name_printed) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
986 assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
987 // search the MemberNameTable for uses of either obsolete or EMCP methods
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
988 for (int j = 0; j < methods_length; j++) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
989 Method* old_method = old_methods[j];
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
990 Method* new_method = new_methods[j];
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
991 oop mem_name = find_member_name_by_method(old_method);
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
992 if (mem_name != NULL) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
993 java_lang_invoke_MemberName::adjust_vmtarget(mem_name, new_method);
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
994
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
995 if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
996 if (!(*trace_name_printed)) {
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
997 // RC_TRACE_MESG macro has an embedded ResourceMark
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
998 RC_TRACE_MESG(("adjust: name=%s",
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
999 old_method->method_holder()->external_name()));
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1000 *trace_name_printed = true;
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1001 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1002 // RC_TRACE macro has an embedded ResourceMark
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1003 RC_TRACE(0x00400000, ("MemberName method update: %s(%s)",
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1004 new_method->name()->as_C_string(),
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1005 new_method->signature()->as_C_string()));
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1006 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1007 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1008 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1009 }
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1010 #endif // INCLUDE_JVMTI
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1011
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1012 //
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1013 // Here are the native methods in java.lang.invoke.MethodHandleNatives
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1014 // They are the private interface between this JVM and the HotSpot-specific
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1015 // Java code that implements JSR 292 method handles.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1016 //
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1017 // Note: We use a JVM_ENTRY macro to define each of these, for this is the way
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1018 // that intrinsic (non-JNI) native methods are defined in HotSpot.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1019 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1020
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
1021 JVM_ENTRY(jint, MHN_getConstant(JNIEnv *env, jobject igcls, jint which)) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1022 switch (which) {
3905
c26de9aef2ed 7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents: 3837
diff changeset
1023 case MethodHandles::GC_COUNT_GWT:
c26de9aef2ed 7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents: 3837
diff changeset
1024 #ifdef COMPILER2
c26de9aef2ed 7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents: 3837
diff changeset
1025 return true;
c26de9aef2ed 7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents: 3837
diff changeset
1026 #else
c26de9aef2ed 7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents: 3837
diff changeset
1027 return false;
c26de9aef2ed 7071307: MethodHandle bimorphic inlining should consider the frequency
never
parents: 3837
diff changeset
1028 #endif
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1029 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1030 return 0;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1031 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1032 JVM_END
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1033
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1034 #ifndef PRODUCT
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1035 #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
1036 template(MethodHandles,GC_COUNT_GWT) \
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
1037 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
1038 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
1039 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
1040 template(java_lang_invoke_MemberName,MN_IS_TYPE) \
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7418
diff changeset
1041 template(java_lang_invoke_MemberName,MN_CALLER_SENSITIVE) \
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
1042 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
1043 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
1044 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
1045 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
1046 template(MethodHandles,GC_LAMBDA_SUPPORT) \
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1047 /*end*/
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1048
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1049 #define IGNORE_REQ(req_expr) /* req_expr */
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1050 #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
1051 static const int con_value_count = EACH_NAMED_CON(ONE_PLUS, IGNORE_REQ) 0;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1052 #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
1053 static const int con_values[con_value_count+1] = { EACH_NAMED_CON(VALUE_COMMA, IGNORE_REQ) 0 };
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1054 #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
1055 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
1056
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1057 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
1058 if (which < 0) return false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1059 bool ok = true;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1060 int count = 0;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1061 #define INC_COUNT(scope,value) \
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1062 ++count;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1063 #define CHECK_REQ(req_expr) \
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1064 if (which < count) return ok; \
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1065 ok = (req_expr);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1066 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
1067 #undef INC_COUNT
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1068 #undef CHECK_REQ
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1069 assert(count == con_value_count, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1070 if (which < count) return ok;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1071 return false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1072 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1073
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1074 #undef ONE_PLUS
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1075 #undef VALUE_COMMA
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1076 #undef STRING_NULL
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1077 #undef EACH_NAMED_CON
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1078 #endif // PRODUCT
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1079
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
1080 JVM_ENTRY(jint, MHN_getNamedCon(JNIEnv *env, jobject igcls, jint which, jobjectArray box_jh)) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1081 #ifndef PRODUCT
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1082 if (advertise_con_value(which)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1083 assert(which >= 0 && which < con_value_count, "");
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1084 int con = con_values[which];
3274
2a23b1b5a0a8 7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents: 2478
diff changeset
1085 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
1086 if (box.not_null() && box->klass() == Universe::objectArrayKlassObj() && box->length() > 0) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1087 const char* str = &con_names[0];
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1088 for (int i = 0; i < which; i++)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1089 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
1090 oop name = java_lang_String::create_oop_from_str(str, CHECK_0); // possible safepoint
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1091 box->obj_at_put(0, name);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1092 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1093 return con;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1094 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1095 #endif
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1096 return 0;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1097 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1098 JVM_END
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1099
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1100 // 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
1101 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
1102 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
1103 if (target_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "target is null"); }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1104 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1105 Handle target(THREAD, JNIHandles::resolve_non_null(target_jh));
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1106 MethodHandles::init_MemberName(mname, target);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1107 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1108 JVM_END
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1109
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1110 // void expand(MemberName self)
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
1111 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
1112 if (mname_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "mname is null"); }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1113 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1114 MethodHandles::expand_MemberName(mname, 0, CHECK);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1115 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1116 JVM_END
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1117
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1118 // 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
1119 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
1120 if (mname_jh == NULL) { THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "mname is null"); }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1121 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
1122
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
1123 // 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
1124 // 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
1125 if (VerifyMethodHandles && caller_jh != NULL &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1126 java_lang_invoke_MemberName::clazz(mname()) != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1127 Klass* reference_klass = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(mname()));
11081
c1bd7b5bdc70 8017571: JSR292: JVM crashing on assert "cast to instanceKlass" while producing MethodHandle for array methods with MethodHandle.findVirtual
twisti
parents: 10345
diff changeset
1128 if (reference_klass != NULL && reference_klass->oop_is_objArray()) {
c1bd7b5bdc70 8017571: JSR292: JVM crashing on assert "cast to instanceKlass" while producing MethodHandle for array methods with MethodHandle.findVirtual
twisti
parents: 10345
diff changeset
1129 reference_klass = ObjArrayKlass::cast(reference_klass)->bottom_klass();
c1bd7b5bdc70 8017571: JSR292: JVM crashing on assert "cast to instanceKlass" while producing MethodHandle for array methods with MethodHandle.findVirtual
twisti
parents: 10345
diff changeset
1130 }
c1bd7b5bdc70 8017571: JSR292: JVM crashing on assert "cast to instanceKlass" while producing MethodHandle for array methods with MethodHandle.findVirtual
twisti
parents: 10345
diff changeset
1131
c1bd7b5bdc70 8017571: JSR292: JVM crashing on assert "cast to instanceKlass" while producing MethodHandle for array methods with MethodHandle.findVirtual
twisti
parents: 10345
diff changeset
1132 // Reflection::verify_class_access can only handle instance classes.
c1bd7b5bdc70 8017571: JSR292: JVM crashing on assert "cast to instanceKlass" while producing MethodHandle for array methods with MethodHandle.findVirtual
twisti
parents: 10345
diff changeset
1133 if (reference_klass != NULL && reference_klass->oop_is_instance()) {
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
1134 // Emulate LinkResolver::check_klass_accessability.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1135 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
1136 if (!Reflection::verify_class_access(caller,
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
1137 reference_klass,
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
1138 true)) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1139 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
1140 }
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
1141 }
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
1142 }
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1299
diff changeset
1143
17479
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
1144 KlassHandle caller(THREAD,
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
1145 caller_jh == NULL ? (Klass*) NULL :
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
1146 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh)));
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
1147 Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL);
9063bd8808a7 8029507: Enhance JVM method processing
jrose
parents: 12974
diff changeset
1148
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1149 if (resolved.is_null()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1150 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
1151 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
1152 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
1153 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
1154 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1155 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
1156 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
1157 } 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
1158 (flags & ALL_KINDS) == IS_CONSTRUCTOR) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1159 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
1160 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1161 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
1162 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1163 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1164
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1165 return JNIHandles::make_local(THREAD, resolved());
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1166 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1167 JVM_END
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1168
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1169 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
1170 if (mname == NULL ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1171 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
1172 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
1173 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1174 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
1175 if ((flags & IS_FIELD) != 0 &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1176 (must_be_static
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1177 ? (flags & JVM_ACC_STATIC) != 0
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1178 : (flags & JVM_ACC_STATIC) == 0)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1179 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
1180 return (jlong) vmindex;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1181 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1182 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1183 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
1184 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
1185 return 0;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1186 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1187
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1188 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
1189 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
1190 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1191 JVM_END
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1192
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1193 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
1194 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
1195 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1196 JVM_END
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1197
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1198 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
1199 // 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
1200 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
1201 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
1202 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
1203 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1204 JVM_END
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1205
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1206 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
1207 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
1208 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
1209 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
1210 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
1211 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
1212 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
1213 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
1214 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
1215 x = NULL;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1216 if (vmtarget == NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1217 x = NULL;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1218 } else if (vmtarget->is_klass()) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1219 x = ((Klass*) vmtarget)->java_mirror();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1220 } else if (vmtarget->is_method()) {
12974
d95eca175eff 8023004: JSR 292: java.lang.RuntimeException: Original target method was called.
sspitsyn
parents: 12823
diff changeset
1221 x = mname();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1222 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1223 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
1224 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
1225 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1226 JVM_END
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1227
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1228
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1229
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1230 // static native int getMembers(Class<?> defc, String matchName, String matchSig,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1231 // 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
1232 JVM_ENTRY(jint, MHN_getMembers(JNIEnv *env, jobject igcls,
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1233 jclass clazz_jh, jstring name_jh, jstring sig_jh,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1234 int mflags, jclass caller_jh, jint skip, jobjectArray results_jh)) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1235 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
1236 KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz_jh)));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1237
3274
2a23b1b5a0a8 7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents: 2478
diff changeset
1238 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
1239 if (results.is_null() || !results->is_objArray()) return -1;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1240
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
1241 TempNewSymbol name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2116
diff changeset
1242 TempNewSymbol sig = NULL;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1243 if (name_jh != NULL) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1244 name = java_lang_String::as_symbol_or_null(JNIHandles::resolve_non_null(name_jh));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1245 if (name == NULL) return 0; // a match is not possible
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1246 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1247 if (sig_jh != NULL) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1248 sig = java_lang_String::as_symbol_or_null(JNIHandles::resolve_non_null(sig_jh));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1249 if (sig == NULL) return 0; // a match is not possible
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1250 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1251
3274
2a23b1b5a0a8 7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents: 2478
diff changeset
1252 KlassHandle caller;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1253 if (caller_jh != NULL) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1254 oop caller_oop = JNIHandles::resolve_non_null(caller_jh);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1255 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
1256 caller = KlassHandle(THREAD, java_lang_Class::as_Klass(caller_oop));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1257 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1258
3274
2a23b1b5a0a8 7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents: 2478
diff changeset
1259 if (name != NULL && sig != NULL && results.not_null()) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1260 // try a direct resolve
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1261 // %%% TO DO
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1262 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1263
10133
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1264 int res = MethodHandles::find_MemberNames(k, name, sig, mflags,
6337ca4dcad8 8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition
sspitsyn
parents: 10128
diff changeset
1265 caller, skip, results);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1266 // TO DO: expand at least some of the MemberNames, to avoid massive callbacks
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1267 return res;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1268 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1269 JVM_END
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1270
3932
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1271 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
1272 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
1273 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
1274 {
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1275 // 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
1276 MutexLocker mu(Compile_lock, thread);
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1277 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
1278 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
1279 }
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1280 }
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1281 JVM_END
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1282
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1283 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
1284 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
1285 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
1286 {
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1287 // 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
1288 MutexLocker mu(Compile_lock, thread);
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1289 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
1290 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
1291 }
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1292 }
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1293 JVM_END
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1294
10276
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1295 /**
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1296 * Throws a java/lang/UnsupportedOperationException unconditionally.
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1297 * This is required by the specification of MethodHandle.invoke if
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1298 * invoked directly.
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1299 */
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1300 JVM_ENTRY(jobject, MH_invoke_UOE(JNIEnv* env, jobject mh, jobjectArray args)) {
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1301 THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "MethodHandle.invoke cannot be invoked reflectively");
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1302 return NULL;
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1303 }
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1304 JVM_END
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1305
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1306 /**
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1307 * Throws a java/lang/UnsupportedOperationException unconditionally.
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1308 * This is required by the specification of MethodHandle.invokeExact if
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1309 * invoked directly.
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1310 */
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1311 JVM_ENTRY(jobject, MH_invokeExact_UOE(JNIEnv* env, jobject mh, jobjectArray args)) {
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1312 THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "MethodHandle.invokeExact cannot be invoked reflectively");
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1313 return NULL;
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1314 }
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1315 JVM_END
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1316
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1317 /// JVM_RegisterMethodHandleMethods
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1318
3932
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1319 #undef CS // Solaris builds complain
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1320
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1321 #define LANG "Ljava/lang/"
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2416
diff changeset
1322 #define JLINV "Ljava/lang/invoke/"
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1323
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1324 #define OBJ LANG"Object;"
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1325 #define CLS LANG"Class;"
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1326 #define STRG LANG"String;"
3932
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1327 #define CS JLINV"CallSite;"
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2416
diff changeset
1328 #define MT JLINV"MethodType;"
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2416
diff changeset
1329 #define MH JLINV"MethodHandle;"
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2416
diff changeset
1330 #define MEM JLINV"MemberName;"
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1331
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1332 #define CC (char*) /*cast a literal from (const char*)*/
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1333 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1334
3932
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1335 // These are the native methods on java.lang.invoke.MethodHandleNatives.
10276
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1336 static JNINativeMethod MHN_methods[] = {
3932
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1337 {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
1338 {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
1339 {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
1340 {CC"getConstant", CC"(I)I", FN_PTR(MHN_getConstant)},
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1341 // 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
1342 {CC"getNamedCon", CC"(I["OBJ")I", FN_PTR(MHN_getNamedCon)},
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1343 // static native int getMembers(Class<?> defc, String matchName, String matchSig,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1344 // 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
1345 {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
1346 {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
1347 {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
1348 {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
1349 {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
1350 {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
1351 {CC"getMemberVMInfo", CC"("MEM")"OBJ, FN_PTR(MHN_getMemberVMInfo)}
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1352 };
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1353
10276
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1354 static JNINativeMethod MH_methods[] = {
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1355 // UnsupportedOperationException throwers
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1356 {CC"invoke", CC"(["OBJ")"OBJ, FN_PTR(MH_invoke_UOE)},
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1357 {CC"invokeExact", CC"(["OBJ")"OBJ, FN_PTR(MH_invokeExact_UOE)}
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1358 };
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1359
10276
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1360 /**
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1361 * Helper method to register native methods.
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1362 */
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1363 static bool register_natives(JNIEnv* env, jclass clazz, const JNINativeMethod* methods, jint nMethods) {
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1364 int status = env->RegisterNatives(clazz, methods, nMethods);
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1365 if (status != JNI_OK || env->ExceptionOccurred()) {
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1366 warning("JSR 292 method handle code is mismatched to this JVM. Disabling support.");
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1367 env->ExceptionClear();
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1368 return false;
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1369 }
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1370 return true;
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1371 }
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1372
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1373 /**
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1374 * This one function is exported, used by NativeLookup.
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1375 */
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1376 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
1377 if (!EnableInvokeDynamic) {
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2357
diff changeset
1378 warning("JSR 292 is disabled in this JVM. Use -XX:+UnlockDiagnosticVMOptions -XX:+EnableInvokeDynamic to enable.");
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1379 return; // bind nothing
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1380 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1381
3932
b0efc7ee3b31 7085860: JSR 292: implement CallSite.setTargetNormal and setTargetVolatile as native methods
twisti
parents: 3905
diff changeset
1382 assert(!MethodHandles::enabled(), "must not be enabled");
1039
987e948ebbc8 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
1383 bool enable_MH = true;
987e948ebbc8 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
1384
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1385 jclass MH_class = NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1386 if (SystemDictionary::MethodHandle_klass() == NULL) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1387 enable_MH = false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1388 } else {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1389 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
1390 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
1391 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1392
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1393 if (enable_MH) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1394 ThreadToNativeFromVM ttnfv(thread);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1395
10276
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1396 if (enable_MH) {
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1397 enable_MH = register_natives(env, MHN_class, MHN_methods, sizeof(MHN_methods)/sizeof(JNINativeMethod));
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1398 }
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1399 if (enable_MH) {
f0bc60565ba8 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 10161
diff changeset
1400 enable_MH = register_natives(env, MH_class, MH_methods, sizeof(MH_methods)/sizeof(JNINativeMethod));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1401 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1402 }
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1403
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1404 if (TraceInvokeDynamic) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6224
diff changeset
1405 tty->print_cr("MethodHandle support loaded (using LambdaForms)");
1039
987e948ebbc8 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
1406 }
987e948ebbc8 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
1407
987e948ebbc8 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
1408 if (enable_MH) {
2116
d810e9a3fc33 7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents: 2088
diff changeset
1409 MethodHandles::generate_adapters();
1039
987e948ebbc8 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
1410 MethodHandles::set_enabled(true);
987e948ebbc8 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
1411 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1412 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1413 JVM_END