annotate src/share/vm/prims/jvmtiClassFileReconstituter.cpp @ 3992:d1bdeef3e3e2

7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76 Summary: There is a race between one thread successfully forwarding and copying the klass mirror for the SoftReference class (including the static master clock) and another thread attempting to use the master clock while attempting to discover a soft reference object. Maintain a shadow copy of the soft reference master clock and use the shadow during reference discovery and reference processing. Reviewed-by: tonyp, brutisso, ysr
author johnc
date Wed, 12 Oct 2011 10:25:51 -0700
parents 35c656d0b685
children c01e115b095e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2426
1d1603768966 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 2192
diff changeset
2 * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 844
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 844
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: 844
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
26 #include "classfile/symbolTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
27 #include "interpreter/bytecodeStream.hpp"
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
28 #include "oops/fieldStreams.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
29 #include "prims/jvmtiClassFileReconstituter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
30 #include "runtime/signature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
31 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
32 # include "bytes_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
33 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
34 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
35 # include "bytes_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
36 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
37 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
38 # include "bytes_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
39 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
40 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
41 # include "bytes_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
42 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
43 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
44 # include "bytes_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
45 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // FIXME: add Deprecated, LVT, LVTT attributes
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // FIXME: fix Synthetic attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // FIXME: per Serguei, add error return handling for constantPoolOopDesc::copy_cpool_bytes()
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // Write the field information portion of ClassFile structure
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // JVMSpec| u2 fields_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // JVMSpec| field_info fields[fields_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
54 void JvmtiClassFileReconstituter::write_field_infos() {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 HandleMark hm(thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
56 objArrayHandle fields_anno(thread(), ikh()->fields_annotations());
a61af66fc99e Initial load
duke
parents:
diff changeset
57
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
58 // Compute the real number of Java fields
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
59 int java_fields = ikh()->java_fields_count();
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
60
3944
35c656d0b685 7090654: nightly failures after 7086585
never
parents: 3938
diff changeset
61 write_u2(java_fields);
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
62 for (JavaFieldStream fs(ikh()); !fs.done(); fs.next()) {
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
63 AccessFlags access_flags = fs.access_flags();
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
64 int name_index = fs.name_index();
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
65 int signature_index = fs.signature_index();
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
66 int initial_value_index = fs.initval_index();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
67 guarantee(name_index != 0 && signature_index != 0, "bad constant pool index for field");
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
68 // int offset = ikh()->field_offset( index );
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
69 int generic_signature_index = fs.generic_signature_index();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70 typeArrayHandle anno(thread(), fields_anno.not_null() ?
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
71 (typeArrayOop)(fields_anno->obj_at(fs.index())) :
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 (typeArrayOop)NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // JVMSpec| field_info {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // JVMSpec| u2 access_flags;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // JVMSpec| u2 name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // JVMSpec| u2 descriptor_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // JVMSpec| u2 attributes_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // JVMSpec| attribute_info attributes[attributes_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // JVMSpec| }
a61af66fc99e Initial load
duke
parents:
diff changeset
81
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 2426
diff changeset
82 write_u2(access_flags.as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 write_u2(name_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 write_u2(signature_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 int attr_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 if (initial_value_index != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 ++attr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89 if (access_flags.is_synthetic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // ++attr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
a61af66fc99e Initial load
duke
parents:
diff changeset
92 if (generic_signature_index != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
93 ++attr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95 if (anno.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 ++attr_count; // has RuntimeVisibleAnnotations attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
97 }
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 write_u2(attr_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 if (initial_value_index != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 write_attribute_name_index("ConstantValue");
a61af66fc99e Initial load
duke
parents:
diff changeset
103 write_u4(2); //length always 2
a61af66fc99e Initial load
duke
parents:
diff changeset
104 write_u2(initial_value_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 if (access_flags.is_synthetic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // write_synthetic_attribute();
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109 if (generic_signature_index != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 write_signature_attribute(generic_signature_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112 if (anno.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 write_annotations_attribute("RuntimeVisibleAnnotations", anno);
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Write Code attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // JVMSpec| Code_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // JVMSpec| u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // JVMSpec| u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // JVMSpec| u2 max_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // JVMSpec| u2 max_locals;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // JVMSpec| u4 code_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // JVMSpec| u1 code[code_length];
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // JVMSpec| u2 exception_table_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // JVMSpec| { u2 start_pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // JVMSpec| u2 end_pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // JVMSpec| u2 handler_pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // JVMSpec| u2 catch_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // JVMSpec| } exception_table[exception_table_length];
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // JVMSpec| u2 attributes_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // JVMSpec| attribute_info attributes[attributes_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // JVMSpec| }
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void JvmtiClassFileReconstituter::write_code_attribute(methodHandle method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 constMethodHandle const_method(thread(), method->constMethod());
a61af66fc99e Initial load
duke
parents:
diff changeset
137 u2 line_num_cnt = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 int stackmap_len = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // compute number and length of attributes -- FIXME: for now no LVT
a61af66fc99e Initial load
duke
parents:
diff changeset
141 int attr_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 int attr_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 if (const_method->has_linenumber_table()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
144 line_num_cnt = line_number_table_entries(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 if (line_num_cnt != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 ++attr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Compute the complete size of the line number table attribute:
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // LineNumberTable_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // u2 line_number_table_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // { u2 start_pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // u2 line_number;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // } line_number_table[line_number_table_length];
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
156 attr_size += 2 + 4 + 2 + line_num_cnt * (2 + 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 if (method->has_stackmap_table()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
160 stackmap_len = method->stackmap_data()->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
161 if (stackmap_len != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 ++attr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // Compute the size of the stack map table attribute (VM stores raw):
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // StackMapTable_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // u2 number_of_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // stack_map_frame_entries[number_of_entries];
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
170 attr_size += 2 + 4 + stackmap_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 typeArrayHandle exception_table(thread(), const_method->exception_table());
a61af66fc99e Initial load
duke
parents:
diff changeset
175 int exception_table_length = exception_table->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
176 int exception_table_entries = exception_table_length / 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 int code_size = const_method->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
178 int size =
a61af66fc99e Initial load
duke
parents:
diff changeset
179 2+2+4 + // max_stack, max_locals, code_length
a61af66fc99e Initial load
duke
parents:
diff changeset
180 code_size + // code
a61af66fc99e Initial load
duke
parents:
diff changeset
181 2 + // exception_table_length
a61af66fc99e Initial load
duke
parents:
diff changeset
182 (2+2+2+2) * exception_table_entries + // exception_table
a61af66fc99e Initial load
duke
parents:
diff changeset
183 2 + // attributes_count
a61af66fc99e Initial load
duke
parents:
diff changeset
184 attr_size; // attributes
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 write_attribute_name_index("Code");
a61af66fc99e Initial load
duke
parents:
diff changeset
187 write_u4(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 write_u2(method->max_stack());
a61af66fc99e Initial load
duke
parents:
diff changeset
189 write_u2(method->max_locals());
a61af66fc99e Initial load
duke
parents:
diff changeset
190 write_u4(code_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
191 copy_bytecodes(method, (unsigned char*)writeable_address(code_size));
a61af66fc99e Initial load
duke
parents:
diff changeset
192 write_u2(exception_table_entries);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 for (int index = 0; index < exception_table_length; ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 write_u2(exception_table->int_at(index++));
a61af66fc99e Initial load
duke
parents:
diff changeset
195 write_u2(exception_table->int_at(index++));
a61af66fc99e Initial load
duke
parents:
diff changeset
196 write_u2(exception_table->int_at(index++));
a61af66fc99e Initial load
duke
parents:
diff changeset
197 write_u2(exception_table->int_at(index++));
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199 write_u2(attr_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
200 if (line_num_cnt != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 write_line_number_table_attribute(method, line_num_cnt);
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
203 if (stackmap_len != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
204 write_stackmap_table_attribute(method, stackmap_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // FIXME: write LVT attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // Write Exceptions attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // JVMSpec| Exceptions_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // JVMSpec| u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // JVMSpec| u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // JVMSpec| u2 number_of_exceptions;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // JVMSpec| u2 exception_index_table[number_of_exceptions];
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // JVMSpec| }
a61af66fc99e Initial load
duke
parents:
diff changeset
217 void JvmtiClassFileReconstituter::write_exceptions_attribute(constMethodHandle const_method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 CheckedExceptionElement* checked_exceptions = const_method->checked_exceptions_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
219 int checked_exceptions_length = const_method->checked_exceptions_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
220 int size =
a61af66fc99e Initial load
duke
parents:
diff changeset
221 2 + // number_of_exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
222 2 * checked_exceptions_length; // exception_index_table
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 write_attribute_name_index("Exceptions");
a61af66fc99e Initial load
duke
parents:
diff changeset
225 write_u4(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 write_u2(checked_exceptions_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
227 for (int index = 0; index < checked_exceptions_length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 write_u2(checked_exceptions[index].class_cp_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Write SourceFile attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // JVMSpec| SourceFile_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // JVMSpec| u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // JVMSpec| u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // JVMSpec| u2 sourcefile_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // JVMSpec| }
a61af66fc99e Initial load
duke
parents:
diff changeset
238 void JvmtiClassFileReconstituter::write_source_file_attribute() {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 assert(ikh()->source_file_name() != NULL, "caller must check");
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 write_attribute_name_index("SourceFile");
a61af66fc99e Initial load
duke
parents:
diff changeset
242 write_u4(2); // always length 2
a61af66fc99e Initial load
duke
parents:
diff changeset
243 write_u2(symbol_to_cpool_index(ikh()->source_file_name()));
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // Write SourceDebugExtension attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // JSR45| SourceDebugExtension_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // JSR45| u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // JSR45| u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // JSR45| u2 sourcefile_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // JSR45| }
a61af66fc99e Initial load
duke
parents:
diff changeset
252 void JvmtiClassFileReconstituter::write_source_debug_extension_attribute() {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 assert(ikh()->source_debug_extension() != NULL, "caller must check");
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 write_attribute_name_index("SourceDebugExtension");
a61af66fc99e Initial load
duke
parents:
diff changeset
256 write_u4(2); // always length 2
a61af66fc99e Initial load
duke
parents:
diff changeset
257 write_u2(symbol_to_cpool_index(ikh()->source_debug_extension()));
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // Write (generic) Signature attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // JVMSpec| Signature_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // JVMSpec| u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // JVMSpec| u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // JVMSpec| u2 signature_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // JVMSpec| }
a61af66fc99e Initial load
duke
parents:
diff changeset
266 void JvmtiClassFileReconstituter::write_signature_attribute(u2 generic_signature_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 write_attribute_name_index("Signature");
a61af66fc99e Initial load
duke
parents:
diff changeset
268 write_u4(2); // always length 2
a61af66fc99e Initial load
duke
parents:
diff changeset
269 write_u2(generic_signature_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // Compute the number of entries in the InnerClasses attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
273 u2 JvmtiClassFileReconstituter::inner_classes_attribute_length() {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 typeArrayOop inner_class_list = ikh()->inner_classes();
a61af66fc99e Initial load
duke
parents:
diff changeset
275 return (inner_class_list == NULL) ? 0 : inner_class_list->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // Write an annotation attribute. The VM stores them in raw form, so all we need
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // to do is add the attrubute name and fill in the length.
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // JSR202| *Annotations_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // JSR202| u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // JSR202| u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // JSR202| ...
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // JSR202| }
a61af66fc99e Initial load
duke
parents:
diff changeset
285 void JvmtiClassFileReconstituter::write_annotations_attribute(const char* attr_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
286 typeArrayHandle annos) {
a61af66fc99e Initial load
duke
parents:
diff changeset
287 u4 length = annos->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
288 write_attribute_name_index(attr_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
289 write_u4(length);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 memcpy(writeable_address(length), annos->byte_at_addr(0), length);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // Write InnerClasses attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // JVMSpec| InnerClasses_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // JVMSpec| u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // JVMSpec| u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // JVMSpec| u2 number_of_classes;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // JVMSpec| { u2 inner_class_info_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // JVMSpec| u2 outer_class_info_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // JVMSpec| u2 inner_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // JVMSpec| u2 inner_class_access_flags;
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // JVMSpec| } classes[number_of_classes];
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // JVMSpec| }
a61af66fc99e Initial load
duke
parents:
diff changeset
305 void JvmtiClassFileReconstituter::write_inner_classes_attribute(int length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 typeArrayOop inner_class_list = ikh()->inner_classes();
a61af66fc99e Initial load
duke
parents:
diff changeset
307 guarantee(inner_class_list != NULL && inner_class_list->length() == length,
a61af66fc99e Initial load
duke
parents:
diff changeset
308 "caller must check");
a61af66fc99e Initial load
duke
parents:
diff changeset
309 typeArrayHandle inner_class_list_h(thread(), inner_class_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 assert (length % instanceKlass::inner_class_next_offset == 0, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
311 u2 entry_count = length / instanceKlass::inner_class_next_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 u4 size = 2 + entry_count * (2+2+2+2);
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 write_attribute_name_index("InnerClasses");
a61af66fc99e Initial load
duke
parents:
diff changeset
315 write_u4(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
316 write_u2(entry_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 for (int i = 0; i < length; i += instanceKlass::inner_class_next_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 write_u2(inner_class_list_h->ushort_at(
a61af66fc99e Initial load
duke
parents:
diff changeset
319 i + instanceKlass::inner_class_inner_class_info_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
320 write_u2(inner_class_list_h->ushort_at(
a61af66fc99e Initial load
duke
parents:
diff changeset
321 i + instanceKlass::inner_class_outer_class_info_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
322 write_u2(inner_class_list_h->ushort_at(
a61af66fc99e Initial load
duke
parents:
diff changeset
323 i + instanceKlass::inner_class_inner_name_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
324 write_u2(inner_class_list_h->ushort_at(
a61af66fc99e Initial load
duke
parents:
diff changeset
325 i + instanceKlass::inner_class_access_flags_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // Write Synthetic attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // JVMSpec| Synthetic_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // JVMSpec| u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // JVMSpec| u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // JVMSpec| }
a61af66fc99e Initial load
duke
parents:
diff changeset
334 void JvmtiClassFileReconstituter::write_synthetic_attribute() {
a61af66fc99e Initial load
duke
parents:
diff changeset
335 write_attribute_name_index("Synthetic");
a61af66fc99e Initial load
duke
parents:
diff changeset
336 write_u4(0); //length always zero
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // Compute size of LineNumberTable
a61af66fc99e Initial load
duke
parents:
diff changeset
340 u2 JvmtiClassFileReconstituter::line_number_table_entries(methodHandle method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // The line number table is compressed so we don't know how big it is until decompressed.
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // Decompression is really fast so we just do it twice.
a61af66fc99e Initial load
duke
parents:
diff changeset
343 u2 num_entries = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
344 CompressedLineNumberReadStream stream(method->compressed_linenumber_table());
a61af66fc99e Initial load
duke
parents:
diff changeset
345 while (stream.read_pair()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
346 num_entries++;
a61af66fc99e Initial load
duke
parents:
diff changeset
347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
348 return num_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // Write LineNumberTable attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // JVMSpec| LineNumberTable_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // JVMSpec| u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // JVMSpec| u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // JVMSpec| u2 line_number_table_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // JVMSpec| { u2 start_pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // JVMSpec| u2 line_number;
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // JVMSpec| } line_number_table[line_number_table_length];
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // JVMSpec| }
a61af66fc99e Initial load
duke
parents:
diff changeset
360 void JvmtiClassFileReconstituter::write_line_number_table_attribute(methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
361 u2 num_entries) {
a61af66fc99e Initial load
duke
parents:
diff changeset
362
a61af66fc99e Initial load
duke
parents:
diff changeset
363 write_attribute_name_index("LineNumberTable");
a61af66fc99e Initial load
duke
parents:
diff changeset
364 write_u4(2 + num_entries * (2 + 2));
a61af66fc99e Initial load
duke
parents:
diff changeset
365 write_u2(num_entries);
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367 CompressedLineNumberReadStream stream(method->compressed_linenumber_table());
a61af66fc99e Initial load
duke
parents:
diff changeset
368 while (stream.read_pair()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
369 write_u2(stream.bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
370 write_u2(stream.line());
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // Write stack map table attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // JSR-202| StackMapTable_attribute {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // JSR-202| u2 attribute_name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // JSR-202| u4 attribute_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // JSR-202| u2 number_of_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // JSR-202| stack_map_frame_entries[number_of_entries];
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // JSR-202| }
a61af66fc99e Initial load
duke
parents:
diff changeset
381 void JvmtiClassFileReconstituter::write_stackmap_table_attribute(methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
382 int stackmap_len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 write_attribute_name_index("StackMapTable");
a61af66fc99e Initial load
duke
parents:
diff changeset
385 write_u4(stackmap_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
386 memcpy(
a61af66fc99e Initial load
duke
parents:
diff changeset
387 writeable_address(stackmap_len),
a61af66fc99e Initial load
duke
parents:
diff changeset
388 (void*)(method->stackmap_data()->byte_at_addr(0)),
a61af66fc99e Initial load
duke
parents:
diff changeset
389 stackmap_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // Write one method_info structure
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // JVMSpec| method_info {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // JVMSpec| u2 access_flags;
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // JVMSpec| u2 name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // JVMSpec| u2 descriptor_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // JVMSpec| u2 attributes_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // JVMSpec| attribute_info attributes[attributes_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // JVMSpec| }
a61af66fc99e Initial load
duke
parents:
diff changeset
400 void JvmtiClassFileReconstituter::write_method_info(methodHandle method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 AccessFlags access_flags = method->access_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
402 constMethodHandle const_method(thread(), method->constMethod());
a61af66fc99e Initial load
duke
parents:
diff changeset
403 u2 generic_signature_index = const_method->generic_signature_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
404 typeArrayHandle anno(thread(), method->annotations());
a61af66fc99e Initial load
duke
parents:
diff changeset
405 typeArrayHandle param_anno(thread(), method->parameter_annotations());
a61af66fc99e Initial load
duke
parents:
diff changeset
406 typeArrayHandle default_anno(thread(), method->annotation_default());
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 write_u2(access_flags.get_flags() & JVM_RECOGNIZED_METHOD_MODIFIERS);
a61af66fc99e Initial load
duke
parents:
diff changeset
409 write_u2(const_method->name_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
410 write_u2(const_method->signature_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // write attributes in the same order javac does, so we can test with byte for
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // byte comparison
a61af66fc99e Initial load
duke
parents:
diff changeset
414 int attr_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
415 if (const_method->code_size() != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
416 ++attr_count; // has Code attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
418 if (const_method->has_checked_exceptions()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
419 ++attr_count; // has Exceptions attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421 if (default_anno.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
422 ++attr_count; // has AnnotationDefault attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // Deprecated attribute would go here
a61af66fc99e Initial load
duke
parents:
diff changeset
425 if (access_flags.is_synthetic()) { // FIXME
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // ++attr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
428 if (generic_signature_index != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 ++attr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
431 if (anno.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 ++attr_count; // has RuntimeVisibleAnnotations attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434 if (param_anno.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 ++attr_count; // has RuntimeVisibleParameterAnnotations attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 write_u2(attr_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
439 if (const_method->code_size() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
440 write_code_attribute(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442 if (const_method->has_checked_exceptions()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
443 write_exceptions_attribute(const_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445 if (default_anno.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
446 write_annotations_attribute("AnnotationDefault", default_anno);
a61af66fc99e Initial load
duke
parents:
diff changeset
447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // Deprecated attribute would go here
a61af66fc99e Initial load
duke
parents:
diff changeset
449 if (access_flags.is_synthetic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // write_synthetic_attribute();
a61af66fc99e Initial load
duke
parents:
diff changeset
451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
452 if (generic_signature_index != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
453 write_signature_attribute(generic_signature_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
455 if (anno.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
456 write_annotations_attribute("RuntimeVisibleAnnotations", anno);
a61af66fc99e Initial load
duke
parents:
diff changeset
457 }
a61af66fc99e Initial load
duke
parents:
diff changeset
458 if (param_anno.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 write_annotations_attribute("RuntimeVisibleParameterAnnotations", param_anno);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // Write the class attributes portion of ClassFile structure
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // JVMSpec| u2 attributes_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // JVMSpec| attribute_info attributes[attributes_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
466 void JvmtiClassFileReconstituter::write_class_attributes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
467 u2 inner_classes_length = inner_classes_attribute_length();
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
468 Symbol* generic_signature = ikh()->generic_signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
469 typeArrayHandle anno(thread(), ikh()->class_annotations());
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 int attr_count = 0;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
472 if (generic_signature != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
473 ++attr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
474 }
a61af66fc99e Initial load
duke
parents:
diff changeset
475 if (ikh()->source_file_name() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
476 ++attr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (ikh()->source_debug_extension() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 ++attr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
480 }
a61af66fc99e Initial load
duke
parents:
diff changeset
481 if (inner_classes_length > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
482 ++attr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
484 if (anno.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
485 ++attr_count; // has RuntimeVisibleAnnotations attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 write_u2(attr_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
489
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
490 if (generic_signature != NULL) {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
491 write_signature_attribute(symbol_to_cpool_index(generic_signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493 if (ikh()->source_file_name() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 write_source_file_attribute();
a61af66fc99e Initial load
duke
parents:
diff changeset
495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
496 if (ikh()->source_debug_extension() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 write_source_debug_extension_attribute();
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499 if (inner_classes_length > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
500 write_inner_classes_attribute(inner_classes_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
501 }
a61af66fc99e Initial load
duke
parents:
diff changeset
502 if (anno.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 write_annotations_attribute("RuntimeVisibleAnnotations", anno);
a61af66fc99e Initial load
duke
parents:
diff changeset
504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
505 }
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // Write the method information portion of ClassFile structure
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // JVMSpec| u2 methods_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // JVMSpec| method_info methods[methods_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
510 void JvmtiClassFileReconstituter::write_method_infos() {
a61af66fc99e Initial load
duke
parents:
diff changeset
511 HandleMark hm(thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
512 objArrayHandle methods(thread(), ikh()->methods());
a61af66fc99e Initial load
duke
parents:
diff changeset
513 int num_methods = methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 write_u2(num_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
516 if (JvmtiExport::can_maintain_original_method_order()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 int index;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 int original_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
519 int* method_order = NEW_RESOURCE_ARRAY(int, num_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // invert the method order mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
522 for (index = 0; index < num_methods; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
523 original_index = ikh()->method_ordering()->int_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
524 assert(original_index >= 0 && original_index < num_methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
525 "invalid original method index");
a61af66fc99e Initial load
duke
parents:
diff changeset
526 method_order[original_index] = index;
a61af66fc99e Initial load
duke
parents:
diff changeset
527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // write in original order
a61af66fc99e Initial load
duke
parents:
diff changeset
530 for (original_index = 0; original_index < num_methods; original_index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
531 index = method_order[original_index];
a61af66fc99e Initial load
duke
parents:
diff changeset
532 methodHandle method(thread(), (methodOop)(ikh()->methods()->obj_at(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
533 write_method_info(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
535 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 // method order not preserved just dump the method infos
a61af66fc99e Initial load
duke
parents:
diff changeset
537 for (int index = 0; index < num_methods; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
538 methodHandle method(thread(), (methodOop)(ikh()->methods()->obj_at(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
539 write_method_info(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
540 }
a61af66fc99e Initial load
duke
parents:
diff changeset
541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
542 }
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544 void JvmtiClassFileReconstituter::write_class_file_format() {
a61af66fc99e Initial load
duke
parents:
diff changeset
545 ReallocMark();
a61af66fc99e Initial load
duke
parents:
diff changeset
546
a61af66fc99e Initial load
duke
parents:
diff changeset
547 // JVMSpec| ClassFile {
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // JVMSpec| u4 magic;
a61af66fc99e Initial load
duke
parents:
diff changeset
549 write_u4(0xCAFEBABE);
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // JVMSpec| u2 minor_version;
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // JVMSpec| u2 major_version;
a61af66fc99e Initial load
duke
parents:
diff changeset
553 write_u2(ikh()->minor_version());
a61af66fc99e Initial load
duke
parents:
diff changeset
554 u2 major = ikh()->major_version();
a61af66fc99e Initial load
duke
parents:
diff changeset
555 write_u2(major);
a61af66fc99e Initial load
duke
parents:
diff changeset
556
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // JVMSpec| u2 constant_pool_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // JVMSpec| cp_info constant_pool[constant_pool_count-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
559 write_u2(cpool()->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
560 copy_cpool_bytes(writeable_address(cpool_size()));
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // JVMSpec| u2 access_flags;
a61af66fc99e Initial load
duke
parents:
diff changeset
563 write_u2(ikh()->access_flags().get_flags() & JVM_RECOGNIZED_CLASS_MODIFIERS);
a61af66fc99e Initial load
duke
parents:
diff changeset
564
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // JVMSpec| u2 this_class;
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // JVMSpec| u2 super_class;
a61af66fc99e Initial load
duke
parents:
diff changeset
567 write_u2(class_symbol_to_cpool_index(ikh()->name()));
a61af66fc99e Initial load
duke
parents:
diff changeset
568 klassOop super_class = ikh()->super();
a61af66fc99e Initial load
duke
parents:
diff changeset
569 write_u2(super_class == NULL? 0 : // zero for java.lang.Object
a61af66fc99e Initial load
duke
parents:
diff changeset
570 class_symbol_to_cpool_index(super_class->klass_part()->name()));
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // JVMSpec| u2 interfaces_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // JVMSpec| u2 interfaces[interfaces_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
574 objArrayHandle interfaces(thread(), ikh()->local_interfaces());
a61af66fc99e Initial load
duke
parents:
diff changeset
575 int num_interfaces = interfaces->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
576 write_u2(num_interfaces);
a61af66fc99e Initial load
duke
parents:
diff changeset
577 for (int index = 0; index < num_interfaces; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
578 HandleMark hm(thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
579 instanceKlassHandle iikh(thread(), klassOop(interfaces->obj_at(index)));
a61af66fc99e Initial load
duke
parents:
diff changeset
580 write_u2(class_symbol_to_cpool_index(iikh->name()));
a61af66fc99e Initial load
duke
parents:
diff changeset
581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // JVMSpec| u2 fields_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // JVMSpec| field_info fields[fields_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
585 write_field_infos();
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // JVMSpec| u2 methods_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // JVMSpec| method_info methods[methods_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
589 write_method_infos();
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // JVMSpec| u2 attributes_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // JVMSpec| attribute_info attributes[attributes_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
593 // JVMSpec| } /* end ClassFile 8?
a61af66fc99e Initial load
duke
parents:
diff changeset
594 write_class_attributes();
a61af66fc99e Initial load
duke
parents:
diff changeset
595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 address JvmtiClassFileReconstituter::writeable_address(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
598 size_t used_size = _buffer_ptr - _buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
599 if (size + used_size >= _buffer_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
600 // compute the new buffer size: must be at least twice as big as before
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // plus whatever new is being used; then convert to nice clean block boundary
a61af66fc99e Initial load
duke
parents:
diff changeset
602 size_t new_buffer_size = (size + _buffer_size*2 + 1) / initial_buffer_size
a61af66fc99e Initial load
duke
parents:
diff changeset
603 * initial_buffer_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 // VM goes belly-up if the memory isn't available, so cannot do OOM processing
a61af66fc99e Initial load
duke
parents:
diff changeset
606 _buffer = REALLOC_RESOURCE_ARRAY(u1, _buffer, _buffer_size, new_buffer_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
607 _buffer_size = new_buffer_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
608 _buffer_ptr = _buffer + used_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
610 u1* ret_ptr = _buffer_ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
611 _buffer_ptr += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
612 return ret_ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
613 }
a61af66fc99e Initial load
duke
parents:
diff changeset
614
a61af66fc99e Initial load
duke
parents:
diff changeset
615 void JvmtiClassFileReconstituter::write_attribute_name_index(const char* name) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
616 TempNewSymbol sym = SymbolTable::probe(name, (int)strlen(name));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
617 assert(sym != NULL, "attribute name symbol not found");
a61af66fc99e Initial load
duke
parents:
diff changeset
618 u2 attr_name_index = symbol_to_cpool_index(sym);
a61af66fc99e Initial load
duke
parents:
diff changeset
619 assert(attr_name_index != 0, "attribute name symbol not in constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
620 write_u2(attr_name_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623 void JvmtiClassFileReconstituter::write_u1(u1 x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
624 *writeable_address(1) = x;
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 void JvmtiClassFileReconstituter::write_u2(u2 x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
628 Bytes::put_Java_u2(writeable_address(2), x);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 void JvmtiClassFileReconstituter::write_u4(u4 x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
632 Bytes::put_Java_u4(writeable_address(4), x);
a61af66fc99e Initial load
duke
parents:
diff changeset
633 }
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
635 void JvmtiClassFileReconstituter::write_u8(u8 x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
636 Bytes::put_Java_u8(writeable_address(8), x);
a61af66fc99e Initial load
duke
parents:
diff changeset
637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 void JvmtiClassFileReconstituter::copy_bytecodes(methodHandle mh,
a61af66fc99e Initial load
duke
parents:
diff changeset
640 unsigned char* bytecodes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // use a BytecodeStream to iterate over the bytecodes. JVM/fast bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // and the breakpoint bytecode are converted to their original bytecodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 BytecodeStream bs(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 unsigned char* p = bytecodes;
a61af66fc99e Initial load
duke
parents:
diff changeset
647 Bytecodes::Code code;
a61af66fc99e Initial load
duke
parents:
diff changeset
648 bool is_rewritten = instanceKlass::cast(mh->method_holder())->is_rewritten();
a61af66fc99e Initial load
duke
parents:
diff changeset
649
a61af66fc99e Initial load
duke
parents:
diff changeset
650 while ((code = bs.next()) >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
651 assert(Bytecodes::is_java_code(code), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
652 assert(code != Bytecodes::_breakpoint, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
653
a61af66fc99e Initial load
duke
parents:
diff changeset
654 // length of bytecode (mnemonic + operands)
a61af66fc99e Initial load
duke
parents:
diff changeset
655 address bcp = bs.bcp();
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 844
diff changeset
656 int len = bs.instruction_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
657 assert(len > 0, "length must be > 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
658
a61af66fc99e Initial load
duke
parents:
diff changeset
659 // copy the bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
660 *p = (unsigned char) (bs.is_wide()? Bytecodes::_wide : code);
a61af66fc99e Initial load
duke
parents:
diff changeset
661 if (len > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 memcpy(p+1, bcp+1, len-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664
a61af66fc99e Initial load
duke
parents:
diff changeset
665 // During linking the get/put and invoke instructions are rewritten
a61af66fc99e Initial load
duke
parents:
diff changeset
666 // with an index into the constant pool cache. The original constant
a61af66fc99e Initial load
duke
parents:
diff changeset
667 // pool index must be returned to caller. Rewrite the index.
a61af66fc99e Initial load
duke
parents:
diff changeset
668 if (is_rewritten && len >= 3) {
a61af66fc99e Initial load
duke
parents:
diff changeset
669 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
670 case Bytecodes::_getstatic : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
671 case Bytecodes::_putstatic : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
672 case Bytecodes::_getfield : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
673 case Bytecodes::_putfield : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
674 case Bytecodes::_invokevirtual : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
675 case Bytecodes::_invokespecial : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
676 case Bytecodes::_invokestatic : // fall through
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
677 case Bytecodes::_invokedynamic : // fall through
0
a61af66fc99e Initial load
duke
parents:
diff changeset
678 case Bytecodes::_invokeinterface :
a61af66fc99e Initial load
duke
parents:
diff changeset
679 assert(len == 3 || (code == Bytecodes::_invokeinterface && len ==5),
a61af66fc99e Initial load
duke
parents:
diff changeset
680 "sanity check");
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
681 int cpci = Bytes::get_native_u2(bcp+1);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
682 bool is_invokedynamic = (EnableInvokeDynamic && code == Bytecodes::_invokedynamic);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
683 if (is_invokedynamic)
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
684 cpci = Bytes::get_native_u4(bcp+1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // cache cannot be pre-fetched since some classes won't have it yet
a61af66fc99e Initial load
duke
parents:
diff changeset
686 ConstantPoolCacheEntry* entry =
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
687 mh->constants()->cache()->main_entry_at(cpci);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
688 int i = entry->constant_pool_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
689 assert(i < mh->constants()->length(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
690 Bytes::put_Java_u2((address)(p+1), (u2)i); // java byte ordering
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
691 if (is_invokedynamic) *(p+3) = *(p+4) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
692 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
694 }
a61af66fc99e Initial load
duke
parents:
diff changeset
695
a61af66fc99e Initial load
duke
parents:
diff changeset
696 p += len;
a61af66fc99e Initial load
duke
parents:
diff changeset
697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
698 }