annotate src/share/vm/prims/jvmtiRedefineClasses.hpp @ 7588:f9eb431c3efe

8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
author coleenp
date Mon, 14 Jan 2013 11:01:39 -0500
parents fb19af007ffc
children 5daaddd917a1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
2 * Copyright (c) 2003, 2012, 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: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
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: 0
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: 1552
diff changeset
25 #ifndef SHARE_VM_PRIMS_JVMTIREDEFINECLASSES_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_PRIMS_JVMTIREDEFINECLASSES_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "jvmtifiles/jvmtiEnv.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "oops/objArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "oops/objArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "prims/jvmtiRedefineClassesTrace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "runtime/vm_operations.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35
0
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // Introduction:
a61af66fc99e Initial load
duke
parents:
diff changeset
37 //
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // The RedefineClasses() API is used to change the definition of one or
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // more classes. While the API supports redefining more than one class
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // in a single call, in general, the API is discussed in the context of
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // changing the definition of a single current class to a single new
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // class. For clarity, the current class is will always be called
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // "the_class" and the new class will always be called "scratch_class".
a61af66fc99e Initial load
duke
parents:
diff changeset
44 //
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // The name "the_class" is used because there is only one structure
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // that represents a specific class; redefinition does not replace the
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // structure, but instead replaces parts of the structure. The name
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // "scratch_class" is used because the structure that represents the
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // new definition of a specific class is simply used to carry around
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // the parts of the new definition until they are used to replace the
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // appropriate parts in the_class. Once redefinition of a class is
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // complete, scratch_class is thrown away.
a61af66fc99e Initial load
duke
parents:
diff changeset
53 //
a61af66fc99e Initial load
duke
parents:
diff changeset
54 //
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // Implementation Overview:
a61af66fc99e Initial load
duke
parents:
diff changeset
56 //
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // The RedefineClasses() API is mostly a wrapper around the VM op that
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // does the real work. The work is split in varying degrees between
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // doit_prologue(), doit() and doit_epilogue().
a61af66fc99e Initial load
duke
parents:
diff changeset
60 //
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // 1) doit_prologue() is called by the JavaThread on the way to a
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // safepoint. It does parameter verification and loads scratch_class
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // which involves:
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // - parsing the incoming class definition using the_class' class
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // loader and security context
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // - linking scratch_class
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // - merging constant pools and rewriting bytecodes as needed
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // for the merged constant pool
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // - verifying the bytecodes in scratch_class
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // - setting up the constant pool cache and rewriting bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // as needed to use the cache
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // - finally, scratch_class is compared to the_class to verify
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // that it is a valid replacement class
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // - if everything is good, then scratch_class is saved in an
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // instance field in the VM operation for the doit() call
a61af66fc99e Initial load
duke
parents:
diff changeset
76 //
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // Note: A JavaThread must do the above work.
a61af66fc99e Initial load
duke
parents:
diff changeset
78 //
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // 2) doit() is called by the VMThread during a safepoint. It installs
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // the new class definition(s) which involves:
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // - retrieving the scratch_class from the instance field in the
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // VM operation
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // - house keeping (flushing breakpoints and caches, deoptimizing
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // dependent compiled code)
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // - replacing parts in the_class with parts from scratch_class
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // - adding weak reference(s) to track the obsolete but interesting
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // parts of the_class
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // - adjusting constant pool caches and vtables in other classes
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // that refer to methods in the_class. These adjustments use the
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // SystemDictionary::classes_do() facility which only allows
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // a helper method to be specified. The interesting parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // that we would like to pass to the helper method are saved in
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // static global fields in the VM operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // - telling the SystemDictionary to notice our changes
a61af66fc99e Initial load
duke
parents:
diff changeset
95 //
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Note: the above work must be done by the VMThread to be safe.
a61af66fc99e Initial load
duke
parents:
diff changeset
97 //
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // 3) doit_epilogue() is called by the JavaThread after the VM op
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // is finished and the safepoint is done. It simply cleans up
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // memory allocated in doit_prologue() and used in doit().
a61af66fc99e Initial load
duke
parents:
diff changeset
101 //
a61af66fc99e Initial load
duke
parents:
diff changeset
102 //
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // Constant Pool Details:
a61af66fc99e Initial load
duke
parents:
diff changeset
104 //
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // When the_class is redefined, we cannot just replace the constant
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // pool in the_class with the constant pool from scratch_class because
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // that could confuse obsolete methods that may still be running.
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // Instead, the constant pool from the_class, old_cp, is merged with
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // the constant pool from scratch_class, scratch_cp. The resulting
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // constant pool, merge_cp, replaces old_cp in the_class.
a61af66fc99e Initial load
duke
parents:
diff changeset
111 //
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // The key part of any merging algorithm is the entry comparison
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // function so we have to know the types of entries in a constant pool
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // in order to merge two of them together. Constant pools can contain
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // up to 12 different kinds of entries; the JVM_CONSTANT_Unicode entry
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // is not presently used so we only have to worry about the other 11
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // entry types. For the purposes of constant pool merging, it is
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // helpful to know that the 11 entry types fall into 3 different
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // subtypes: "direct", "indirect" and "double-indirect".
a61af66fc99e Initial load
duke
parents:
diff changeset
120 //
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // Direct CP entries contain data and do not contain references to
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // other CP entries. The following are direct CP entries:
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // JVM_CONSTANT_{Double,Float,Integer,Long,Utf8}
a61af66fc99e Initial load
duke
parents:
diff changeset
124 //
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Indirect CP entries contain 1 or 2 references to a direct CP entry
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // and no other data. The following are indirect CP entries:
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // JVM_CONSTANT_{Class,NameAndType,String}
a61af66fc99e Initial load
duke
parents:
diff changeset
128 //
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // Double-indirect CP entries contain two references to indirect CP
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // entries and no other data. The following are double-indirect CP
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // entries:
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // JVM_CONSTANT_{Fieldref,InterfaceMethodref,Methodref}
a61af66fc99e Initial load
duke
parents:
diff changeset
133 //
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // When comparing entries between two constant pools, the entry types
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // are compared first and if they match, then further comparisons are
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // made depending on the entry subtype. Comparing direct CP entries is
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // simply a matter of comparing the data associated with each entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // Comparing both indirect and double-indirect CP entries requires
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // recursion.
a61af66fc99e Initial load
duke
parents:
diff changeset
140 //
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // Fortunately, the recursive combinations are limited because indirect
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // CP entries can only refer to direct CP entries and double-indirect
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // CP entries can only refer to indirect CP entries. The following is
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // an example illustration of the deepest set of indirections needed to
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // access the data associated with a JVM_CONSTANT_Fieldref entry:
a61af66fc99e Initial load
duke
parents:
diff changeset
146 //
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // JVM_CONSTANT_Fieldref {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // class_index => JVM_CONSTANT_Class {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // name_index => JVM_CONSTANT_Utf8 {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // <data-1>
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // name_and_type_index => JVM_CONSTANT_NameAndType {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // name_index => JVM_CONSTANT_Utf8 {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // <data-2>
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // descriptor_index => JVM_CONSTANT_Utf8 {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // <data-3>
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
162 //
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // The above illustration is not a data structure definition for any
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // computer language. The curly braces ('{' and '}') are meant to
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // delimit the context of the "fields" in the CP entry types shown.
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // Each indirection from the JVM_CONSTANT_Fieldref entry is shown via
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // "=>", e.g., the class_index is used to indirectly reference a
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // JVM_CONSTANT_Class entry where the name_index is used to indirectly
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // reference a JVM_CONSTANT_Utf8 entry which contains the interesting
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // <data-1>. In order to understand a JVM_CONSTANT_Fieldref entry, we
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // have to do a total of 5 indirections just to get to the CP entries
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // that contain the interesting pieces of data and then we have to
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // fetch the three pieces of data. This means we have to do a total of
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // (5 + 3) * 2 == 16 dereferences to compare two JVM_CONSTANT_Fieldref
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // entries.
a61af66fc99e Initial load
duke
parents:
diff changeset
176 //
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Here is the indirection, data and dereference count for each entry
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // type:
a61af66fc99e Initial load
duke
parents:
diff changeset
179 //
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // JVM_CONSTANT_Class 1 indir, 1 data, 2 derefs
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // JVM_CONSTANT_Double 0 indir, 1 data, 1 deref
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // JVM_CONSTANT_Fieldref 2 indir, 3 data, 8 derefs
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // JVM_CONSTANT_Float 0 indir, 1 data, 1 deref
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // JVM_CONSTANT_Integer 0 indir, 1 data, 1 deref
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // JVM_CONSTANT_InterfaceMethodref 2 indir, 3 data, 8 derefs
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // JVM_CONSTANT_Long 0 indir, 1 data, 1 deref
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // JVM_CONSTANT_Methodref 2 indir, 3 data, 8 derefs
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // JVM_CONSTANT_NameAndType 1 indir, 2 data, 4 derefs
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // JVM_CONSTANT_String 1 indir, 1 data, 2 derefs
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // JVM_CONSTANT_Utf8 0 indir, 1 data, 1 deref
a61af66fc99e Initial load
duke
parents:
diff changeset
191 //
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // So different subtypes of CP entries require different amounts of
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // work for a proper comparison.
a61af66fc99e Initial load
duke
parents:
diff changeset
194 //
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Now that we've talked about the different entry types and how to
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // compare them we need to get back to merging. This is not a merge in
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // the "sort -u" sense or even in the "sort" sense. When we merge two
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // constant pools, we copy all the entries from old_cp to merge_cp,
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // preserving entry order. Next we append all the unique entries from
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // scratch_cp to merge_cp and we track the index changes from the
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // location in scratch_cp to the possibly new location in merge_cp.
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // When we are done, any obsolete code that is still running that
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // uses old_cp should not be able to observe any difference if it
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // were to use merge_cp. As for the new code in scratch_class, it is
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // modified to use the appropriate index values in merge_cp before it
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // is used to replace the code in the_class.
a61af66fc99e Initial load
duke
parents:
diff changeset
207 //
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // There is one small complication in copying the entries from old_cp
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // to merge_cp. Two of the CP entry types are special in that they are
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // lazily resolved. Before explaining the copying complication, we need
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // to digress into CP entry resolution.
a61af66fc99e Initial load
duke
parents:
diff changeset
212 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
213 // JVM_CONSTANT_Class entries are present in the class file, but are not
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
214 // stored in memory as such until they are resolved. The entries are not
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
215 // resolved unless they are used because resolution is expensive. During class
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
216 // file parsing the entries are initially stored in memory as
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
217 // JVM_CONSTANT_ClassIndex and JVM_CONSTANT_StringIndex entries. These special
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
218 // CP entry types indicate that the JVM_CONSTANT_Class and JVM_CONSTANT_String
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
219 // entries have been parsed, but the index values in the entries have not been
0
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // validated. After the entire constant pool has been parsed, the index
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // values can be validated and then the entries are converted into
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
222 // JVM_CONSTANT_UnresolvedClass and JVM_CONSTANT_String
0
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // entries. During this conversion process, the UTF8 values that are
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // indirectly referenced by the JVM_CONSTANT_ClassIndex and
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
225 // JVM_CONSTANT_StringIndex entries are changed into Symbol*s and the
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
226 // entries are modified to refer to the Symbol*s. This optimization
0
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // eliminates one level of indirection for those two CP entry types and
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
228 // gets the entries ready for verification. Verification expects to
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
229 // find JVM_CONSTANT_UnresolvedClass but not JVM_CONSTANT_Class entries.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
230 //
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // Now we can get back to the copying complication. When we copy
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // entries from old_cp to merge_cp, we have to revert any
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // JVM_CONSTANT_Class entries to JVM_CONSTANT_UnresolvedClass entries
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // or verification will fail.
a61af66fc99e Initial load
duke
parents:
diff changeset
235 //
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // It is important to explicitly state that the merging algorithm
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // effectively unresolves JVM_CONSTANT_Class entries that were in the
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // old_cp when they are changed into JVM_CONSTANT_UnresolvedClass
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // entries in the merge_cp. This is done both to make verification
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // happy and to avoid adding more brittleness between RedefineClasses
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // and the constant pool cache. By allowing the constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // implementation to (re)resolve JVM_CONSTANT_UnresolvedClass entries
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // into JVM_CONSTANT_Class entries, we avoid having to embed knowledge
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // about those algorithms in RedefineClasses.
a61af66fc99e Initial load
duke
parents:
diff changeset
245 //
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // Appending unique entries from scratch_cp to merge_cp is straight
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // forward for direct CP entries and most indirect CP entries. For the
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // indirect CP entry type JVM_CONSTANT_NameAndType and for the double-
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // indirect CP entry types, the presence of more than one piece of
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // interesting data makes appending the entries more complicated.
a61af66fc99e Initial load
duke
parents:
diff changeset
251 //
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // For the JVM_CONSTANT_{Double,Float,Integer,Long,Utf8} entry types,
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // the entry is simply copied from scratch_cp to the end of merge_cp.
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // If the index in scratch_cp is different than the destination index
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // in merge_cp, then the change in index value is tracked.
a61af66fc99e Initial load
duke
parents:
diff changeset
256 //
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // Note: the above discussion for the direct CP entries also applies
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
258 // to the JVM_CONSTANT_UnresolvedClass entry types.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
260 // For the JVM_CONSTANT_Class entry types, since there is only
0
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // one data element at the end of the recursion, we know that we have
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // either one or two unique entries. If the JVM_CONSTANT_Utf8 entry is
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // unique then it is appended to merge_cp before the current entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // If the JVM_CONSTANT_Utf8 entry is not unique, then the current entry
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // is updated to refer to the duplicate entry in merge_cp before it is
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // appended to merge_cp. Again, any changes in index values are tracked
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // as needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
268 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
269 // Note: the above discussion for JVM_CONSTANT_Class entry
0
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // types is theoretical. Since those entry types have already been
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
271 // optimized into JVM_CONSTANT_UnresolvedClass entry types,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // they are handled as direct CP entries.
a61af66fc99e Initial load
duke
parents:
diff changeset
273 //
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // For the JVM_CONSTANT_NameAndType entry type, since there are two
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // data elements at the end of the recursions, we know that we have
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // between one and three unique entries. Any unique JVM_CONSTANT_Utf8
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // entries are appended to merge_cp before the current entry. For any
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // JVM_CONSTANT_Utf8 entries that are not unique, the current entry is
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // updated to refer to the duplicate entry in merge_cp before it is
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // appended to merge_cp. Again, any changes in index values are tracked
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // as needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
282 //
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // For the JVM_CONSTANT_{Fieldref,InterfaceMethodref,Methodref} entry
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // types, since there are two indirect CP entries and three data
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // elements at the end of the recursions, we know that we have between
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // one and six unique entries. See the JVM_CONSTANT_Fieldref diagram
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // above for an example of all six entries. The uniqueness algorithm
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // for the JVM_CONSTANT_Class and JVM_CONSTANT_NameAndType entries is
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // covered above. Any unique entries are appended to merge_cp before
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // the current entry. For any entries that are not unique, the current
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // entry is updated to refer to the duplicate entry in merge_cp before
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // it is appended to merge_cp. Again, any changes in index values are
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // tracked as needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
294 //
a61af66fc99e Initial load
duke
parents:
diff changeset
295 //
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Other Details:
a61af66fc99e Initial load
duke
parents:
diff changeset
297 //
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // Details for other parts of RedefineClasses need to be written.
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // This is a placeholder section.
a61af66fc99e Initial load
duke
parents:
diff changeset
300 //
a61af66fc99e Initial load
duke
parents:
diff changeset
301 //
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // Open Issues (in no particular order):
a61af66fc99e Initial load
duke
parents:
diff changeset
303 //
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // - How do we serialize the RedefineClasses() API without deadlocking?
a61af66fc99e Initial load
duke
parents:
diff changeset
305 //
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // - SystemDictionary::parse_stream() was called with a NULL protection
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // domain since the initial version. This has been changed to pass
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // the_class->protection_domain(). This change has been tested with
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // all NSK tests and nothing broke, but what will adding it now break
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // in ways that we don't test?
a61af66fc99e Initial load
duke
parents:
diff changeset
311 //
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // - GenerateOopMap::rewrite_load_or_store() has a comment in its
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // (indirect) use of the Relocator class that the max instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // size is 4 bytes. goto_w and jsr_w are 5 bytes and wide/iinc is
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // 6 bytes. Perhaps Relocator only needs a 4 byte buffer to do
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // what it does to the bytecodes. More investigation is needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
317 //
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // - How do we know if redefine_single_class() and the guts of
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
319 // InstanceKlass are out of sync? I don't think this can be
0
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // automated, but we should probably order the work in
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // redefine_single_class() to match the order of field
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
322 // definitions in InstanceKlass. We also need to add some
0
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // comments about keeping things in sync.
a61af66fc99e Initial load
duke
parents:
diff changeset
324 //
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // - set_new_constant_pool() is huge and we should consider refactoring
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // it into smaller chunks of work.
a61af66fc99e Initial load
duke
parents:
diff changeset
327 //
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // - The exception table update code in set_new_constant_pool() defines
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // const values that are also defined in a local context elsewhere.
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // The same literal values are also used in elsewhere. We need to
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // coordinate a cleanup of these constants with Runtime.
a61af66fc99e Initial load
duke
parents:
diff changeset
332 //
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 class VM_RedefineClasses: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
335 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // These static fields are needed by SystemDictionary::classes_do()
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // facility and the adjust_cpool_cache_and_vtable() helper:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
338 static Array<Method*>* _old_methods;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
339 static Array<Method*>* _new_methods;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
340 static Method** _matching_old_methods;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
341 static Method** _matching_new_methods;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
342 static Method** _deleted_methods;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
343 static Method** _added_methods;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
344 static int _matching_methods_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
345 static int _deleted_methods_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
346 static int _added_methods_length;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
347 static Klass* _the_class_oop;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // The instance fields are used to pass information from
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // doit_prologue() to doit() and doit_epilogue().
a61af66fc99e Initial load
duke
parents:
diff changeset
351 jint _class_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 const jvmtiClassDefinition *_class_defs; // ptr to _class_count defs
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // This operation is used by both RedefineClasses and
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // RetransformClasses. Indicate which.
a61af66fc99e Initial load
duke
parents:
diff changeset
356 JvmtiClassLoadKind _class_load_kind;
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // _index_map_count is just an optimization for knowing if
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // _index_map_p contains any entries.
a61af66fc99e Initial load
duke
parents:
diff changeset
360 int _index_map_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
361 intArray * _index_map_p;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // ptr to _class_count scratch_classes
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
363 Klass** _scratch_classes;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
364 jvmtiError _res;
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // Performance measurement support. These timers do not cover all
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // the work done for JVM/TI RedefineClasses() but they do cover
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // the heavy lifting.
a61af66fc99e Initial load
duke
parents:
diff changeset
369 elapsedTimer _timer_rsc_phase1;
a61af66fc99e Initial load
duke
parents:
diff changeset
370 elapsedTimer _timer_rsc_phase2;
a61af66fc99e Initial load
duke
parents:
diff changeset
371 elapsedTimer _timer_vm_op_prologue;
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // These routines are roughly in call order unless otherwise noted.
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // Load the caller's new class definition(s) into _scratch_classes.
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // Constant pool merging work is done here as needed. Also calls
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // compare_and_normalize_class_versions() to verify the class
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // definition(s).
a61af66fc99e Initial load
duke
parents:
diff changeset
379 jvmtiError load_new_class_versions(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // Verify that the caller provided class definition(s) that meet
a61af66fc99e Initial load
duke
parents:
diff changeset
382 // the restrictions of RedefineClasses. Normalize the order of
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // overloaded methods as needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
384 jvmtiError compare_and_normalize_class_versions(
a61af66fc99e Initial load
duke
parents:
diff changeset
385 instanceKlassHandle the_class, instanceKlassHandle scratch_class);
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // Swap annotations[i] with annotations[j]
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // Used by compare_and_normalize_class_versions() when normalizing
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // overloaded methods or changing idnum as when adding or deleting methods.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
390 void swap_all_method_annotations(int i, int j, instanceKlassHandle scratch_class, TRAPS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // Figure out which new methods match old methods in name and signature,
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // which methods have been added, and which are no longer present
a61af66fc99e Initial load
duke
parents:
diff changeset
394 void compute_added_deleted_matching_methods();
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // Change jmethodIDs to point to the new methods
a61af66fc99e Initial load
duke
parents:
diff changeset
397 void update_jmethod_ids();
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // In addition to marking methods as obsolete, this routine
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // records which methods are EMCP (Equivalent Module Constant
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // Pool) in the emcp_methods BitMap and returns the number of
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // EMCP methods via emcp_method_count_p. This information is
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // used when information about the previous version of the_class
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // is squirreled away.
a61af66fc99e Initial load
duke
parents:
diff changeset
405 void check_methods_and_mark_as_obsolete(BitMap *emcp_methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
406 int * emcp_method_count_p);
a61af66fc99e Initial load
duke
parents:
diff changeset
407 void transfer_old_native_function_registrations(instanceKlassHandle the_class);
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // Unevolving classes may point to methods of the_class directly
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // from their constant pool caches, itables, and/or vtables. We
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // use the SystemDictionary::classes_do() facility and this helper
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // to fix up these pointers.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
413 static void adjust_cpool_cache_and_vtable(Klass* k_oop, ClassLoaderData* initiating_loader, TRAPS);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
414 static void adjust_array_vtable(Klass* k_oop);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Install the redefinition of a class
a61af66fc99e Initial load
duke
parents:
diff changeset
417 void redefine_single_class(jclass the_jclass,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
418 Klass* scratch_class_oop, TRAPS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
419
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
420 // Increment the classRedefinedCount field in the specific InstanceKlass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // and in all direct and indirect subclasses.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
422 void increment_class_counter(InstanceKlass *ik, TRAPS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // Support for constant pool merging (these routines are in alpha
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // order):
a61af66fc99e Initial load
duke
parents:
diff changeset
426 void append_entry(constantPoolHandle scratch_cp, int scratch_i,
a61af66fc99e Initial load
duke
parents:
diff changeset
427 constantPoolHandle *merge_cp_p, int *merge_cp_length_p, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
428 int find_new_index(int old_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
429 bool is_unresolved_class_mismatch(constantPoolHandle cp1, int index1,
a61af66fc99e Initial load
duke
parents:
diff changeset
430 constantPoolHandle cp2, int index2);
a61af66fc99e Initial load
duke
parents:
diff changeset
431 void map_index(constantPoolHandle scratch_cp, int old_index, int new_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
432 bool merge_constant_pools(constantPoolHandle old_cp,
a61af66fc99e Initial load
duke
parents:
diff changeset
433 constantPoolHandle scratch_cp, constantPoolHandle *merge_cp_p,
a61af66fc99e Initial load
duke
parents:
diff changeset
434 int *merge_cp_length_p, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
435 jvmtiError merge_cp_and_rewrite(instanceKlassHandle the_class,
a61af66fc99e Initial load
duke
parents:
diff changeset
436 instanceKlassHandle scratch_class, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
437 u2 rewrite_cp_ref_in_annotation_data(
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
438 AnnotationArray* annotations_typeArray, int &byte_i_ref,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
439 const char * trace_mesg, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
440 bool rewrite_cp_refs(instanceKlassHandle scratch_class, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
441 bool rewrite_cp_refs_in_annotation_struct(
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
442 AnnotationArray* class_annotations, int &byte_i_ref, TRAPS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
443 bool rewrite_cp_refs_in_annotations_typeArray(
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
444 AnnotationArray* annotations_typeArray, int &byte_i_ref, TRAPS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
445 bool rewrite_cp_refs_in_class_annotations(
a61af66fc99e Initial load
duke
parents:
diff changeset
446 instanceKlassHandle scratch_class, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
447 bool rewrite_cp_refs_in_element_value(
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
448 AnnotationArray* class_annotations, int &byte_i_ref, TRAPS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
449 bool rewrite_cp_refs_in_fields_annotations(
a61af66fc99e Initial load
duke
parents:
diff changeset
450 instanceKlassHandle scratch_class, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
451 void rewrite_cp_refs_in_method(methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
452 methodHandle * new_method_p, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 bool rewrite_cp_refs_in_methods(instanceKlassHandle scratch_class, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
454 bool rewrite_cp_refs_in_methods_annotations(
a61af66fc99e Initial load
duke
parents:
diff changeset
455 instanceKlassHandle scratch_class, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
456 bool rewrite_cp_refs_in_methods_default_annotations(
a61af66fc99e Initial load
duke
parents:
diff changeset
457 instanceKlassHandle scratch_class, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
458 bool rewrite_cp_refs_in_methods_parameter_annotations(
a61af66fc99e Initial load
duke
parents:
diff changeset
459 instanceKlassHandle scratch_class, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 void rewrite_cp_refs_in_stack_map_table(methodHandle method, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
461 void rewrite_cp_refs_in_verification_type_info(
a61af66fc99e Initial load
duke
parents:
diff changeset
462 address& stackmap_addr_ref, address stackmap_end, u2 frame_i,
a61af66fc99e Initial load
duke
parents:
diff changeset
463 u1 frame_size, TRAPS);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
464 void set_new_constant_pool(ClassLoaderData* loader_data,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
465 instanceKlassHandle scratch_class,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
466 constantPoolHandle scratch_cp, int scratch_cp_length, TRAPS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 void flush_dependent_code(instanceKlassHandle k_h, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
469
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
470 static void check_class(Klass* k_oop, ClassLoaderData* initiating_loader, TRAPS) PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 static void dump_methods() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
475 VM_RedefineClasses(jint class_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
476 const jvmtiClassDefinition *class_defs,
a61af66fc99e Initial load
duke
parents:
diff changeset
477 JvmtiClassLoadKind class_load_kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
478 VMOp_Type type() const { return VMOp_RedefineClasses; }
a61af66fc99e Initial load
duke
parents:
diff changeset
479 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
480 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
481 void doit_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
484 jvmtiError check_error() { return _res; }
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // Modifiable test must be shared between IsModifiableClass query
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // and redefine implementation
a61af66fc99e Initial load
duke
parents:
diff changeset
488 static bool is_modifiable_class(oop klass_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
490
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
491
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
492 // Helper class to mark and unmark metadata used on the stack as either handles
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
493 // or executing methods, so that it can't be deleted during class redefinition
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
494 // and class unloading.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
495 class MetadataOnStackMark : public StackObj {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
496 NOT_PRODUCT(static bool _is_active;)
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
497 public:
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6725
diff changeset
498 MetadataOnStackMark() NOT_JVMTI_RETURN;
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6725
diff changeset
499 ~MetadataOnStackMark() NOT_JVMTI_RETURN;
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6725
diff changeset
500 static void record(Metadata* m) NOT_JVMTI_RETURN;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
501 };
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2426
diff changeset
502
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
503 #endif // SHARE_VM_PRIMS_JVMTIREDEFINECLASSES_HPP