Mercurial > hg > truffle
annotate src/share/vm/runtime/fieldDescriptor.cpp @ 8804:91bf0bdae37b
8008217: CDS: Class data sharing limits the malloc heap on Solaris
Summary: In 64bit VM move CDS archive address to 32G on all platforms using new flag SharedBaseAddress. In 32bit VM set CDS archive address to 3Gb on Linux and let other OSs pick the address.
Reviewed-by: kvn, dcubed, zgu, hseigel
author | coleenp |
---|---|
date | Wed, 20 Mar 2013 08:04:54 -0400 |
parents | 927a311d00f9 |
children | 0f7ca53be929 b2e698d2276c |
rev | line source |
---|---|
0 | 1 /* |
8031 | 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
665
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
665
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:
665
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/systemDictionary.hpp" | |
27 #include "classfile/vmSymbols.hpp" | |
28 #include "memory/resourceArea.hpp" | |
29 #include "memory/universe.inline.hpp" | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6176
diff
changeset
|
30 #include "oops/annotations.hpp" |
1972 | 31 #include "oops/instanceKlass.hpp" |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
32 #include "oops/fieldStreams.hpp" |
1972 | 33 #include "runtime/fieldDescriptor.hpp" |
34 #include "runtime/handles.inline.hpp" | |
35 #include "runtime/signature.hpp" | |
0 | 36 |
37 | |
38 oop fieldDescriptor::loader() const { | |
6940
18fb7da42534
8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents:
6725
diff
changeset
|
39 return _cp->pool_holder()->class_loader(); |
0 | 40 } |
41 | |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
42 Symbol* fieldDescriptor::generic_signature() const { |
6176
634b8615a6ba
7177409: Perf regression in JVM_GetClassDeclaredFields after generic signature changes.
jiangli
parents:
6100
diff
changeset
|
43 if (!has_generic_signature()) { |
634b8615a6ba
7177409: Perf regression in JVM_GetClassDeclaredFields after generic signature changes.
jiangli
parents:
6100
diff
changeset
|
44 return NULL; |
634b8615a6ba
7177409: Perf regression in JVM_GetClassDeclaredFields after generic signature changes.
jiangli
parents:
6100
diff
changeset
|
45 } |
634b8615a6ba
7177409: Perf regression in JVM_GetClassDeclaredFields after generic signature changes.
jiangli
parents:
6100
diff
changeset
|
46 |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
47 int idx = 0; |
6940
18fb7da42534
8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents:
6725
diff
changeset
|
48 InstanceKlass* ik = field_holder(); |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
49 for (AllFieldStream fs(ik); !fs.done(); fs.next()) { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
50 if (idx == _index) { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
51 return fs.generic_signature(); |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
52 } else { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
53 idx ++; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
54 } |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
55 } |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
56 assert(false, "should never happen"); |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
57 return NULL; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
58 } |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
59 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6176
diff
changeset
|
60 AnnotationArray* fieldDescriptor::annotations() const { |
6940
18fb7da42534
8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents:
6725
diff
changeset
|
61 InstanceKlass* ik = field_holder(); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6176
diff
changeset
|
62 Array<AnnotationArray*>* md = ik->fields_annotations(); |
0 | 63 if (md == NULL) |
64 return NULL; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6176
diff
changeset
|
65 return md->at(index()); |
0 | 66 } |
67 | |
7457
35431a769282
8004823: Add VM support for type annotation reflection
stefank
parents:
6940
diff
changeset
|
68 AnnotationArray* fieldDescriptor::type_annotations() const { |
35431a769282
8004823: Add VM support for type annotation reflection
stefank
parents:
6940
diff
changeset
|
69 InstanceKlass* ik = field_holder(); |
8031 | 70 Array<AnnotationArray*>* type_annos = ik->fields_type_annotations(); |
7457
35431a769282
8004823: Add VM support for type annotation reflection
stefank
parents:
6940
diff
changeset
|
71 if (type_annos == NULL) |
35431a769282
8004823: Add VM support for type annotation reflection
stefank
parents:
6940
diff
changeset
|
72 return NULL; |
8031 | 73 return type_annos->at(index()); |
7457
35431a769282
8004823: Add VM support for type annotation reflection
stefank
parents:
6940
diff
changeset
|
74 } |
35431a769282
8004823: Add VM support for type annotation reflection
stefank
parents:
6940
diff
changeset
|
75 |
0 | 76 constantTag fieldDescriptor::initial_value_tag() const { |
3938 | 77 return constants()->tag_at(initial_value_index()); |
0 | 78 } |
79 | |
80 jint fieldDescriptor::int_initial_value() const { | |
3938 | 81 return constants()->int_at(initial_value_index()); |
0 | 82 } |
83 | |
84 jlong fieldDescriptor::long_initial_value() const { | |
3938 | 85 return constants()->long_at(initial_value_index()); |
0 | 86 } |
87 | |
88 jfloat fieldDescriptor::float_initial_value() const { | |
3938 | 89 return constants()->float_at(initial_value_index()); |
0 | 90 } |
91 | |
92 jdouble fieldDescriptor::double_initial_value() const { | |
3938 | 93 return constants()->double_at(initial_value_index()); |
0 | 94 } |
95 | |
96 oop fieldDescriptor::string_initial_value(TRAPS) const { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6176
diff
changeset
|
97 return constants()->uncached_string_at(initial_value_index(), CHECK_0); |
0 | 98 } |
99 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6176
diff
changeset
|
100 void fieldDescriptor::initialize(InstanceKlass* ik, int index) { |
0 | 101 _cp = ik->constants(); |
3938 | 102 FieldInfo* f = ik->field(index); |
103 assert(!f->is_internal(), "regular Java fields only"); | |
0 | 104 |
3938 | 105 _access_flags = accessFlags_from(f->access_flags()); |
106 guarantee(f->name_index() != 0 && f->signature_index() != 0, "bad constant pool index for fieldDescriptor"); | |
0 | 107 _index = index; |
108 } | |
109 | |
110 #ifndef PRODUCT | |
111 | |
112 void fieldDescriptor::print_on(outputStream* st) const { | |
3938 | 113 access_flags().print_on(st); |
114 name()->print_value_on(st); | |
0 | 115 st->print(" "); |
3938 | 116 signature()->print_value_on(st); |
0 | 117 st->print(" @%d ", offset()); |
118 if (WizardMode && has_initial_value()) { | |
119 st->print("(initval "); | |
120 constantTag t = initial_value_tag(); | |
121 if (t.is_int()) { | |
122 st->print("int %d)", int_initial_value()); | |
123 } else if (t.is_long()){ | |
124 st->print_jlong(long_initial_value()); | |
125 } else if (t.is_float()){ | |
126 st->print("float %f)", float_initial_value()); | |
127 } else if (t.is_double()){ | |
128 st->print("double %lf)", double_initial_value()); | |
129 } | |
130 } | |
131 } | |
132 | |
133 void fieldDescriptor::print_on_for(outputStream* st, oop obj) { | |
134 print_on(st); | |
135 BasicType ft = field_type(); | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
136 jint as_int = 0; |
0 | 137 switch (ft) { |
138 case T_BYTE: | |
139 as_int = (jint)obj->byte_field(offset()); | |
140 st->print(" %d", obj->byte_field(offset())); | |
141 break; | |
142 case T_CHAR: | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
143 as_int = (jint)obj->char_field(offset()); |
0 | 144 { |
145 jchar c = obj->char_field(offset()); | |
146 as_int = c; | |
147 st->print(" %c %d", isprint(c) ? c : ' ', c); | |
148 } | |
149 break; | |
150 case T_DOUBLE: | |
151 st->print(" %lf", obj->double_field(offset())); | |
152 break; | |
153 case T_FLOAT: | |
154 as_int = obj->int_field(offset()); | |
155 st->print(" %f", obj->float_field(offset())); | |
156 break; | |
157 case T_INT: | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
158 as_int = obj->int_field(offset()); |
0 | 159 st->print(" %d", obj->int_field(offset())); |
160 break; | |
161 case T_LONG: | |
162 st->print(" "); | |
163 st->print_jlong(obj->long_field(offset())); | |
164 break; | |
165 case T_SHORT: | |
166 as_int = obj->short_field(offset()); | |
167 st->print(" %d", obj->short_field(offset())); | |
168 break; | |
169 case T_BOOLEAN: | |
170 as_int = obj->bool_field(offset()); | |
171 st->print(" %s", obj->bool_field(offset()) ? "true" : "false"); | |
172 break; | |
173 case T_ARRAY: | |
174 st->print(" "); | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
175 NOT_LP64(as_int = obj->int_field(offset())); |
0 | 176 obj->obj_field(offset())->print_value_on(st); |
177 break; | |
178 case T_OBJECT: | |
179 st->print(" "); | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
180 NOT_LP64(as_int = obj->int_field(offset())); |
0 | 181 obj->obj_field(offset())->print_value_on(st); |
182 break; | |
183 default: | |
184 ShouldNotReachHere(); | |
185 break; | |
186 } | |
187 // Print a hint as to the underlying integer representation. This can be wrong for | |
188 // pointers on an LP64 machine | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
189 if (ft == T_LONG || ft == T_DOUBLE LP64_ONLY(|| !is_java_primitive(ft)) ) { |
0 | 190 st->print(" (%x %x)", obj->int_field(offset()), obj->int_field(offset()+sizeof(jint))); |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
191 } else if (as_int < 0 || as_int > 9) { |
0 | 192 st->print(" (%x)", as_int); |
193 } | |
194 } | |
195 | |
196 #endif /* PRODUCT */ |