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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1793
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1793
diff changeset
26 #include "interpreter/rewriter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1793
diff changeset
27 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1793
diff changeset
28 #include "prims/methodHandleWalk.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1793
diff changeset
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
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
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
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
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
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
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
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
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
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
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
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1662
diff changeset
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
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1138
diff changeset
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
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1662
diff changeset
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