annotate src/share/vm/oops/constantPoolOop.hpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents be93aad57795
children 389049f3f393
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
579
0fbdb4381b99 6814575: Update copyright year
xdono
parents: 518
diff changeset
2 * Copyright 1997-2009 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // A constantPool is an array containing class constants as described in the
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // class file.
a61af66fc99e Initial load
duke
parents:
diff changeset
27 //
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // Most of the constant pool entries are written during class parsing, which
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // is safe. For klass and string types, the constant pool entry is
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // modified when the entry is resolved. If a klass or string constant pool
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // entry is read without a lock, only the resolved state guarantees that
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // the entry in the constant pool is a klass or String object and
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // not a symbolOop.
a61af66fc99e Initial load
duke
parents:
diff changeset
34
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class SymbolHashMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
36
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
37 class constantPoolOopDesc : public oopDesc {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
38 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 friend class BytecodeInterpreter; // Directly extracts an oop in the pool for fast instanceof/checkcast
a61af66fc99e Initial load
duke
parents:
diff changeset
40 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
41 typeArrayOop _tags; // the tag array describing the constant pool's contents
a61af66fc99e Initial load
duke
parents:
diff changeset
42 constantPoolCacheOop _cache; // the cache holding interpreter runtime information
a61af66fc99e Initial load
duke
parents:
diff changeset
43 klassOop _pool_holder; // the corresponding class
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
44 int _flags; // a few header bits to describe contents for GC
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
45 int _length; // number of elements in the array
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 431
diff changeset
46 volatile bool _is_conc_safe; // if true, safe for concurrent
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 431
diff changeset
47 // GC processing
0
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // only set to non-zero if constant pool is merged by RedefineClasses
a61af66fc99e Initial load
duke
parents:
diff changeset
49 int _orig_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 void set_tags(typeArrayOop tags) { oop_store_without_check((oop*)&_tags, tags); }
a61af66fc99e Initial load
duke
parents:
diff changeset
52 void tag_at_put(int which, jbyte t) { tags()->byte_at_put(which, t); }
a61af66fc99e Initial load
duke
parents:
diff changeset
53 void release_tag_at_put(int which, jbyte t) { tags()->release_byte_at_put(which, t); }
a61af66fc99e Initial load
duke
parents:
diff changeset
54
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
55 enum FlagBit {
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
56 FB_has_invokedynamic = 1,
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
57 FB_has_pseudo_string = 2
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
58 };
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
59
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
60 int flags() const { return _flags; }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
61 void set_flags(int f) { _flags = f; }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
62 bool flag_at(FlagBit fb) const { return (_flags & (1 << (int)fb)) != 0; }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
63 void set_flag_at(FlagBit fb);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
64 // no clear_flag_at function; they only increase
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
65
0
a61af66fc99e Initial load
duke
parents:
diff changeset
66 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
67 intptr_t* base() const { return (intptr_t*) (((char*) this) + sizeof(constantPoolOopDesc)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
68 oop* tags_addr() { return (oop*)&_tags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
69 oop* cache_addr() { return (oop*)&_cache; }
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 oop* obj_at_addr(int which) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
72 assert(is_within_bounds(which), "index out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
73 return (oop*) &base()[which];
a61af66fc99e Initial load
duke
parents:
diff changeset
74 }
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 jint* int_at_addr(int which) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
77 assert(is_within_bounds(which), "index out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
78 return (jint*) &base()[which];
a61af66fc99e Initial load
duke
parents:
diff changeset
79 }
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 jlong* long_at_addr(int which) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
82 assert(is_within_bounds(which), "index out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
83 return (jlong*) &base()[which];
a61af66fc99e Initial load
duke
parents:
diff changeset
84 }
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 jfloat* float_at_addr(int which) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 assert(is_within_bounds(which), "index out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
88 return (jfloat*) &base()[which];
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 jdouble* double_at_addr(int which) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 assert(is_within_bounds(which), "index out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
93 return (jdouble*) &base()[which];
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
97 typeArrayOop tags() const { return _tags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
98
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
99 bool has_pseudo_string() const { return flag_at(FB_has_pseudo_string); }
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
100 bool has_invokedynamic() const { return flag_at(FB_has_invokedynamic); }
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
101 void set_pseudo_string() { set_flag_at(FB_has_pseudo_string); }
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
102 void set_invokedynamic() { set_flag_at(FB_has_invokedynamic); }
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
103
0
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // Klass holding pool
a61af66fc99e Initial load
duke
parents:
diff changeset
105 klassOop pool_holder() const { return _pool_holder; }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void set_pool_holder(klassOop k) { oop_store_without_check((oop*)&_pool_holder, (oop) k); }
a61af66fc99e Initial load
duke
parents:
diff changeset
107 oop* pool_holder_addr() { return (oop*)&_pool_holder; }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Interpreter runtime support
a61af66fc99e Initial load
duke
parents:
diff changeset
110 constantPoolCacheOop cache() const { return _cache; }
a61af66fc99e Initial load
duke
parents:
diff changeset
111 void set_cache(constantPoolCacheOop cache){ oop_store((oop*)&_cache, cache); }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // Assembly code support
a61af66fc99e Initial load
duke
parents:
diff changeset
114 static int tags_offset_in_bytes() { return offset_of(constantPoolOopDesc, _tags); }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 static int cache_offset_in_bytes() { return offset_of(constantPoolOopDesc, _cache); }
a61af66fc99e Initial load
duke
parents:
diff changeset
116 static int pool_holder_offset_in_bytes() { return offset_of(constantPoolOopDesc, _pool_holder); }
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Storing constants
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 void klass_at_put(int which, klassOop k) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 oop_store_without_check((volatile oop *)obj_at_addr(which), oop(k));
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // The interpreter assumes when the tag is stored, the klass is resolved
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // and the klassOop is a klass rather than a symbolOop, so we need
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // hardware store ordering here.
a61af66fc99e Initial load
duke
parents:
diff changeset
125 release_tag_at_put(which, JVM_CONSTANT_Class);
a61af66fc99e Initial load
duke
parents:
diff changeset
126 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // In case the earlier card-mark was consumed by a concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // marking thread before the tag was updated, redirty the card.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 oop_store_without_check((volatile oop *)obj_at_addr(which), oop(k));
a61af66fc99e Initial load
duke
parents:
diff changeset
130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // For temporary use while constructing constant pool
a61af66fc99e Initial load
duke
parents:
diff changeset
134 void klass_index_at_put(int which, int name_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 tag_at_put(which, JVM_CONSTANT_ClassIndex);
a61af66fc99e Initial load
duke
parents:
diff changeset
136 *int_at_addr(which) = name_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Temporary until actual use
a61af66fc99e Initial load
duke
parents:
diff changeset
140 void unresolved_klass_at_put(int which, symbolOop s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // Overwrite the old index with a GC friendly value so
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // that if GC looks during the transition it won't try
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // to treat a small integer as oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 *obj_at_addr(which) = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
145 release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 oop_store_without_check(obj_at_addr(which), oop(s));
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Temporary until actual use
a61af66fc99e Initial load
duke
parents:
diff changeset
150 void unresolved_string_at_put(int which, symbolOop s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
151 *obj_at_addr(which) = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 release_tag_at_put(which, JVM_CONSTANT_UnresolvedString);
a61af66fc99e Initial load
duke
parents:
diff changeset
153 oop_store_without_check(obj_at_addr(which), oop(s));
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 void int_at_put(int which, jint i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 tag_at_put(which, JVM_CONSTANT_Integer);
a61af66fc99e Initial load
duke
parents:
diff changeset
158 *int_at_addr(which) = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 void long_at_put(int which, jlong l) {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 tag_at_put(which, JVM_CONSTANT_Long);
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // *long_at_addr(which) = l;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 Bytes::put_native_u8((address)long_at_addr(which), *((u8*) &l));
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 void float_at_put(int which, jfloat f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 tag_at_put(which, JVM_CONSTANT_Float);
a61af66fc99e Initial load
duke
parents:
diff changeset
169 *float_at_addr(which) = f;
a61af66fc99e Initial load
duke
parents:
diff changeset
170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 void double_at_put(int which, jdouble d) {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 tag_at_put(which, JVM_CONSTANT_Double);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // *double_at_addr(which) = d;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // u8 temp = *(u8*) &d;
a61af66fc99e Initial load
duke
parents:
diff changeset
176 Bytes::put_native_u8((address) double_at_addr(which), *((u8*) &d));
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 void symbol_at_put(int which, symbolOop s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
180 tag_at_put(which, JVM_CONSTANT_Utf8);
a61af66fc99e Initial load
duke
parents:
diff changeset
181 oop_store_without_check(obj_at_addr(which), oop(s));
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 void string_at_put(int which, oop str) {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 oop_store((volatile oop*)obj_at_addr(which), str);
a61af66fc99e Initial load
duke
parents:
diff changeset
186 release_tag_at_put(which, JVM_CONSTANT_String);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // In case the earlier card-mark was consumed by a concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // marking thread before the tag was updated, redirty the card.
a61af66fc99e Initial load
duke
parents:
diff changeset
190 oop_store_without_check((volatile oop *)obj_at_addr(which), str);
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // For temporary use while constructing constant pool
a61af66fc99e Initial load
duke
parents:
diff changeset
195 void string_index_at_put(int which, int string_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
196 tag_at_put(which, JVM_CONSTANT_StringIndex);
a61af66fc99e Initial load
duke
parents:
diff changeset
197 *int_at_addr(which) = string_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 void field_at_put(int which, int class_index, int name_and_type_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 tag_at_put(which, JVM_CONSTANT_Fieldref);
a61af66fc99e Initial load
duke
parents:
diff changeset
202 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 void method_at_put(int which, int class_index, int name_and_type_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 tag_at_put(which, JVM_CONSTANT_Methodref);
a61af66fc99e Initial load
duke
parents:
diff changeset
207 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 void interface_method_at_put(int which, int class_index, int name_and_type_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 tag_at_put(which, JVM_CONSTANT_InterfaceMethodref);
a61af66fc99e Initial load
duke
parents:
diff changeset
212 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index; // Not so nice
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 void name_and_type_at_put(int which, int name_index, int signature_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 tag_at_put(which, JVM_CONSTANT_NameAndType);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 *int_at_addr(which) = ((jint) signature_index<<16) | name_index; // Not so nice
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // Tag query
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 constantTag tag_at(int which) const { return (constantTag)tags()->byte_at_acquire(which); }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Whether the entry is a pointer that must be GC'd.
a61af66fc99e Initial load
duke
parents:
diff changeset
225 bool is_pointer_entry(int which) {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 constantTag tag = tag_at(which);
a61af66fc99e Initial load
duke
parents:
diff changeset
227 return tag.is_klass() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
228 tag.is_unresolved_klass() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
229 tag.is_symbol() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
230 tag.is_unresolved_string() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
231 tag.is_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // Fetching constants
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 klassOop klass_at(int which, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 constantPoolHandle h_this(THREAD, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 return klass_at_impl(h_this, which, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 symbolOop klass_name_at(int which); // Returns the name, w/o resolving.
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 klassOop resolved_klass_at(int which) { // Used by Compiler
a61af66fc99e Initial load
duke
parents:
diff changeset
244 guarantee(tag_at(which).is_klass(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // Must do an acquire here in case another thread resolved the klass
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // behind our back, lest we later load stale values thru the oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
247 return klassOop((oop)OrderAccess::load_ptr_acquire(obj_at_addr(which)));
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // This method should only be used with a cpool lock or during parsing or gc
a61af66fc99e Initial load
duke
parents:
diff changeset
251 symbolOop unresolved_klass_at(int which) { // Temporary until actual use
a61af66fc99e Initial load
duke
parents:
diff changeset
252 symbolOop s = symbolOop((oop)OrderAccess::load_ptr_acquire(obj_at_addr(which)));
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // check that the klass is still unresolved.
a61af66fc99e Initial load
duke
parents:
diff changeset
254 assert(tag_at(which).is_unresolved_klass(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
255 return s;
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // RedefineClasses() API support:
a61af66fc99e Initial load
duke
parents:
diff changeset
259 symbolOop klass_at_noresolve(int which) { return klass_name_at(which); }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 jint int_at(int which) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 assert(tag_at(which).is_int(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
263 return *int_at_addr(which);
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 jlong long_at(int which) {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 assert(tag_at(which).is_long(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // return *long_at_addr(which);
a61af66fc99e Initial load
duke
parents:
diff changeset
269 u8 tmp = Bytes::get_native_u8((address)&base()[which]);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 return *((jlong*)&tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 jfloat float_at(int which) {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 assert(tag_at(which).is_float(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
275 return *float_at_addr(which);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 jdouble double_at(int which) {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 assert(tag_at(which).is_double(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
280 u8 tmp = Bytes::get_native_u8((address)&base()[which]);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 return *((jdouble*)&tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 symbolOop symbol_at(int which) {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 assert(tag_at(which).is_utf8(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
286 return symbolOop(*obj_at_addr(which));
a61af66fc99e Initial load
duke
parents:
diff changeset
287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 oop string_at(int which, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 constantPoolHandle h_this(THREAD, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 return string_at_impl(h_this, which, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
294 // A "pseudo-string" is an non-string oop that has found is way into
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
295 // a String entry.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
296 // Under AnonymousClasses this can happen if the user patches a live
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
297 // object into a CONSTANT_String entry of an anonymous class.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
298 // Method oops internally created for method handles may also
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
299 // use pseudo-strings to link themselves to related metaobjects.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
300
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
301 bool is_pseudo_string_at(int which);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
302
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
303 oop pseudo_string_at(int which) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
304 assert(tag_at(which).is_string(), "Corrupted constant pool");
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
305 return *obj_at_addr(which);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
306 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
307
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
308 void pseudo_string_at_put(int which, oop x) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
309 assert(AnonymousClasses, "");
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
310 set_pseudo_string(); // mark header
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
311 assert(tag_at(which).is_string() || tag_at(which).is_unresolved_string(), "Corrupted constant pool");
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
312 string_at_put(which, x); // this works just fine
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
313 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
314
0
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // only called when we are sure a string entry is already resolved (via an
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // earlier string_at call.
a61af66fc99e Initial load
duke
parents:
diff changeset
317 oop resolved_string_at(int which) {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 assert(tag_at(which).is_string(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Must do an acquire here in case another thread resolved the klass
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // behind our back, lest we later load stale values thru the oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
321 return (oop)OrderAccess::load_ptr_acquire(obj_at_addr(which));
a61af66fc99e Initial load
duke
parents:
diff changeset
322 }
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // This method should only be used with a cpool lock or during parsing or gc
a61af66fc99e Initial load
duke
parents:
diff changeset
325 symbolOop unresolved_string_at(int which) { // Temporary until actual use
a61af66fc99e Initial load
duke
parents:
diff changeset
326 symbolOop s = symbolOop((oop)OrderAccess::load_ptr_acquire(obj_at_addr(which)));
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // check that the string is still unresolved.
a61af66fc99e Initial load
duke
parents:
diff changeset
328 assert(tag_at(which).is_unresolved_string(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
329 return s;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // Returns an UTF8 for a CONSTANT_String entry at a given index.
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // UTF8 char* representation was chosen to avoid conversion of
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // java_lang_Strings at resolved entries into symbolOops
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // or vice versa.
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
336 // Caller is responsible for checking for pseudo-strings.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
337 char* string_at_noresolve(int which);
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 jint name_and_type_at(int which) {
a61af66fc99e Initial load
duke
parents:
diff changeset
340 assert(tag_at(which).is_name_and_type(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
341 return *int_at_addr(which);
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
344 // The following methods (name/signature/klass_ref_at, klass_ref_at_noresolve,
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
345 // name_and_type_ref_index_at) all expect constant pool indices
0
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // from the bytecodes to be passed in, which are actually potentially byte-swapped
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
347 // or rewritten constant pool cache indices. They all call map_instruction_operand_to_index.
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
348 int map_instruction_operand_to_index(int operand);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
349
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
350 // There are also "uncached" versions which do not map the operand index; see below.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // Lookup for entries consisting of (klass_index, name_and_type index)
a61af66fc99e Initial load
duke
parents:
diff changeset
353 klassOop klass_ref_at(int which, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 symbolOop klass_ref_at_noresolve(int which);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
355 symbolOop name_ref_at(int which) { return impl_name_ref_at(which, false); }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
356 symbolOop signature_ref_at(int which) { return impl_signature_ref_at(which, false); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
357
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
358 int klass_ref_index_at(int which) { return impl_klass_ref_index_at(which, false); }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
359 int name_and_type_ref_index_at(int which) { return impl_name_and_type_ref_index_at(which, false); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // Lookup for entries consisting of (name_index, signature_index)
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
362 int name_ref_index_at(int which_nt); // == low-order jshort of name_and_type_at(which_nt)
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
363 int signature_ref_index_at(int which_nt); // == high-order jshort of name_and_type_at(which_nt)
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
364 symbolOop nt_name_ref_at(int which_nt) { return symbol_at(name_ref_index_at(which_nt)); }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
365 symbolOop nt_signature_ref_at(int which_nt) { return symbol_at(signature_ref_index_at(which_nt)); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367 BasicType basic_type_for_signature_at(int which);
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // Resolve string constants (to prevent allocation during compilation)
a61af66fc99e Initial load
duke
parents:
diff changeset
370 void resolve_string_constants(TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 constantPoolHandle h_this(THREAD, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
372 resolve_string_constants_impl(h_this, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // Klass name matches name at offset
a61af66fc99e Initial load
duke
parents:
diff changeset
376 bool klass_name_at_matches(instanceKlassHandle k, int which);
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // Sizing
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
379 int length() const { return _length; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
380 void set_length(int length) { _length = length; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
381
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
382 // Tells whether index is within bounds.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
383 bool is_within_bounds(int index) const {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
384 return 0 <= index && index < length();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
385 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
386
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387 static int header_size() { return sizeof(constantPoolOopDesc)/HeapWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
388 static int object_size(int length) { return align_object_size(header_size() + length); }
a61af66fc99e Initial load
duke
parents:
diff changeset
389 int object_size() { return object_size(length()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
390
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 431
diff changeset
391 bool is_conc_safe() { return _is_conc_safe; }
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 431
diff changeset
392 void set_is_conc_safe(bool v) { _is_conc_safe = v; }
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 431
diff changeset
393
0
a61af66fc99e Initial load
duke
parents:
diff changeset
394 friend class constantPoolKlass;
a61af66fc99e Initial load
duke
parents:
diff changeset
395 friend class ClassFileParser;
a61af66fc99e Initial load
duke
parents:
diff changeset
396 friend class SystemDictionary;
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // Used by compiler to prevent classloading.
a61af66fc99e Initial load
duke
parents:
diff changeset
399 static klassOop klass_at_if_loaded (constantPoolHandle this_oop, int which);
a61af66fc99e Initial load
duke
parents:
diff changeset
400 static klassOop klass_ref_at_if_loaded (constantPoolHandle this_oop, int which);
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // Same as above - but does LinkResolving.
a61af66fc99e Initial load
duke
parents:
diff changeset
402 static klassOop klass_ref_at_if_loaded_check(constantPoolHandle this_oop, int which, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // Routines currently used for annotations (only called by jvm.cpp) but which might be used in the
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // future by other Java code. These take constant pool indices rather than possibly-byte-swapped
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // constant pool cache indices as do the peer methods above.
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
407 symbolOop uncached_name_ref_at(int which) { return impl_name_ref_at(which, true); }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
408 symbolOop uncached_signature_ref_at(int which) { return impl_signature_ref_at(which, true); }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
409 int uncached_klass_ref_index_at(int which) { return impl_klass_ref_index_at(which, true); }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
410 int uncached_name_and_type_ref_index_at(int which) { return impl_name_and_type_ref_index_at(which, true); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // Sharing
a61af66fc99e Initial load
duke
parents:
diff changeset
413 int pre_resolve_shared_klasses(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
414 void shared_symbols_iterate(OopClosure* closure0);
a61af66fc99e Initial load
duke
parents:
diff changeset
415 void shared_tags_iterate(OopClosure* closure0);
a61af66fc99e Initial load
duke
parents:
diff changeset
416 void shared_strings_iterate(OopClosure* closure0);
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
419 const char* printable_name_at(int which) PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
422
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
423 symbolOop impl_name_ref_at(int which, bool uncached);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
424 symbolOop impl_signature_ref_at(int which, bool uncached);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
425 int impl_klass_ref_index_at(int which, bool uncached);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
426 int impl_name_and_type_ref_index_at(int which, bool uncached);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
427
0
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // Takes either a constant pool cache index in possibly byte-swapped
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // byte order (which comes from the bytecodes after rewriting) or,
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // if "uncached" is true, a vanilla constant pool index
a61af66fc99e Initial load
duke
parents:
diff changeset
431 jint field_or_method_at(int which, bool uncached) {
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
432 int i = which;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
433 if (!uncached && cache() != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // change byte-ordering and go via cache
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
435 i = map_instruction_operand_to_index(which);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437 assert(tag_at(i).is_field_or_method(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
438 return *int_at_addr(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // Used while constructing constant pool (only by ClassFileParser)
a61af66fc99e Initial load
duke
parents:
diff changeset
442 jint klass_index_at(int which) {
a61af66fc99e Initial load
duke
parents:
diff changeset
443 assert(tag_at(which).is_klass_index(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
444 return *int_at_addr(which);
a61af66fc99e Initial load
duke
parents:
diff changeset
445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 jint string_index_at(int which) {
a61af66fc99e Initial load
duke
parents:
diff changeset
448 assert(tag_at(which).is_string_index(), "Corrupted constant pool");
a61af66fc99e Initial load
duke
parents:
diff changeset
449 return *int_at_addr(which);
a61af66fc99e Initial load
duke
parents:
diff changeset
450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
451
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // Performs the LinkResolver checks
a61af66fc99e Initial load
duke
parents:
diff changeset
453 static void verify_constant_pool_resolve(constantPoolHandle this_oop, KlassHandle klass, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Implementation of methods that needs an exposed 'this' pointer, in order to
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // handle GC while executing the method
a61af66fc99e Initial load
duke
parents:
diff changeset
457 static klassOop klass_at_impl(constantPoolHandle this_oop, int which, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
458 static oop string_at_impl(constantPoolHandle this_oop, int which, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
459
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // Resolve string constants (to prevent allocation during compilation)
a61af66fc99e Initial load
duke
parents:
diff changeset
461 static void resolve_string_constants_impl(constantPoolHandle this_oop, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // Merging constantPoolOop support:
a61af66fc99e Initial load
duke
parents:
diff changeset
465 bool compare_entry_to(int index1, constantPoolHandle cp2, int index2, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
466 void copy_cp_to(int start_i, int end_i, constantPoolHandle to_cp, int to_i,
a61af66fc99e Initial load
duke
parents:
diff changeset
467 TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
468 void copy_entry_to(int from_i, constantPoolHandle to_cp, int to_i, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
469 int find_matching_entry(int pattern_i, constantPoolHandle search_cp, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
470 int orig_length() const { return _orig_length; }
a61af66fc99e Initial load
duke
parents:
diff changeset
471 void set_orig_length(int orig_length) { _orig_length = orig_length; }
a61af66fc99e Initial load
duke
parents:
diff changeset
472
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // JVMTI accesss - GetConstantPool, RetransformClasses, ...
a61af66fc99e Initial load
duke
parents:
diff changeset
475 friend class JvmtiConstantPoolReconstituter;
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
478 jint cpool_entry_size(jint idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
479 jint hash_entries_to(SymbolHashMap *symmap, SymbolHashMap *classmap);
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // Copy cpool bytes into byte array.
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // Returns:
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // int > 0, count of the raw cpool bytes that have been copied
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // 0, OutOfMemory error
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // -1, Internal error
a61af66fc99e Initial load
duke
parents:
diff changeset
486 int copy_cpool_bytes(int cpool_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
487 SymbolHashMap* tbl,
a61af66fc99e Initial load
duke
parents:
diff changeset
488 unsigned char *bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 };
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 class SymbolHashMapEntry : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
492 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
493 unsigned int _hash; // 32-bit hash for item
a61af66fc99e Initial load
duke
parents:
diff changeset
494 SymbolHashMapEntry* _next; // Next element in the linked list for this bucket
a61af66fc99e Initial load
duke
parents:
diff changeset
495 symbolOop _symbol; // 1-st part of the mapping: symbol => value
a61af66fc99e Initial load
duke
parents:
diff changeset
496 u2 _value; // 2-nd part of the mapping: symbol => value
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
499 unsigned int hash() const { return _hash; }
a61af66fc99e Initial load
duke
parents:
diff changeset
500 void set_hash(unsigned int hash) { _hash = hash; }
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 SymbolHashMapEntry* next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
503 void set_next(SymbolHashMapEntry* next) { _next = next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 symbolOop symbol() const { return _symbol; }
a61af66fc99e Initial load
duke
parents:
diff changeset
506 void set_symbol(symbolOop sym) { _symbol = sym; }
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 u2 value() const { return _value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
509 void set_value(u2 value) { _value = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 SymbolHashMapEntry(unsigned int hash, symbolOop symbol, u2 value)
a61af66fc99e Initial load
duke
parents:
diff changeset
512 : _hash(hash), _symbol(symbol), _value(value), _next(NULL) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }; // End SymbolHashMapEntry class
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 class SymbolHashMapBucket : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
520 SymbolHashMapEntry* _entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
523 SymbolHashMapEntry* entry() const { return _entry; }
a61af66fc99e Initial load
duke
parents:
diff changeset
524 void set_entry(SymbolHashMapEntry* entry) { _entry = entry; }
a61af66fc99e Initial load
duke
parents:
diff changeset
525 void clear() { _entry = NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 }; // End SymbolHashMapBucket class
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 class SymbolHashMap: public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // Default number of entries in the table
a61af66fc99e Initial load
duke
parents:
diff changeset
534 enum SymbolHashMap_Constants {
a61af66fc99e Initial load
duke
parents:
diff changeset
535 _Def_HashMap_Size = 256
a61af66fc99e Initial load
duke
parents:
diff changeset
536 };
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 int _table_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
539 SymbolHashMapBucket* _buckets;
a61af66fc99e Initial load
duke
parents:
diff changeset
540
a61af66fc99e Initial load
duke
parents:
diff changeset
541 void initialize_table(int table_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
542 _table_size = table_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
543 _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
544 for (int index = 0; index < table_size; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
545 _buckets[index].clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 int table_size() const { return _table_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 SymbolHashMap() { initialize_table(_Def_HashMap_Size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 SymbolHashMap(int table_size) { initialize_table(table_size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
555
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // hash P(31) from Kernighan & Ritchie
a61af66fc99e Initial load
duke
parents:
diff changeset
557 static unsigned int compute_hash(const char* str, int len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
558 unsigned int hash = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
559 while (len-- > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
560 hash = 31*hash + (unsigned) *str;
a61af66fc99e Initial load
duke
parents:
diff changeset
561 str++;
a61af66fc99e Initial load
duke
parents:
diff changeset
562 }
a61af66fc99e Initial load
duke
parents:
diff changeset
563 return hash;
a61af66fc99e Initial load
duke
parents:
diff changeset
564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 SymbolHashMapEntry* bucket(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
567 return _buckets[i].entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570 void add_entry(symbolOop sym, u2 value);
a61af66fc99e Initial load
duke
parents:
diff changeset
571 SymbolHashMapEntry* find_entry(symbolOop sym);
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 u2 symbol_to_value(symbolOop sym) {
a61af66fc99e Initial load
duke
parents:
diff changeset
574 SymbolHashMapEntry *entry = find_entry(sym);
a61af66fc99e Initial load
duke
parents:
diff changeset
575 return (entry == NULL) ? 0 : entry->value();
a61af66fc99e Initial load
duke
parents:
diff changeset
576 }
a61af66fc99e Initial load
duke
parents:
diff changeset
577
a61af66fc99e Initial load
duke
parents:
diff changeset
578 ~SymbolHashMap() {
a61af66fc99e Initial load
duke
parents:
diff changeset
579 SymbolHashMapEntry* next;
a61af66fc99e Initial load
duke
parents:
diff changeset
580 for (int i = 0; i < _table_size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 for (SymbolHashMapEntry* cur = bucket(i); cur != NULL; cur = next) {
a61af66fc99e Initial load
duke
parents:
diff changeset
582 next = cur->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
583 delete(cur);
a61af66fc99e Initial load
duke
parents:
diff changeset
584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
586 delete _buckets;
a61af66fc99e Initial load
duke
parents:
diff changeset
587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
588 }; // End SymbolHashMap class