Mercurial > hg > truffle
comparison src/share/vm/oops/fieldStreams.hpp @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | 71afdabfd05b |
children | 4a916f2ce331 |
comparison
equal
deleted
inserted
replaced
6724:36d1d483d5d6 | 6725:da91efe96a93 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 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 | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
36 // iterates over fields that have been injected by the JVM. | 36 // iterates over fields that have been injected by the JVM. |
37 // AllFieldStream exposes all fields and should only be used in rare | 37 // AllFieldStream exposes all fields and should only be used in rare |
38 // cases. | 38 // cases. |
39 class FieldStreamBase : public StackObj { | 39 class FieldStreamBase : public StackObj { |
40 protected: | 40 protected: |
41 typeArrayHandle _fields; | 41 Array<u2>* _fields; |
42 constantPoolHandle _constants; | 42 constantPoolHandle _constants; |
43 int _index; | 43 int _index; |
44 int _limit; | 44 int _limit; |
45 int _generic_signature_slot; | 45 int _generic_signature_slot; |
46 | 46 |
47 FieldInfo* field() const { return FieldInfo::from_field_array(_fields(), _index); } | 47 FieldInfo* field() const { return FieldInfo::from_field_array(_fields, _index); } |
48 | 48 |
49 int init_generic_signature_start_slot() { | 49 int init_generic_signature_start_slot() { |
50 int length = _fields->length(); | 50 int length = _fields->length(); |
51 int num_fields = 0; | 51 int num_fields = 0; |
52 int skipped_generic_signature_slots = 0; | 52 int skipped_generic_signature_slots = 0; |
53 FieldInfo* fi; | 53 FieldInfo* fi; |
54 AccessFlags flags; | 54 AccessFlags flags; |
55 /* Scan from 0 to the current _index. Count the number of generic | 55 /* Scan from 0 to the current _index. Count the number of generic |
56 signature slots for field[0] to field[_index - 1]. */ | 56 signature slots for field[0] to field[_index - 1]. */ |
57 for (int i = 0; i < _index; i++) { | 57 for (int i = 0; i < _index; i++) { |
58 fi = FieldInfo::from_field_array(_fields(), i); | 58 fi = FieldInfo::from_field_array(_fields, i); |
59 flags.set_flags(fi->access_flags()); | 59 flags.set_flags(fi->access_flags()); |
60 if (flags.field_has_generic_signature()) { | 60 if (flags.field_has_generic_signature()) { |
61 length --; | 61 length --; |
62 skipped_generic_signature_slots ++; | 62 skipped_generic_signature_slots ++; |
63 } | 63 } |
64 } | 64 } |
65 /* Scan from the current _index. */ | 65 /* Scan from the current _index. */ |
66 for (int i = _index; i*FieldInfo::field_slots < length; i++) { | 66 for (int i = _index; i*FieldInfo::field_slots < length; i++) { |
67 fi = FieldInfo::from_field_array(_fields(), i); | 67 fi = FieldInfo::from_field_array(_fields, i); |
68 flags.set_flags(fi->access_flags()); | 68 flags.set_flags(fi->access_flags()); |
69 if (flags.field_has_generic_signature()) { | 69 if (flags.field_has_generic_signature()) { |
70 length --; | 70 length --; |
71 } | 71 } |
72 num_fields ++; | 72 num_fields ++; |
74 _generic_signature_slot = length + skipped_generic_signature_slots; | 74 _generic_signature_slot = length + skipped_generic_signature_slots; |
75 assert(_generic_signature_slot <= _fields->length(), ""); | 75 assert(_generic_signature_slot <= _fields->length(), ""); |
76 return num_fields; | 76 return num_fields; |
77 } | 77 } |
78 | 78 |
79 FieldStreamBase(typeArrayHandle fields, constantPoolHandle constants, int start, int limit) { | 79 FieldStreamBase(Array<u2>* fields, constantPoolHandle constants, int start, int limit) { |
80 _fields = fields; | 80 _fields = fields; |
81 _constants = constants; | 81 _constants = constants; |
82 _index = start; | 82 _index = start; |
83 int num_fields = init_generic_signature_start_slot(); | 83 int num_fields = init_generic_signature_start_slot(); |
84 if (limit < start) { | 84 if (limit < start) { |
86 } else { | 86 } else { |
87 _limit = limit; | 87 _limit = limit; |
88 } | 88 } |
89 } | 89 } |
90 | 90 |
91 FieldStreamBase(typeArrayHandle fields, constantPoolHandle constants) { | 91 FieldStreamBase(Array<u2>* fields, constantPoolHandle constants) { |
92 _fields = fields; | 92 _fields = fields; |
93 _constants = constants; | 93 _constants = constants; |
94 _index = 0; | 94 _index = 0; |
95 _limit = init_generic_signature_start_slot(); | 95 _limit = init_generic_signature_start_slot(); |
96 } | 96 } |
97 | 97 |
98 public: | 98 public: |
99 FieldStreamBase(instanceKlass* klass) { | 99 FieldStreamBase(InstanceKlass* klass) { |
100 _fields = klass->fields(); | 100 _fields = klass->fields(); |
101 _constants = klass->constants(); | 101 _constants = klass->constants(); |
102 _index = 0; | 102 _index = 0; |
103 _limit = klass->java_fields_count(); | 103 _limit = klass->java_fields_count(); |
104 init_generic_signature_start_slot(); | 104 init_generic_signature_start_slot(); |
147 } | 147 } |
148 | 148 |
149 Symbol* generic_signature() const { | 149 Symbol* generic_signature() const { |
150 if (access_flags().field_has_generic_signature()) { | 150 if (access_flags().field_has_generic_signature()) { |
151 assert(_generic_signature_slot < _fields->length(), "out of bounds"); | 151 assert(_generic_signature_slot < _fields->length(), "out of bounds"); |
152 int index = _fields->short_at(_generic_signature_slot); | 152 int index = _fields->at(_generic_signature_slot); |
153 return _constants->symbol_at(index); | 153 return _constants->symbol_at(index); |
154 } else { | 154 } else { |
155 return NULL; | 155 return NULL; |
156 } | 156 } |
157 } | 157 } |
166 }; | 166 }; |
167 | 167 |
168 // Iterate over only the internal fields | 168 // Iterate over only the internal fields |
169 class JavaFieldStream : public FieldStreamBase { | 169 class JavaFieldStream : public FieldStreamBase { |
170 public: | 170 public: |
171 JavaFieldStream(instanceKlass* k): FieldStreamBase(k->fields(), k->constants(), 0, k->java_fields_count()) {} | |
172 JavaFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), 0, k->java_fields_count()) {} | 171 JavaFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), 0, k->java_fields_count()) {} |
173 | 172 |
174 int name_index() const { | 173 int name_index() const { |
175 assert(!field()->is_internal(), "regular only"); | 174 assert(!field()->is_internal(), "regular only"); |
176 return field()->name_index(); | 175 return field()->name_index(); |
189 } | 188 } |
190 int generic_signature_index() const { | 189 int generic_signature_index() const { |
191 assert(!field()->is_internal(), "regular only"); | 190 assert(!field()->is_internal(), "regular only"); |
192 if (access_flags().field_has_generic_signature()) { | 191 if (access_flags().field_has_generic_signature()) { |
193 assert(_generic_signature_slot < _fields->length(), "out of bounds"); | 192 assert(_generic_signature_slot < _fields->length(), "out of bounds"); |
194 return _fields->short_at(_generic_signature_slot); | 193 return _fields->at(_generic_signature_slot); |
195 } else { | 194 } else { |
196 return 0; | 195 return 0; |
197 } | 196 } |
198 } | 197 } |
199 void set_generic_signature_index(int index) { | 198 void set_generic_signature_index(int index) { |
200 assert(!field()->is_internal(), "regular only"); | 199 assert(!field()->is_internal(), "regular only"); |
201 if (access_flags().field_has_generic_signature()) { | 200 if (access_flags().field_has_generic_signature()) { |
202 assert(_generic_signature_slot < _fields->length(), "out of bounds"); | 201 assert(_generic_signature_slot < _fields->length(), "out of bounds"); |
203 _fields->short_at_put(_generic_signature_slot, index); | 202 _fields->at_put(_generic_signature_slot, index); |
204 } | 203 } |
205 } | 204 } |
206 int initval_index() const { | 205 int initval_index() const { |
207 assert(!field()->is_internal(), "regular only"); | 206 assert(!field()->is_internal(), "regular only"); |
208 return field()->initval_index(); | 207 return field()->initval_index(); |
215 | 214 |
216 | 215 |
217 // Iterate over only the internal fields | 216 // Iterate over only the internal fields |
218 class InternalFieldStream : public FieldStreamBase { | 217 class InternalFieldStream : public FieldStreamBase { |
219 public: | 218 public: |
220 InternalFieldStream(instanceKlass* k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {} | 219 InternalFieldStream(InstanceKlass* k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {} |
221 InternalFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {} | 220 InternalFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {} |
222 }; | 221 }; |
223 | 222 |
224 | 223 |
225 class AllFieldStream : public FieldStreamBase { | 224 class AllFieldStream : public FieldStreamBase { |
226 public: | 225 public: |
227 AllFieldStream(typeArrayHandle fields, constantPoolHandle constants): FieldStreamBase(fields, constants) {} | 226 AllFieldStream(Array<u2>* fields, constantPoolHandle constants): FieldStreamBase(fields, constants) {} |
228 AllFieldStream(instanceKlass* k): FieldStreamBase(k->fields(), k->constants()) {} | 227 AllFieldStream(InstanceKlass* k): FieldStreamBase(k->fields(), k->constants()) {} |
229 AllFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants()) {} | 228 AllFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants()) {} |
230 }; | 229 }; |
231 | 230 |
232 #endif // SHARE_VM_OOPS_FIELDSTREAMS_HPP | 231 #endif // SHARE_VM_OOPS_FIELDSTREAMS_HPP |