Mercurial > hg > graal-compiler
annotate src/share/vm/prims/methodHandleWalk.cpp @ 3249:e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes
author | johnc |
---|---|
date | Thu, 07 Apr 2011 09:53:20 -0700 |
parents | 8033953d67ff |
children | ed69575596ac |
rev | line source |
---|---|
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1 /* |
2117
70427f06ea47
7010913: JSR 292 ciMethodHandle does not handle MethodHandleCompiler exceptions properly
twisti
parents:
2001
diff
changeset
|
2 * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
4 * |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
8 * |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
13 * accompanied this code). |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
14 * |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
18 * |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
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:
1507
diff
changeset
|
21 * questions. |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
22 * |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
23 */ |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
24 |
1972 | 25 #include "precompiled.hpp" |
26 #include "interpreter/rewriter.hpp" | |
27 #include "memory/oopFactory.hpp" | |
28 #include "prims/methodHandleWalk.hpp" | |
29 | |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
30 /* |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
31 * JSR 292 reference implementation: method handle structure analysis |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
32 */ |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
33 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
34 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
35 // ----------------------------------------------------------------------------- |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
36 // MethodHandleChain |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
37 |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
38 void MethodHandleChain::set_method_handle(Handle mh, TRAPS) { |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
39 if (!java_lang_invoke_MethodHandle::is_instance(mh())) lose("bad method handle", CHECK); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
40 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
41 // set current method handle and unpack partially |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
42 _method_handle = mh; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
43 _is_last = false; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
44 _is_bound = false; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
45 _arg_slot = -1; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
46 _arg_type = T_VOID; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
47 _conversion = -1; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
48 _last_invoke = Bytecodes::_nop; //arbitrary non-garbage |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
49 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
50 if (java_lang_invoke_DirectMethodHandle::is_instance(mh())) { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
51 set_last_method(mh(), THREAD); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
52 return; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
53 } |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
54 if (java_lang_invoke_AdapterMethodHandle::is_instance(mh())) { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
55 _conversion = AdapterMethodHandle_conversion(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
56 assert(_conversion != -1, "bad conv value"); |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
57 assert(java_lang_invoke_BoundMethodHandle::is_instance(mh()), "also BMH"); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
58 } |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
59 if (java_lang_invoke_BoundMethodHandle::is_instance(mh())) { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
60 if (!is_adapter()) // keep AMH and BMH separate in this model |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
61 _is_bound = true; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
62 _arg_slot = BoundMethodHandle_vmargslot(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
63 oop target = MethodHandle_vmtarget_oop(); |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
64 if (!is_bound() || java_lang_invoke_MethodHandle::is_instance(target)) { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
65 _arg_type = compute_bound_arg_type(target, NULL, _arg_slot, CHECK); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
66 } else if (target != NULL && target->is_method()) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
67 methodOop m = (methodOop) target; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
68 _arg_type = compute_bound_arg_type(NULL, m, _arg_slot, CHECK); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
69 set_last_method(mh(), CHECK); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
70 } else { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
71 _is_bound = false; // lose! |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
72 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
73 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
74 if (is_bound() && _arg_type == T_VOID) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
75 lose("bad vmargslot", CHECK); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
76 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
77 if (!is_bound() && !is_adapter()) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
78 lose("unrecognized MH type", CHECK); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
79 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
80 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
81 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
82 |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
83 void MethodHandleChain::set_last_method(oop target, TRAPS) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
84 _is_last = true; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
85 klassOop receiver_limit_oop = NULL; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
86 int flags = 0; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
87 methodOop m = MethodHandles::decode_method(target, receiver_limit_oop, flags); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
88 _last_method = methodHandle(THREAD, m); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
89 if ((flags & MethodHandles::_dmf_has_receiver) == 0) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
90 _last_invoke = Bytecodes::_invokestatic; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
91 else if ((flags & MethodHandles::_dmf_does_dispatch) == 0) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
92 _last_invoke = Bytecodes::_invokespecial; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
93 else if ((flags & MethodHandles::_dmf_from_interface) != 0) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
94 _last_invoke = Bytecodes::_invokeinterface; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
95 else |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
96 _last_invoke = Bytecodes::_invokevirtual; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
97 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
98 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
99 |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
100 BasicType MethodHandleChain::compute_bound_arg_type(oop target, methodOop m, int arg_slot, TRAPS) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
101 // There is no direct indication of whether the argument is primitive or not. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
102 // It is implied by the _vmentry code, and by the MethodType of the target. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
103 BasicType arg_type = T_VOID; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
104 if (target != NULL) { |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
105 oop mtype = java_lang_invoke_MethodHandle::type(target); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
106 int arg_num = MethodHandles::argument_slot_to_argnum(mtype, arg_slot); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
107 if (arg_num >= 0) { |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
108 oop ptype = java_lang_invoke_MethodType::ptype(mtype, arg_num); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
109 arg_type = java_lang_Class::as_BasicType(ptype); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
110 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
111 } else if (m != NULL) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
112 // figure out the argument type from the slot |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
113 // FIXME: make this explicit in the MH |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
114 int cur_slot = m->size_of_parameters(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
115 if (arg_slot >= cur_slot) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
116 return T_VOID; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
117 if (!m->is_static()) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
118 cur_slot -= type2size[T_OBJECT]; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
119 if (cur_slot == arg_slot) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
120 return T_OBJECT; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
121 } |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2117
diff
changeset
|
122 ResourceMark rm(THREAD); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
123 for (SignatureStream ss(m->signature()); !ss.is_done(); ss.next()) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
124 BasicType bt = ss.type(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
125 cur_slot -= type2size[bt]; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
126 if (cur_slot <= arg_slot) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
127 if (cur_slot == arg_slot) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
128 arg_type = bt; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
129 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
130 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
131 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
132 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
133 if (arg_type == T_ARRAY) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
134 arg_type = T_OBJECT; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
135 return arg_type; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
136 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
137 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
138 |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
139 void MethodHandleChain::lose(const char* msg, TRAPS) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
140 _lose_message = msg; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
141 if (!THREAD->is_Java_thread() || ((JavaThread*)THREAD)->thread_state() != _thread_in_vm) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
142 // throw a preallocated exception |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
143 THROW_OOP(Universe::virtual_machine_error_instance()); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
144 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
145 THROW_MSG(vmSymbols::java_lang_InternalError(), msg); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
146 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
147 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
148 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
149 // ----------------------------------------------------------------------------- |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
150 // MethodHandleWalker |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
151 |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
152 Bytecodes::Code MethodHandleWalker::conversion_code(BasicType src, BasicType dest) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
153 if (is_subword_type(src)) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
154 src = T_INT; // all subword src types act like int |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
155 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
156 if (src == dest) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
157 return Bytecodes::_nop; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
158 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
159 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
160 #define SRC_DEST(s,d) (((int)(s) << 4) + (int)(d)) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
161 switch (SRC_DEST(src, dest)) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
162 case SRC_DEST(T_INT, T_LONG): return Bytecodes::_i2l; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
163 case SRC_DEST(T_INT, T_FLOAT): return Bytecodes::_i2f; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
164 case SRC_DEST(T_INT, T_DOUBLE): return Bytecodes::_i2d; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
165 case SRC_DEST(T_INT, T_BYTE): return Bytecodes::_i2b; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
166 case SRC_DEST(T_INT, T_CHAR): return Bytecodes::_i2c; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
167 case SRC_DEST(T_INT, T_SHORT): return Bytecodes::_i2s; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
168 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
169 case SRC_DEST(T_LONG, T_INT): return Bytecodes::_l2i; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
170 case SRC_DEST(T_LONG, T_FLOAT): return Bytecodes::_l2f; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
171 case SRC_DEST(T_LONG, T_DOUBLE): return Bytecodes::_l2d; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
172 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
173 case SRC_DEST(T_FLOAT, T_INT): return Bytecodes::_f2i; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
174 case SRC_DEST(T_FLOAT, T_LONG): return Bytecodes::_f2l; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
175 case SRC_DEST(T_FLOAT, T_DOUBLE): return Bytecodes::_f2d; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
176 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
177 case SRC_DEST(T_DOUBLE, T_INT): return Bytecodes::_d2i; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
178 case SRC_DEST(T_DOUBLE, T_LONG): return Bytecodes::_d2l; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
179 case SRC_DEST(T_DOUBLE, T_FLOAT): return Bytecodes::_d2f; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
180 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
181 #undef SRC_DEST |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
182 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
183 // cannot do it in one step, or at all |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
184 return Bytecodes::_illegal; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
185 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
186 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
187 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
188 // ----------------------------------------------------------------------------- |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
189 // MethodHandleWalker::walk |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
190 // |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
191 MethodHandleWalker::ArgToken |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
192 MethodHandleWalker::walk(TRAPS) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
193 ArgToken empty = ArgToken(); // Empty return value. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
194 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
195 walk_incoming_state(CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
196 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
197 for (;;) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
198 set_method_handle(chain().method_handle_oop()); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
199 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
200 assert(_outgoing_argc == argument_count_slow(), "empty slots under control"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
201 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
202 if (chain().is_adapter()) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
203 int conv_op = chain().adapter_conversion_op(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
204 int arg_slot = chain().adapter_arg_slot(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
205 SlotState* arg_state = slot_state(arg_slot); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
206 if (arg_state == NULL |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
207 && conv_op > java_lang_invoke_AdapterMethodHandle::OP_RETYPE_RAW) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
208 lose("bad argument index", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
209 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
210 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
211 // perform the adapter action |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
212 switch (chain().adapter_conversion_op()) { |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
213 case java_lang_invoke_AdapterMethodHandle::OP_RETYPE_ONLY: |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
214 // No changes to arguments; pass the bits through. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
215 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
216 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
217 case java_lang_invoke_AdapterMethodHandle::OP_RETYPE_RAW: { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
218 // To keep the verifier happy, emit bitwise ("raw") conversions as needed. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
219 // See MethodHandles::same_basic_type_for_arguments for allowed conversions. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
220 Handle incoming_mtype(THREAD, chain().method_type_oop()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
221 oop outgoing_mh_oop = chain().vmtarget_oop(); |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
222 if (!java_lang_invoke_MethodHandle::is_instance(outgoing_mh_oop)) |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
223 lose("outgoing target not a MethodHandle", CHECK_(empty)); |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
224 Handle outgoing_mtype(THREAD, java_lang_invoke_MethodHandle::type(outgoing_mh_oop)); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
225 outgoing_mh_oop = NULL; // GC safety |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
226 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
227 int nptypes = java_lang_invoke_MethodType::ptype_count(outgoing_mtype()); |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
228 if (nptypes != java_lang_invoke_MethodType::ptype_count(incoming_mtype())) |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
229 lose("incoming and outgoing parameter count do not agree", CHECK_(empty)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
230 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
231 for (int i = 0, slot = _outgoing.length() - 1; slot >= 0; slot--) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
232 SlotState* arg_state = slot_state(slot); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
233 if (arg_state->_type == T_VOID) continue; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
234 ArgToken arg = _outgoing.at(slot)._arg; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
235 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
236 klassOop in_klass = NULL; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
237 klassOop out_klass = NULL; |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
238 BasicType inpbt = java_lang_Class::as_BasicType(java_lang_invoke_MethodType::ptype(incoming_mtype(), i), &in_klass); |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
239 BasicType outpbt = java_lang_Class::as_BasicType(java_lang_invoke_MethodType::ptype(outgoing_mtype(), i), &out_klass); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
240 assert(inpbt == arg.basic_type(), "sanity"); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
241 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
242 if (inpbt != outpbt) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
243 vmIntrinsics::ID iid = vmIntrinsics::for_raw_conversion(inpbt, outpbt); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
244 if (iid == vmIntrinsics::_none) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
245 lose("no raw conversion method", CHECK_(empty)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
246 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
247 ArgToken arglist[2]; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
248 arglist[0] = arg; // outgoing 'this' |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
249 arglist[1] = ArgToken(); // sentinel |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
250 arg = make_invoke(NULL, iid, Bytecodes::_invokestatic, false, 1, &arglist[0], CHECK_(empty)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
251 change_argument(inpbt, slot, outpbt, arg); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
252 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
253 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
254 i++; // We need to skip void slots at the top of the loop. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
255 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
256 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
257 BasicType inrbt = java_lang_Class::as_BasicType(java_lang_invoke_MethodType::rtype(incoming_mtype())); |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
258 BasicType outrbt = java_lang_Class::as_BasicType(java_lang_invoke_MethodType::rtype(outgoing_mtype())); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
259 if (inrbt != outrbt) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
260 if (inrbt == T_INT && outrbt == T_VOID) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
261 // See comments in MethodHandles::same_basic_type_for_arguments. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
262 } else { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
263 assert(false, "IMPLEMENT ME"); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
264 lose("no raw conversion method", CHECK_(empty)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
265 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
266 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
267 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
268 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
269 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
270 case java_lang_invoke_AdapterMethodHandle::OP_CHECK_CAST: { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
271 // checkcast the Nth outgoing argument in place |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
272 klassOop dest_klass = NULL; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
273 BasicType dest = java_lang_Class::as_BasicType(chain().adapter_arg_oop(), &dest_klass); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
274 assert(dest == T_OBJECT, ""); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
275 assert(dest == arg_state->_type, ""); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
276 ArgToken arg = arg_state->_arg; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
277 ArgToken new_arg = make_conversion(T_OBJECT, dest_klass, Bytecodes::_checkcast, arg, CHECK_(empty)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
278 assert(arg.index() == new_arg.index(), "should be the same index"); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
279 debug_only(dest_klass = (klassOop)badOop); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
280 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
281 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
282 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
283 case java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_PRIM: { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
284 // i2l, etc., on the Nth outgoing argument in place |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
285 BasicType src = chain().adapter_conversion_src_type(), |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
286 dest = chain().adapter_conversion_dest_type(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
287 Bytecodes::Code bc = conversion_code(src, dest); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
288 ArgToken arg = arg_state->_arg; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
289 if (bc == Bytecodes::_nop) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
290 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
291 } else if (bc != Bytecodes::_illegal) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
292 arg = make_conversion(dest, NULL, bc, arg, CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
293 } else if (is_subword_type(dest)) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
294 bc = conversion_code(src, T_INT); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
295 if (bc != Bytecodes::_illegal) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
296 arg = make_conversion(dest, NULL, bc, arg, CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
297 bc = conversion_code(T_INT, dest); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
298 arg = make_conversion(dest, NULL, bc, arg, CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
299 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
300 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
301 if (bc == Bytecodes::_illegal) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
302 lose("bad primitive conversion", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
303 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
304 change_argument(src, arg_slot, dest, arg); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
305 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
306 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
307 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
308 case java_lang_invoke_AdapterMethodHandle::OP_REF_TO_PRIM: { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
309 // checkcast to wrapper type & call intValue, etc. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
310 BasicType dest = chain().adapter_conversion_dest_type(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
311 ArgToken arg = arg_state->_arg; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
312 arg = make_conversion(T_OBJECT, SystemDictionary::box_klass(dest), |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
313 Bytecodes::_checkcast, arg, CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
314 vmIntrinsics::ID unboxer = vmIntrinsics::for_unboxing(dest); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
315 if (unboxer == vmIntrinsics::_none) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
316 lose("no unboxing method", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
317 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
318 ArgToken arglist[2]; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
319 arglist[0] = arg; // outgoing 'this' |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
320 arglist[1] = ArgToken(); // sentinel |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
321 arg = make_invoke(NULL, unboxer, Bytecodes::_invokevirtual, false, 1, &arglist[0], CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
322 change_argument(T_OBJECT, arg_slot, dest, arg); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
323 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
324 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
325 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
326 case java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_REF: { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
327 // call wrapper type.valueOf |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
328 BasicType src = chain().adapter_conversion_src_type(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
329 ArgToken arg = arg_state->_arg; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
330 vmIntrinsics::ID boxer = vmIntrinsics::for_boxing(src); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
331 if (boxer == vmIntrinsics::_none) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
332 lose("no boxing method", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
333 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
334 ArgToken arglist[2]; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
335 arglist[0] = arg; // outgoing value |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
336 arglist[1] = ArgToken(); // sentinel |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1783
diff
changeset
|
337 arg = make_invoke(NULL, boxer, Bytecodes::_invokevirtual, false, 1, &arglist[0], CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
338 change_argument(src, arg_slot, T_OBJECT, arg); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
339 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
340 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
341 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
342 case java_lang_invoke_AdapterMethodHandle::OP_SWAP_ARGS: { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
343 int dest_arg_slot = chain().adapter_conversion_vminfo(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
344 if (!slot_has_argument(dest_arg_slot)) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
345 lose("bad swap index", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
346 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
347 // a simple swap between two arguments |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
348 SlotState* dest_arg_state = slot_state(dest_arg_slot); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
349 SlotState temp = (*dest_arg_state); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
350 (*dest_arg_state) = (*arg_state); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
351 (*arg_state) = temp; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
352 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
353 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
354 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
355 case java_lang_invoke_AdapterMethodHandle::OP_ROT_ARGS: { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
356 int dest_arg_slot = chain().adapter_conversion_vminfo(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
357 if (!slot_has_argument(dest_arg_slot) || arg_slot == dest_arg_slot) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
358 lose("bad rotate index", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
359 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
360 SlotState* dest_arg_state = slot_state(dest_arg_slot); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
361 // Rotate the source argument (plus following N slots) into the |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
362 // position occupied by the dest argument (plus following N slots). |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
363 int rotate_count = type2size[dest_arg_state->_type]; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
364 // (no other rotate counts are currently supported) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
365 if (arg_slot < dest_arg_slot) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
366 for (int i = 0; i < rotate_count; i++) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
367 SlotState temp = _outgoing.at(arg_slot); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
368 _outgoing.remove_at(arg_slot); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
369 _outgoing.insert_before(dest_arg_slot + rotate_count - 1, temp); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
370 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
371 } else { // arg_slot > dest_arg_slot |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
372 for (int i = 0; i < rotate_count; i++) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
373 SlotState temp = _outgoing.at(arg_slot + rotate_count - 1); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
374 _outgoing.remove_at(arg_slot + rotate_count - 1); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
375 _outgoing.insert_before(dest_arg_slot, temp); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
376 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
377 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
378 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
379 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
380 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
381 case java_lang_invoke_AdapterMethodHandle::OP_DUP_ARGS: { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
382 int dup_slots = chain().adapter_conversion_stack_pushes(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
383 if (dup_slots <= 0) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
384 lose("bad dup count", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
385 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
386 for (int i = 0; i < dup_slots; i++) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
387 SlotState* dup = slot_state(arg_slot + 2*i); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
388 if (dup == NULL) break; // safety net |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
389 if (dup->_type != T_VOID) _outgoing_argc += 1; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
390 _outgoing.insert_before(i, (*dup)); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
391 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
392 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
393 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
394 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
395 case java_lang_invoke_AdapterMethodHandle::OP_DROP_ARGS: { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
396 int drop_slots = -chain().adapter_conversion_stack_pushes(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
397 if (drop_slots <= 0) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
398 lose("bad drop count", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
399 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
400 for (int i = 0; i < drop_slots; i++) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
401 SlotState* drop = slot_state(arg_slot); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
402 if (drop == NULL) break; // safety net |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
403 if (drop->_type != T_VOID) _outgoing_argc -= 1; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
404 _outgoing.remove_at(arg_slot); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
405 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
406 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
407 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
408 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
409 case java_lang_invoke_AdapterMethodHandle::OP_COLLECT_ARGS: { //NYI, may GC |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
410 lose("unimplemented", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
411 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
412 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
413 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
414 case java_lang_invoke_AdapterMethodHandle::OP_SPREAD_ARGS: { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
415 klassOop array_klass_oop = NULL; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
416 BasicType array_type = java_lang_Class::as_BasicType(chain().adapter_arg_oop(), |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
417 &array_klass_oop); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
418 assert(array_type == T_OBJECT, ""); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
419 assert(Klass::cast(array_klass_oop)->oop_is_array(), ""); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
420 arrayKlassHandle array_klass(THREAD, array_klass_oop); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
421 debug_only(array_klass_oop = (klassOop)badOop); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
422 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
423 klassOop element_klass_oop = NULL; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
424 BasicType element_type = java_lang_Class::as_BasicType(array_klass->component_mirror(), |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
425 &element_klass_oop); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
426 KlassHandle element_klass(THREAD, element_klass_oop); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
427 debug_only(element_klass_oop = (klassOop)badOop); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
428 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
429 // Fetch the argument, which we will cast to the required array type. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
430 assert(arg_state->_type == T_OBJECT, ""); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
431 ArgToken array_arg = arg_state->_arg; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
432 array_arg = make_conversion(T_OBJECT, array_klass(), Bytecodes::_checkcast, array_arg, CHECK_(empty)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
433 change_argument(T_OBJECT, arg_slot, T_VOID, ArgToken(tt_void)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
434 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
435 // Check the required length. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
436 int spread_slots = 1 + chain().adapter_conversion_stack_pushes(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
437 int spread_length = spread_slots; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
438 if (type2size[element_type] == 2) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
439 if (spread_slots % 2 != 0) spread_slots = -1; // force error |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
440 spread_length = spread_slots / 2; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
441 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
442 if (spread_slots < 0) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
443 lose("bad spread length", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
444 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
445 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
446 jvalue length_jvalue; length_jvalue.i = spread_length; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
447 ArgToken length_arg = make_prim_constant(T_INT, &length_jvalue, CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
448 // Call a built-in method known to the JVM to validate the length. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
449 ArgToken arglist[3]; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
450 arglist[0] = array_arg; // value to check |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
451 arglist[1] = length_arg; // length to check |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
452 arglist[2] = ArgToken(); // sentinel |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
453 make_invoke(NULL, vmIntrinsics::_checkSpreadArgument, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
454 Bytecodes::_invokestatic, false, 3, &arglist[0], CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
455 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
456 // Spread out the array elements. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
457 Bytecodes::Code aload_op = Bytecodes::_aaload; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
458 if (element_type != T_OBJECT) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
459 lose("primitive array NYI", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
460 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
461 int ap = arg_slot; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
462 for (int i = 0; i < spread_length; i++) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
463 jvalue offset_jvalue; offset_jvalue.i = i; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
464 ArgToken offset_arg = make_prim_constant(T_INT, &offset_jvalue, CHECK_(empty)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
465 ArgToken element_arg = make_fetch(element_type, element_klass(), aload_op, array_arg, offset_arg, CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
466 change_argument(T_VOID, ap, element_type, element_arg); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
467 ap += type2size[element_type]; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
468 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
469 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
470 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
471 |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
472 case java_lang_invoke_AdapterMethodHandle::OP_FLYBY: //NYI, runs Java code |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
473 case java_lang_invoke_AdapterMethodHandle::OP_RICOCHET: //NYI, runs Java code |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
474 lose("unimplemented", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
475 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
476 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
477 default: |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
478 lose("bad adapter conversion", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
479 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
480 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
481 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
482 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
483 if (chain().is_bound()) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
484 // push a new argument |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
485 BasicType arg_type = chain().bound_arg_type(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
486 jint arg_slot = chain().bound_arg_slot(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
487 oop arg_oop = chain().bound_arg_oop(); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
488 ArgToken arg; |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
489 if (arg_type == T_OBJECT) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
490 arg = make_oop_constant(arg_oop, CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
491 } else { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
492 jvalue arg_value; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
493 BasicType bt = java_lang_boxing_object::get_value(arg_oop, &arg_value); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
494 if (bt == arg_type) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
495 arg = make_prim_constant(arg_type, &arg_value, CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
496 } else { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
497 lose("bad bound value", CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
498 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
499 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
500 debug_only(arg_oop = badOop); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
501 change_argument(T_VOID, arg_slot, arg_type, arg); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
502 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
503 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
504 // this test must come after the body of the loop |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
505 if (!chain().is_last()) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
506 chain().next(CHECK_(empty)); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
507 } else { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
508 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
509 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
510 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
511 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
512 // finish the sequence with a tail-call to the ultimate target |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
513 // parameters are passed in logical order (recv 1st), not slot order |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
514 ArgToken* arglist = NEW_RESOURCE_ARRAY(ArgToken, _outgoing.length() + 1); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
515 int ap = 0; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
516 for (int i = _outgoing.length() - 1; i >= 0; i--) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
517 SlotState* arg_state = slot_state(i); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
518 if (arg_state->_type == T_VOID) continue; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
519 arglist[ap++] = _outgoing.at(i)._arg; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
520 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
521 assert(ap == _outgoing_argc, ""); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
522 arglist[ap] = ArgToken(); // add a sentinel, for the sake of asserts |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
523 return make_invoke(chain().last_method_oop(), |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
524 vmIntrinsics::_none, |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
525 chain().last_invoke_code(), true, |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
526 ap, arglist, THREAD); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
527 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
528 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
529 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
530 // ----------------------------------------------------------------------------- |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
531 // MethodHandleWalker::walk_incoming_state |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
532 // |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
533 void MethodHandleWalker::walk_incoming_state(TRAPS) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
534 Handle mtype(THREAD, chain().method_type_oop()); |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
535 int nptypes = java_lang_invoke_MethodType::ptype_count(mtype()); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
536 _outgoing_argc = nptypes; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
537 int argp = nptypes - 1; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
538 if (argp >= 0) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
539 _outgoing.at_grow(argp, make_state(T_VOID, ArgToken(tt_void))); // presize |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
540 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
541 for (int i = 0; i < nptypes; i++) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
542 klassOop arg_type_klass = NULL; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
543 BasicType arg_type = java_lang_Class::as_BasicType( |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
544 java_lang_invoke_MethodType::ptype(mtype(), i), &arg_type_klass); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
545 int index = new_local_index(arg_type); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
546 ArgToken arg = make_parameter(arg_type, arg_type_klass, index, CHECK); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
547 debug_only(arg_type_klass = (klassOop) NULL); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
548 _outgoing.at_put(argp, make_state(arg_type, arg)); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
549 if (type2size[arg_type] == 2) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
550 // add the extra slot, so we can model the JVM stack |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
551 _outgoing.insert_before(argp+1, make_state(T_VOID, ArgToken(tt_void))); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
552 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
553 --argp; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
554 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
555 // call make_parameter at the end of the list for the return type |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
556 klassOop ret_type_klass = NULL; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
557 BasicType ret_type = java_lang_Class::as_BasicType( |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
558 java_lang_invoke_MethodType::rtype(mtype()), &ret_type_klass); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
559 ArgToken ret = make_parameter(ret_type, ret_type_klass, -1, CHECK); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
560 // ignore ret; client can catch it if needed |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
561 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
562 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
563 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
564 // ----------------------------------------------------------------------------- |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
565 // MethodHandleWalker::change_argument |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
566 // |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
567 // This is messy because some kinds of arguments are paired with |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
568 // companion slots containing an empty value. |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
569 void MethodHandleWalker::change_argument(BasicType old_type, int slot, BasicType new_type, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
570 const ArgToken& new_arg) { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
571 int old_size = type2size[old_type]; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
572 int new_size = type2size[new_type]; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
573 if (old_size == new_size) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
574 // simple case first |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
575 _outgoing.at_put(slot, make_state(new_type, new_arg)); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
576 } else if (old_size > new_size) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
577 for (int i = old_size - 1; i >= new_size; i--) { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
578 assert((i != 0) == (_outgoing.at(slot + i)._type == T_VOID), ""); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
579 _outgoing.remove_at(slot + i); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
580 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
581 if (new_size > 0) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
582 _outgoing.at_put(slot, make_state(new_type, new_arg)); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
583 else |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
584 _outgoing_argc -= 1; // deleted a real argument |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
585 } else { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
586 for (int i = old_size; i < new_size; i++) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
587 _outgoing.insert_before(slot + i, make_state(T_VOID, ArgToken(tt_void))); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
588 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
589 _outgoing.at_put(slot, make_state(new_type, new_arg)); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
590 if (old_size == 0) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
591 _outgoing_argc += 1; // inserted a real argument |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
592 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
593 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
594 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
595 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
596 #ifdef ASSERT |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
597 int MethodHandleWalker::argument_count_slow() { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
598 int args_seen = 0; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
599 for (int i = _outgoing.length() - 1; i >= 0; i--) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
600 if (_outgoing.at(i)._type != T_VOID) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
601 ++args_seen; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
602 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
603 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
604 return args_seen; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
605 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
606 #endif |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
607 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
608 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
609 // ----------------------------------------------------------------------------- |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
610 // MethodHandleCompiler |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
611 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
612 MethodHandleCompiler::MethodHandleCompiler(Handle root, methodHandle callee, bool is_invokedynamic, TRAPS) |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
613 : MethodHandleWalker(root, is_invokedynamic, THREAD), |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
614 _callee(callee), |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
615 _thread(THREAD), |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
616 _bytecode(THREAD, 50), |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
617 _constants(THREAD, 10), |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
618 _cur_stack(0), |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
619 _max_stack(0), |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
620 _rtype(T_ILLEGAL) |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
621 { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
622 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
623 // Element zero is always the null constant. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
624 (void) _constants.append(NULL); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
625 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
626 // Set name and signature index. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
627 _name_index = cpool_symbol_put(_callee->name()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
628 _signature_index = cpool_symbol_put(_callee->signature()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
629 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
630 // Get return type klass. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
631 Handle first_mtype(THREAD, chain().method_type_oop()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
632 // _rklass is NULL for primitives. |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
633 _rtype = java_lang_Class::as_BasicType(java_lang_invoke_MethodType::rtype(first_mtype()), &_rklass); |
1152
cd37471eaecc
6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents:
1142
diff
changeset
|
634 if (_rtype == T_ARRAY) _rtype = T_OBJECT; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
635 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
636 int params = _callee->size_of_parameters(); // Incoming arguments plus receiver. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
637 _num_params = for_invokedynamic() ? params - 1 : params; // XXX Check if callee is static? |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
638 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
639 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
640 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
641 // ----------------------------------------------------------------------------- |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
642 // MethodHandleCompiler::compile |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
643 // |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
644 // Compile this MethodHandle into a bytecode adapter and return a |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
645 // methodOop. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
646 methodHandle MethodHandleCompiler::compile(TRAPS) { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
647 assert(_thread == THREAD, "must be same thread"); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
648 methodHandle nullHandle; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
649 (void) walk(CHECK_(nullHandle)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
650 return get_method_oop(CHECK_(nullHandle)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
651 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
652 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
653 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
654 void MethodHandleCompiler::emit_bc(Bytecodes::Code op, int index) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
655 Bytecodes::check(op); // Are we legal? |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
656 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
657 switch (op) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
658 // b |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
659 case Bytecodes::_aconst_null: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
660 case Bytecodes::_iconst_m1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
661 case Bytecodes::_iconst_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
662 case Bytecodes::_iconst_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
663 case Bytecodes::_iconst_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
664 case Bytecodes::_iconst_3: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
665 case Bytecodes::_iconst_4: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
666 case Bytecodes::_iconst_5: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
667 case Bytecodes::_lconst_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
668 case Bytecodes::_lconst_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
669 case Bytecodes::_fconst_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
670 case Bytecodes::_fconst_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
671 case Bytecodes::_fconst_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
672 case Bytecodes::_dconst_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
673 case Bytecodes::_dconst_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
674 case Bytecodes::_iload_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
675 case Bytecodes::_iload_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
676 case Bytecodes::_iload_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
677 case Bytecodes::_iload_3: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
678 case Bytecodes::_lload_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
679 case Bytecodes::_lload_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
680 case Bytecodes::_lload_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
681 case Bytecodes::_lload_3: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
682 case Bytecodes::_fload_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
683 case Bytecodes::_fload_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
684 case Bytecodes::_fload_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
685 case Bytecodes::_fload_3: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
686 case Bytecodes::_dload_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
687 case Bytecodes::_dload_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
688 case Bytecodes::_dload_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
689 case Bytecodes::_dload_3: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
690 case Bytecodes::_aload_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
691 case Bytecodes::_aload_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
692 case Bytecodes::_aload_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
693 case Bytecodes::_aload_3: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
694 case Bytecodes::_istore_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
695 case Bytecodes::_istore_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
696 case Bytecodes::_istore_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
697 case Bytecodes::_istore_3: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
698 case Bytecodes::_lstore_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
699 case Bytecodes::_lstore_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
700 case Bytecodes::_lstore_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
701 case Bytecodes::_lstore_3: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
702 case Bytecodes::_fstore_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
703 case Bytecodes::_fstore_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
704 case Bytecodes::_fstore_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
705 case Bytecodes::_fstore_3: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
706 case Bytecodes::_dstore_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
707 case Bytecodes::_dstore_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
708 case Bytecodes::_dstore_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
709 case Bytecodes::_dstore_3: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
710 case Bytecodes::_astore_0: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
711 case Bytecodes::_astore_1: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
712 case Bytecodes::_astore_2: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
713 case Bytecodes::_astore_3: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
714 case Bytecodes::_i2l: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
715 case Bytecodes::_i2f: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
716 case Bytecodes::_i2d: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
717 case Bytecodes::_i2b: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
718 case Bytecodes::_i2c: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
719 case Bytecodes::_i2s: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
720 case Bytecodes::_l2i: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
721 case Bytecodes::_l2f: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
722 case Bytecodes::_l2d: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
723 case Bytecodes::_f2i: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
724 case Bytecodes::_f2l: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
725 case Bytecodes::_f2d: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
726 case Bytecodes::_d2i: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
727 case Bytecodes::_d2l: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
728 case Bytecodes::_d2f: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
729 case Bytecodes::_ireturn: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
730 case Bytecodes::_lreturn: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
731 case Bytecodes::_freturn: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
732 case Bytecodes::_dreturn: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
733 case Bytecodes::_areturn: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
734 case Bytecodes::_return: |
1565 | 735 assert(Bytecodes::format_bits(op, false) == Bytecodes::_fmt_b, "wrong bytecode format"); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
736 _bytecode.push(op); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
737 break; |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
738 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
739 // bi |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
740 case Bytecodes::_ldc: |
1662
e0ba4e04c839
6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents:
1579
diff
changeset
|
741 assert(Bytecodes::format_bits(op, false) == (Bytecodes::_fmt_b|Bytecodes::_fmt_has_k), "wrong bytecode format"); |
e0ba4e04c839
6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents:
1579
diff
changeset
|
742 assert((char) index == index, "index does not fit in 8-bit"); |
e0ba4e04c839
6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents:
1579
diff
changeset
|
743 _bytecode.push(op); |
e0ba4e04c839
6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents:
1579
diff
changeset
|
744 _bytecode.push(index); |
e0ba4e04c839
6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents:
1579
diff
changeset
|
745 break; |
e0ba4e04c839
6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents:
1579
diff
changeset
|
746 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
747 case Bytecodes::_iload: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
748 case Bytecodes::_lload: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
749 case Bytecodes::_fload: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
750 case Bytecodes::_dload: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
751 case Bytecodes::_aload: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
752 case Bytecodes::_istore: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
753 case Bytecodes::_lstore: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
754 case Bytecodes::_fstore: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
755 case Bytecodes::_dstore: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
756 case Bytecodes::_astore: |
1565 | 757 assert(Bytecodes::format_bits(op, false) == Bytecodes::_fmt_bi, "wrong bytecode format"); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
758 assert((char) index == index, "index does not fit in 8-bit"); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
759 _bytecode.push(op); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
760 _bytecode.push(index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
761 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
762 |
1662
e0ba4e04c839
6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents:
1579
diff
changeset
|
763 // bkk |
e0ba4e04c839
6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents:
1579
diff
changeset
|
764 case Bytecodes::_ldc_w: |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
765 case Bytecodes::_ldc2_w: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
766 case Bytecodes::_checkcast: |
1565 | 767 assert(Bytecodes::format_bits(op, false) == Bytecodes::_fmt_bkk, "wrong bytecode format"); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
768 assert((short) index == index, "index does not fit in 16-bit"); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
769 _bytecode.push(op); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
770 _bytecode.push(index >> 8); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
771 _bytecode.push(index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
772 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
773 |
1565 | 774 // bJJ |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
775 case Bytecodes::_invokestatic: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
776 case Bytecodes::_invokespecial: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
777 case Bytecodes::_invokevirtual: |
1565 | 778 assert(Bytecodes::format_bits(op, false) == Bytecodes::_fmt_bJJ, "wrong bytecode format"); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
779 assert((short) index == index, "index does not fit in 16-bit"); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
780 _bytecode.push(op); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
781 _bytecode.push(index >> 8); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
782 _bytecode.push(index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
783 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
784 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
785 default: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
786 ShouldNotReachHere(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
787 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
788 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
789 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
790 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
791 void MethodHandleCompiler::emit_load(BasicType bt, int index) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
792 if (index <= 3) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
793 switch (bt) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
794 case T_BOOLEAN: case T_BYTE: case T_CHAR: case T_SHORT: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
795 case T_INT: emit_bc(Bytecodes::cast(Bytecodes::_iload_0 + index)); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
796 case T_LONG: emit_bc(Bytecodes::cast(Bytecodes::_lload_0 + index)); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
797 case T_FLOAT: emit_bc(Bytecodes::cast(Bytecodes::_fload_0 + index)); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
798 case T_DOUBLE: emit_bc(Bytecodes::cast(Bytecodes::_dload_0 + index)); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
799 case T_OBJECT: emit_bc(Bytecodes::cast(Bytecodes::_aload_0 + index)); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
800 default: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
801 ShouldNotReachHere(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
802 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
803 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
804 else { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
805 switch (bt) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
806 case T_BOOLEAN: case T_BYTE: case T_CHAR: case T_SHORT: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
807 case T_INT: emit_bc(Bytecodes::_iload, index); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
808 case T_LONG: emit_bc(Bytecodes::_lload, index); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
809 case T_FLOAT: emit_bc(Bytecodes::_fload, index); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
810 case T_DOUBLE: emit_bc(Bytecodes::_dload, index); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
811 case T_OBJECT: emit_bc(Bytecodes::_aload, index); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
812 default: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
813 ShouldNotReachHere(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
814 } |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
815 } |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
816 stack_push(bt); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
817 } |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
818 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
819 void MethodHandleCompiler::emit_store(BasicType bt, int index) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
820 if (index <= 3) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
821 switch (bt) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
822 case T_BOOLEAN: case T_BYTE: case T_CHAR: case T_SHORT: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
823 case T_INT: emit_bc(Bytecodes::cast(Bytecodes::_istore_0 + index)); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
824 case T_LONG: emit_bc(Bytecodes::cast(Bytecodes::_lstore_0 + index)); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
825 case T_FLOAT: emit_bc(Bytecodes::cast(Bytecodes::_fstore_0 + index)); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
826 case T_DOUBLE: emit_bc(Bytecodes::cast(Bytecodes::_dstore_0 + index)); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
827 case T_OBJECT: emit_bc(Bytecodes::cast(Bytecodes::_astore_0 + index)); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
828 default: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
829 ShouldNotReachHere(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
830 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
831 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
832 else { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
833 switch (bt) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
834 case T_BOOLEAN: case T_BYTE: case T_CHAR: case T_SHORT: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
835 case T_INT: emit_bc(Bytecodes::_istore, index); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
836 case T_LONG: emit_bc(Bytecodes::_lstore, index); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
837 case T_FLOAT: emit_bc(Bytecodes::_fstore, index); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
838 case T_DOUBLE: emit_bc(Bytecodes::_dstore, index); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
839 case T_OBJECT: emit_bc(Bytecodes::_astore, index); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
840 default: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
841 ShouldNotReachHere(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
842 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
843 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
844 stack_pop(bt); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
845 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
846 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
847 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
848 void MethodHandleCompiler::emit_load_constant(ArgToken arg) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
849 BasicType bt = arg.basic_type(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
850 switch (bt) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
851 case T_INT: { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
852 jint value = arg.get_jint(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
853 if (-1 <= value && value <= 5) |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
854 emit_bc(Bytecodes::cast(Bytecodes::_iconst_0 + value)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
855 else |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
856 emit_bc(Bytecodes::_ldc, cpool_int_put(value)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
857 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
858 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
859 case T_LONG: { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
860 jlong value = arg.get_jlong(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
861 if (0 <= value && value <= 1) |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
862 emit_bc(Bytecodes::cast(Bytecodes::_lconst_0 + (int) value)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
863 else |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
864 emit_bc(Bytecodes::_ldc2_w, cpool_long_put(value)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
865 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
866 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
867 case T_FLOAT: { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
868 jfloat value = arg.get_jfloat(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
869 if (value == 0.0 || value == 1.0 || value == 2.0) |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
870 emit_bc(Bytecodes::cast(Bytecodes::_fconst_0 + (int) value)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
871 else |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
872 emit_bc(Bytecodes::_ldc, cpool_float_put(value)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
873 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
874 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
875 case T_DOUBLE: { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
876 jdouble value = arg.get_jdouble(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
877 if (value == 0.0 || value == 1.0) |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
878 emit_bc(Bytecodes::cast(Bytecodes::_dconst_0 + (int) value)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
879 else |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
880 emit_bc(Bytecodes::_ldc2_w, cpool_double_put(value)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
881 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
882 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
883 case T_OBJECT: { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
884 Handle value = arg.object(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
885 if (value.is_null()) |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
886 emit_bc(Bytecodes::_aconst_null); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
887 else |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
888 emit_bc(Bytecodes::_ldc, cpool_object_put(value)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
889 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
890 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
891 default: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
892 ShouldNotReachHere(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
893 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
894 stack_push(bt); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
895 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
896 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
897 |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
898 MethodHandleWalker::ArgToken |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
899 MethodHandleCompiler::make_conversion(BasicType type, klassOop tk, Bytecodes::Code op, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
900 const ArgToken& src, TRAPS) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
901 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
902 BasicType srctype = src.basic_type(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
903 int index = src.index(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
904 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
905 switch (op) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
906 case Bytecodes::_i2l: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
907 case Bytecodes::_i2f: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
908 case Bytecodes::_i2d: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
909 case Bytecodes::_i2b: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
910 case Bytecodes::_i2c: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
911 case Bytecodes::_i2s: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
912 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
913 case Bytecodes::_l2i: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
914 case Bytecodes::_l2f: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
915 case Bytecodes::_l2d: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
916 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
917 case Bytecodes::_f2i: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
918 case Bytecodes::_f2l: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
919 case Bytecodes::_f2d: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
920 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
921 case Bytecodes::_d2i: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
922 case Bytecodes::_d2l: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
923 case Bytecodes::_d2f: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
924 emit_load(srctype, index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
925 stack_pop(srctype); // pop the src type |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
926 emit_bc(op); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
927 stack_push(type); // push the dest value |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
928 if (srctype != type) |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
929 index = new_local_index(type); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
930 emit_store(type, index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
931 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
932 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
933 case Bytecodes::_checkcast: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
934 emit_load(srctype, index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
935 emit_bc(op, cpool_klass_put(tk)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
936 emit_store(srctype, index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
937 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
938 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
939 default: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
940 ShouldNotReachHere(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
941 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
942 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
943 return make_parameter(type, tk, index, THREAD); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
944 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
945 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
946 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
947 // ----------------------------------------------------------------------------- |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
948 // MethodHandleCompiler |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
949 // |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
950 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
951 static jvalue zero_jvalue; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
952 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
953 // Emit bytecodes for the given invoke instruction. |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
954 MethodHandleWalker::ArgToken |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
955 MethodHandleCompiler::make_invoke(methodOop m, vmIntrinsics::ID iid, |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
956 Bytecodes::Code op, bool tailcall, |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
957 int argc, MethodHandleWalker::ArgToken* argv, |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
958 TRAPS) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
959 if (m == NULL) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
960 // Get the intrinsic methodOop. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
961 m = vmIntrinsics::method_for(iid); |
2356
72dee110246f
6839872: remove implementation inheritance from JSR 292 APIs
jrose
parents:
2226
diff
changeset
|
962 if (m == NULL && iid == vmIntrinsics::_checkSpreadArgument && AllowTransitionalJSR292) { |
72dee110246f
6839872: remove implementation inheritance from JSR 292 APIs
jrose
parents:
2226
diff
changeset
|
963 m = vmIntrinsics::method_for(vmIntrinsics::_checkSpreadArgument_TRANS); |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
964 if (m == NULL) |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
965 // sun.dyn.MethodHandleImpl not found, look for java.dyn.MethodHandleNatives: |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
966 m = vmIntrinsics::method_for(vmIntrinsics::_checkSpreadArgument_TRANS2); |
2356
72dee110246f
6839872: remove implementation inheritance from JSR 292 APIs
jrose
parents:
2226
diff
changeset
|
967 } |
72dee110246f
6839872: remove implementation inheritance from JSR 292 APIs
jrose
parents:
2226
diff
changeset
|
968 if (m == NULL) { |
72dee110246f
6839872: remove implementation inheritance from JSR 292 APIs
jrose
parents:
2226
diff
changeset
|
969 ArgToken zero; |
72dee110246f
6839872: remove implementation inheritance from JSR 292 APIs
jrose
parents:
2226
diff
changeset
|
970 lose(vmIntrinsics::name_at(iid), CHECK_(zero)); |
72dee110246f
6839872: remove implementation inheritance from JSR 292 APIs
jrose
parents:
2226
diff
changeset
|
971 } |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
972 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
973 |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2117
diff
changeset
|
974 klassOop klass = m->method_holder(); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2117
diff
changeset
|
975 Symbol* name = m->name(); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2117
diff
changeset
|
976 Symbol* signature = m->signature(); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
977 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
978 if (tailcall) { |
1152
cd37471eaecc
6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents:
1142
diff
changeset
|
979 // Actually, in order to make these methods more recognizable, |
2001
f2da85a9b08e
7001363: java/dyn/InvokeDynamic should not be a well-known class in the JVM
twisti
parents:
1972
diff
changeset
|
980 // let's put them in holder class MethodHandle. That way stack |
f2da85a9b08e
7001363: java/dyn/InvokeDynamic should not be a well-known class in the JVM
twisti
parents:
1972
diff
changeset
|
981 // walkers and compiler heuristics can recognize them. |
f2da85a9b08e
7001363: java/dyn/InvokeDynamic should not be a well-known class in the JVM
twisti
parents:
1972
diff
changeset
|
982 _target_klass = SystemDictionary::MethodHandle_klass(); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
983 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
984 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
985 // Inline the method. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
986 InvocationCounter* ic = m->invocation_counter(); |
1783 | 987 ic->set_carry_flag(); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
988 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
989 for (int i = 0; i < argc; i++) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
990 ArgToken arg = argv[i]; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
991 TokenType tt = arg.token_type(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
992 BasicType bt = arg.basic_type(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
993 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
994 switch (tt) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
995 case tt_parameter: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
996 case tt_temporary: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
997 emit_load(bt, arg.index()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
998 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
999 case tt_constant: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1000 emit_load_constant(arg); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1001 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1002 case tt_illegal: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1003 // Sentinel. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1004 assert(i == (argc - 1), "sentinel must be last entry"); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1005 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1006 case tt_void: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1007 default: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1008 ShouldNotReachHere(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1009 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1010 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1011 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1012 // Populate constant pool. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1013 int name_index = cpool_symbol_put(name); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1014 int signature_index = cpool_symbol_put(signature); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1015 int name_and_type_index = cpool_name_and_type_put(name_index, signature_index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1016 int klass_index = cpool_klass_put(klass); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1017 int methodref_index = cpool_methodref_put(klass_index, name_and_type_index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1018 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1019 // Generate invoke. |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1020 switch (op) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1021 case Bytecodes::_invokestatic: |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1022 case Bytecodes::_invokespecial: |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1023 case Bytecodes::_invokevirtual: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1024 emit_bc(op, methodref_index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1025 break; |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1026 case Bytecodes::_invokeinterface: |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1027 Unimplemented(); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1028 break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1029 default: |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1030 ShouldNotReachHere(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1031 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1032 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1033 // If tailcall, we have walked all the way to a direct method handle. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1034 // Otherwise, make a recursive call to some helper routine. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1035 BasicType rbt = m->result_type(); |
1152
cd37471eaecc
6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents:
1142
diff
changeset
|
1036 if (rbt == T_ARRAY) rbt = T_OBJECT; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1037 ArgToken ret; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1038 if (tailcall) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1039 if (rbt != _rtype) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1040 if (rbt == T_VOID) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1041 // push a zero of the right sort |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1042 ArgToken zero; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1043 if (_rtype == T_OBJECT) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1044 zero = make_oop_constant(NULL, CHECK_(zero)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1045 } else { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1046 zero = make_prim_constant(_rtype, &zero_jvalue, CHECK_(zero)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1047 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1048 emit_load_constant(zero); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1049 } else if (_rtype == T_VOID) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1050 // We'll emit a _return with something on the stack. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1051 // It's OK to ignore what's on the stack. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1052 } else { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1053 tty->print_cr("*** rbt=%d != rtype=%d", rbt, _rtype); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1054 assert(false, "IMPLEMENT ME"); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1055 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1056 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1057 switch (_rtype) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1058 case T_BOOLEAN: case T_BYTE: case T_CHAR: case T_SHORT: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1059 case T_INT: emit_bc(Bytecodes::_ireturn); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1060 case T_LONG: emit_bc(Bytecodes::_lreturn); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1061 case T_FLOAT: emit_bc(Bytecodes::_freturn); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1062 case T_DOUBLE: emit_bc(Bytecodes::_dreturn); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1063 case T_VOID: emit_bc(Bytecodes::_return); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1064 case T_OBJECT: |
1142 | 1065 if (_rklass.not_null() && _rklass() != SystemDictionary::Object_klass()) |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1066 emit_bc(Bytecodes::_checkcast, cpool_klass_put(_rklass())); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1067 emit_bc(Bytecodes::_areturn); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1068 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1069 default: ShouldNotReachHere(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1070 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1071 ret = ArgToken(); // Dummy return value. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1072 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1073 else { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1074 stack_push(rbt); // The return value is already pushed onto the stack. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1075 int index = new_local_index(rbt); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1076 switch (rbt) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1077 case T_BOOLEAN: case T_BYTE: case T_CHAR: case T_SHORT: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1078 case T_INT: case T_LONG: case T_FLOAT: case T_DOUBLE: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1079 case T_OBJECT: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1080 emit_store(rbt, index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1081 ret = ArgToken(tt_temporary, rbt, index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1082 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1083 case T_VOID: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1084 ret = ArgToken(tt_void); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1085 break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1086 default: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1087 ShouldNotReachHere(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1088 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1089 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1090 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1091 return ret; |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1092 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1093 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1094 MethodHandleWalker::ArgToken |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1095 MethodHandleCompiler::make_fetch(BasicType type, klassOop tk, Bytecodes::Code op, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1096 const MethodHandleWalker::ArgToken& base, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1097 const MethodHandleWalker::ArgToken& offset, |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1098 TRAPS) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1099 Unimplemented(); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1100 return ArgToken(); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1101 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1102 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1103 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1104 int MethodHandleCompiler::cpool_primitive_put(BasicType bt, jvalue* con) { |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1105 jvalue con_copy; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1106 assert(bt < T_OBJECT, ""); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1107 if (type2aelembytes(bt) < jintSize) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1108 // widen to int |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1109 con_copy = (*con); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1110 con = &con_copy; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1111 switch (bt) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1112 case T_BOOLEAN: con->i = (con->z ? 1 : 0); break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1113 case T_BYTE: con->i = con->b; break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1114 case T_CHAR: con->i = con->c; break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1115 case T_SHORT: con->i = con->s; break; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1116 default: ShouldNotReachHere(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1117 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1118 bt = T_INT; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1119 } |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1120 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1121 // for (int i = 1, imax = _constants.length(); i < imax; i++) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1122 // ConstantValue* con = _constants.at(i); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1123 // if (con != NULL && con->is_primitive() && con->_type == bt) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1124 // bool match = false; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1125 // switch (type2size[bt]) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1126 // case 1: if (pcon->_value.i == con->i) match = true; break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1127 // case 2: if (pcon->_value.j == con->j) match = true; break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1128 // } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1129 // if (match) |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1130 // return i; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1131 // } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1132 // } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1133 ConstantValue* cv = new ConstantValue(bt, *con); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1134 int index = _constants.append(cv); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1135 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1136 // long and double entries take 2 slots, we add another empty entry. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1137 if (type2size[bt] == 2) |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1138 (void) _constants.append(NULL); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1139 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1140 return index; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1141 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1142 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1143 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1144 constantPoolHandle MethodHandleCompiler::get_constant_pool(TRAPS) const { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1145 constantPoolHandle nullHandle; |
2226
c5a923563727
6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents:
2177
diff
changeset
|
1146 constantPoolOop cpool_oop = oopFactory::new_constantPool(_constants.length(), |
c5a923563727
6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents:
2177
diff
changeset
|
1147 oopDesc::IsSafeConc, |
c5a923563727
6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents:
2177
diff
changeset
|
1148 CHECK_(nullHandle)); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1149 constantPoolHandle cpool(THREAD, cpool_oop); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1150 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1151 // Fill the real constant pool skipping the zero element. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1152 for (int i = 1; i < _constants.length(); i++) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1153 ConstantValue* cv = _constants.at(i); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1154 switch (cv->tag()) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2117
diff
changeset
|
1155 case JVM_CONSTANT_Utf8: cpool->symbol_at_put( i, cv->symbol() ); break; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1156 case JVM_CONSTANT_Integer: cpool->int_at_put( i, cv->get_jint() ); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1157 case JVM_CONSTANT_Float: cpool->float_at_put( i, cv->get_jfloat() ); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1158 case JVM_CONSTANT_Long: cpool->long_at_put( i, cv->get_jlong() ); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1159 case JVM_CONSTANT_Double: cpool->double_at_put( i, cv->get_jdouble() ); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1160 case JVM_CONSTANT_Class: cpool->klass_at_put( i, cv->klass_oop() ); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1161 case JVM_CONSTANT_Methodref: cpool->method_at_put( i, cv->first_index(), cv->second_index()); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1162 case JVM_CONSTANT_NameAndType: cpool->name_and_type_at_put(i, cv->first_index(), cv->second_index()); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1163 case JVM_CONSTANT_Object: cpool->object_at_put( i, cv->object_oop() ); break; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1164 default: ShouldNotReachHere(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1165 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1166 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1167 switch (cv->tag()) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1168 case JVM_CONSTANT_Long: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1169 case JVM_CONSTANT_Double: |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1170 i++; // Skip empty entry. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1171 assert(_constants.at(i) == NULL, "empty entry"); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1172 break; |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1173 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1174 } |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1175 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1176 // Set the constant pool holder to the target method's class. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1177 cpool->set_pool_holder(_target_klass()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1178 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1179 return cpool; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1180 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1181 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1182 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1183 methodHandle MethodHandleCompiler::get_method_oop(TRAPS) const { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1184 methodHandle nullHandle; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1185 // Create a method that holds the generated bytecode. invokedynamic |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1186 // has no receiver, normal MH calls do. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1187 int flags_bits; |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1188 if (for_invokedynamic()) |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1152
diff
changeset
|
1189 flags_bits = (/*JVM_MH_INVOKE_BITS |*/ JVM_ACC_PUBLIC | JVM_ACC_FINAL | JVM_ACC_SYNTHETIC | JVM_ACC_STATIC); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1190 else |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1152
diff
changeset
|
1191 flags_bits = (/*JVM_MH_INVOKE_BITS |*/ JVM_ACC_PUBLIC | JVM_ACC_FINAL | JVM_ACC_SYNTHETIC); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1192 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1193 methodOop m_oop = oopFactory::new_method(bytecode_length(), |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1194 accessFlags_from(flags_bits), |
2226
c5a923563727
6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents:
2177
diff
changeset
|
1195 0, 0, 0, oopDesc::IsSafeConc, CHECK_(nullHandle)); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1196 methodHandle m(THREAD, m_oop); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1197 m_oop = NULL; // oop not GC safe |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1198 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1199 constantPoolHandle cpool = get_constant_pool(CHECK_(nullHandle)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1200 m->set_constants(cpool()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1201 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1202 m->set_name_index(_name_index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1203 m->set_signature_index(_signature_index); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1204 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1205 m->set_code((address) bytecode()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1206 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1207 m->set_max_stack(_max_stack); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1208 m->set_max_locals(max_locals()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1209 m->set_size_of_parameters(_num_params); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1210 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1211 typeArrayHandle exception_handlers(THREAD, Universe::the_empty_int_array()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1212 m->set_exception_table(exception_handlers()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1213 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1214 // Set the carry bit of the invocation counter to force inlining of |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1215 // the adapter. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1216 InvocationCounter* ic = m->invocation_counter(); |
1783 | 1217 ic->set_carry_flag(); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1218 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1219 // Rewrite the method and set up the constant pool cache. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1220 objArrayOop m_array = oopFactory::new_system_objArray(1, CHECK_(nullHandle)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1221 objArrayHandle methods(THREAD, m_array); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1222 methods->obj_at_put(0, m()); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1223 Rewriter::rewrite(_target_klass(), cpool, methods, CHECK_(nullHandle)); // Use fake class. |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1224 |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1225 #ifndef PRODUCT |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1226 if (TraceMethodHandles) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1227 m->print(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1228 m->print_codes(); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1229 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1230 #endif //PRODUCT |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1231 |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1152
diff
changeset
|
1232 assert(m->is_method_handle_adapter(), "must be recognized as an adapter"); |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1233 return m; |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1234 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1235 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1236 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1237 #ifndef PRODUCT |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1238 |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1239 #if 0 |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1240 // MH printer for debugging. |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1241 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1242 class MethodHandlePrinter : public MethodHandleWalker { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1243 private: |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1244 outputStream* _out; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1245 bool _verbose; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1246 int _temp_num; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1247 stringStream _strbuf; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1248 const char* strbuf() { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1249 const char* s = _strbuf.as_string(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1250 _strbuf.reset(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1251 return s; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1252 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1253 ArgToken token(const char* str) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1254 return (ArgToken) str; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1255 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1256 void start_params() { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1257 _out->print("("); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1258 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1259 void end_params() { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1260 if (_verbose) _out->print("\n"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1261 _out->print(") => {"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1262 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1263 void put_type_name(BasicType type, klassOop tk, outputStream* s) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1264 const char* kname = NULL; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1265 if (tk != NULL) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1266 kname = Klass::cast(tk)->external_name(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1267 s->print("%s", (kname != NULL) ? kname : type2name(type)); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1268 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1269 ArgToken maybe_make_temp(const char* statement_op, BasicType type, const char* temp_name) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1270 const char* value = strbuf(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1271 if (!_verbose) return token(value); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1272 // make an explicit binding for each separate value |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1273 _strbuf.print("%s%d", temp_name, ++_temp_num); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1274 const char* temp = strbuf(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1275 _out->print("\n %s %s %s = %s;", statement_op, type2name(type), temp, value); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1276 return token(temp); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1277 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1278 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1279 public: |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1280 MethodHandlePrinter(Handle root, bool verbose, outputStream* out, TRAPS) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1281 : MethodHandleWalker(root, THREAD), |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1282 _out(out), |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1283 _verbose(verbose), |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1284 _temp_num(0) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1285 { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1286 start_params(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1287 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1288 virtual ArgToken make_parameter(BasicType type, klassOop tk, int argnum, TRAPS) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1289 if (argnum < 0) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1290 end_params(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1291 return NULL; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1292 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1293 if (argnum == 0) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1294 _out->print(_verbose ? "\n " : ""); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1295 } else { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1296 _out->print(_verbose ? ",\n " : ", "); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1297 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1298 if (argnum >= _temp_num) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1299 _temp_num = argnum; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1300 // generate an argument name |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1301 _strbuf.print("a%d", argnum); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1302 const char* arg = strbuf(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1303 put_type_name(type, tk, _out); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1304 _out->print(" %s", arg); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1305 return token(arg); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1306 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1307 virtual ArgToken make_oop_constant(oop con, TRAPS) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1308 if (con == NULL) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1309 _strbuf.print("null"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1310 else |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1311 con->print_value_on(&_strbuf); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1312 if (_strbuf.size() == 0) { // yuck |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1313 _strbuf.print("(a "); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1314 put_type_name(T_OBJECT, con->klass(), &_strbuf); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1315 _strbuf.print(")"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1316 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1317 return maybe_make_temp("constant", T_OBJECT, "k"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1318 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1319 virtual ArgToken make_prim_constant(BasicType type, jvalue* con, TRAPS) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1320 java_lang_boxing_object::print(type, con, &_strbuf); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1321 return maybe_make_temp("constant", type, "k"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1322 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1323 virtual ArgToken make_conversion(BasicType type, klassOop tk, Bytecodes::Code op, ArgToken src, TRAPS) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1324 _strbuf.print("%s(%s", Bytecodes::name(op), (const char*)src); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1325 if (tk != NULL) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1326 _strbuf.print(", "); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1327 put_type_name(type, tk, &_strbuf); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1328 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1329 _strbuf.print(")"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1330 return maybe_make_temp("convert", type, "v"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1331 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1332 virtual ArgToken make_fetch(BasicType type, klassOop tk, Bytecodes::Code op, ArgToken base, ArgToken offset, TRAPS) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1333 _strbuf.print("%s(%s, %s", Bytecodes::name(op), (const char*)base, (const char*)offset); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1334 if (tk != NULL) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1335 _strbuf.print(", "); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1336 put_type_name(type, tk, &_strbuf); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1337 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1338 _strbuf.print(")"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1339 return maybe_make_temp("fetch", type, "x"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1340 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1341 virtual ArgToken make_invoke(methodOop m, vmIntrinsics::ID iid, |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1342 Bytecodes::Code op, bool tailcall, |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1343 int argc, ArgToken* argv, TRAPS) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2117
diff
changeset
|
1344 Symbol* name, sig; |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1345 if (m != NULL) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1346 name = m->name(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1347 sig = m->signature(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1348 } else { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1349 name = vmSymbols::symbol_at(vmIntrinsics::name_for(iid)); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1350 sig = vmSymbols::symbol_at(vmIntrinsics::signature_for(iid)); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1351 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1352 _strbuf.print("%s %s%s(", Bytecodes::name(op), name->as_C_string(), sig->as_C_string()); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1353 for (int i = 0; i < argc; i++) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1354 _strbuf.print("%s%s", (i > 0 ? ", " : ""), (const char*)argv[i]); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1355 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1356 _strbuf.print(")"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1357 if (!tailcall) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1358 BasicType rt = char2type(sig->byte_at(sig->utf8_length()-1)); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1359 if (rt == T_ILLEGAL) rt = T_OBJECT; // ';' at the end of '(...)L...;' |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1360 return maybe_make_temp("invoke", rt, "x"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1361 } else { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1362 const char* ret = strbuf(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1363 _out->print(_verbose ? "\n return " : " "); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1364 _out->print("%s", ret); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1365 _out->print(_verbose ? "\n}\n" : " }"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1366 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1367 return ArgToken(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1368 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1369 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1370 virtual void set_method_handle(oop mh) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1371 if (WizardMode && Verbose) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1372 tty->print("\n--- next target: "); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1373 mh->print(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1374 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1375 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1376 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1377 static void print(Handle root, bool verbose, outputStream* out, TRAPS) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1378 ResourceMark rm; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1379 MethodHandlePrinter printer(root, verbose, out, CHECK); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1380 printer.walk(CHECK); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1381 out->print("\n"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1382 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1383 static void print(Handle root, bool verbose = Verbose, outputStream* out = tty) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1384 EXCEPTION_MARK; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1385 ResourceMark rm; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1386 MethodHandlePrinter printer(root, verbose, out, THREAD); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1387 if (!HAS_PENDING_EXCEPTION) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1388 printer.walk(THREAD); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1389 if (HAS_PENDING_EXCEPTION) { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1390 oop ex = PENDING_EXCEPTION; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1391 CLEAR_PENDING_EXCEPTION; |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1392 out->print("\n*** "); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1393 if (ex != Universe::virtual_machine_error_instance()) |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1394 ex->print_on(out); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1395 else |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1396 out->print("lose: %s", printer.lose_message()); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1397 out->print("\n}\n"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1398 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1399 out->print("\n"); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1400 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1401 }; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1402 #endif // 0 |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1403 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1404 extern "C" |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1405 void print_method_handle(oop mh) { |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1783
diff
changeset
|
1406 if (!mh->is_oop()) { |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1783
diff
changeset
|
1407 tty->print_cr("*** not a method handle: "INTPTR_FORMAT, (intptr_t)mh); |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2356
diff
changeset
|
1408 } else if (java_lang_invoke_MethodHandle::is_instance(mh)) { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1133
diff
changeset
|
1409 //MethodHandlePrinter::print(mh); |
1133
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1410 } else { |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1411 tty->print("*** not a method handle: "); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1412 mh->print(); |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1413 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1414 } |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1415 |
aa62b9388fce
6894206: JVM needs a way to traverse method handle structures
twisti
parents:
diff
changeset
|
1416 #endif // PRODUCT |