src/share/vm/oops/fieldStreams.hpp

Wed, 27 Apr 2016 01:25:04 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:25:04 +0800
changeset 0
f90c822e73f8
child 6876
710a3c8b516e
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/
changeset: 6782:28b50d07f6f8
tag: jdk8u25-b17

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 *
aoqi@0 23 */
aoqi@0 24
aoqi@0 25 #ifndef SHARE_VM_OOPS_FIELDSTREAMS_HPP
aoqi@0 26 #define SHARE_VM_OOPS_FIELDSTREAMS_HPP
aoqi@0 27
aoqi@0 28 #include "oops/instanceKlass.hpp"
aoqi@0 29 #include "oops/fieldInfo.hpp"
aoqi@0 30 #include "runtime/fieldDescriptor.hpp"
aoqi@0 31
aoqi@0 32 // The is the base class for iteration over the fields array
aoqi@0 33 // describing the declared fields in the class. Several subclasses
aoqi@0 34 // are provided depending on the kind of iteration required. The
aoqi@0 35 // JavaFieldStream is for iterating over regular Java fields and it
aoqi@0 36 // generally the preferred iterator. InternalFieldStream only
aoqi@0 37 // iterates over fields that have been injected by the JVM.
aoqi@0 38 // AllFieldStream exposes all fields and should only be used in rare
aoqi@0 39 // cases.
aoqi@0 40 class FieldStreamBase : public StackObj {
aoqi@0 41 protected:
aoqi@0 42 Array<u2>* _fields;
aoqi@0 43 constantPoolHandle _constants;
aoqi@0 44 int _index;
aoqi@0 45 int _limit;
aoqi@0 46 int _generic_signature_slot;
aoqi@0 47 fieldDescriptor _fd_buf;
aoqi@0 48
aoqi@0 49 FieldInfo* field() const { return FieldInfo::from_field_array(_fields, _index); }
aoqi@0 50 InstanceKlass* field_holder() const { return _constants->pool_holder(); }
aoqi@0 51
aoqi@0 52 int init_generic_signature_start_slot() {
aoqi@0 53 int length = _fields->length();
aoqi@0 54 int num_fields = 0;
aoqi@0 55 int skipped_generic_signature_slots = 0;
aoqi@0 56 FieldInfo* fi;
aoqi@0 57 AccessFlags flags;
aoqi@0 58 /* Scan from 0 to the current _index. Count the number of generic
aoqi@0 59 signature slots for field[0] to field[_index - 1]. */
aoqi@0 60 for (int i = 0; i < _index; i++) {
aoqi@0 61 fi = FieldInfo::from_field_array(_fields, i);
aoqi@0 62 flags.set_flags(fi->access_flags());
aoqi@0 63 if (flags.field_has_generic_signature()) {
aoqi@0 64 length --;
aoqi@0 65 skipped_generic_signature_slots ++;
aoqi@0 66 }
aoqi@0 67 }
aoqi@0 68 /* Scan from the current _index. */
aoqi@0 69 for (int i = _index; i*FieldInfo::field_slots < length; i++) {
aoqi@0 70 fi = FieldInfo::from_field_array(_fields, i);
aoqi@0 71 flags.set_flags(fi->access_flags());
aoqi@0 72 if (flags.field_has_generic_signature()) {
aoqi@0 73 length --;
aoqi@0 74 }
aoqi@0 75 num_fields ++;
aoqi@0 76 }
aoqi@0 77 _generic_signature_slot = length + skipped_generic_signature_slots;
aoqi@0 78 assert(_generic_signature_slot <= _fields->length(), "");
aoqi@0 79 return num_fields;
aoqi@0 80 }
aoqi@0 81
aoqi@0 82 FieldStreamBase(Array<u2>* fields, constantPoolHandle constants, int start, int limit) {
aoqi@0 83 _fields = fields;
aoqi@0 84 _constants = constants;
aoqi@0 85 _index = start;
aoqi@0 86 int num_fields = init_generic_signature_start_slot();
aoqi@0 87 if (limit < start) {
aoqi@0 88 _limit = num_fields;
aoqi@0 89 } else {
aoqi@0 90 _limit = limit;
aoqi@0 91 }
aoqi@0 92 }
aoqi@0 93
aoqi@0 94 FieldStreamBase(Array<u2>* fields, constantPoolHandle constants) {
aoqi@0 95 _fields = fields;
aoqi@0 96 _constants = constants;
aoqi@0 97 _index = 0;
aoqi@0 98 _limit = init_generic_signature_start_slot();
aoqi@0 99 }
aoqi@0 100
aoqi@0 101 public:
aoqi@0 102 FieldStreamBase(InstanceKlass* klass) {
aoqi@0 103 _fields = klass->fields();
aoqi@0 104 _constants = klass->constants();
aoqi@0 105 _index = 0;
aoqi@0 106 _limit = klass->java_fields_count();
aoqi@0 107 init_generic_signature_start_slot();
aoqi@0 108 assert(klass == field_holder(), "");
aoqi@0 109 }
aoqi@0 110 FieldStreamBase(instanceKlassHandle klass) {
aoqi@0 111 _fields = klass->fields();
aoqi@0 112 _constants = klass->constants();
aoqi@0 113 _index = 0;
aoqi@0 114 _limit = klass->java_fields_count();
aoqi@0 115 init_generic_signature_start_slot();
aoqi@0 116 assert(klass == field_holder(), "");
aoqi@0 117 }
aoqi@0 118
aoqi@0 119 // accessors
aoqi@0 120 int index() const { return _index; }
aoqi@0 121
aoqi@0 122 void next() {
aoqi@0 123 if (access_flags().field_has_generic_signature()) {
aoqi@0 124 _generic_signature_slot ++;
aoqi@0 125 assert(_generic_signature_slot <= _fields->length(), "");
aoqi@0 126 }
aoqi@0 127 _index += 1;
aoqi@0 128 }
aoqi@0 129 bool done() const { return _index >= _limit; }
aoqi@0 130
aoqi@0 131 // Accessors for current field
aoqi@0 132 AccessFlags access_flags() const {
aoqi@0 133 AccessFlags flags;
aoqi@0 134 flags.set_flags(field()->access_flags());
aoqi@0 135 return flags;
aoqi@0 136 }
aoqi@0 137
aoqi@0 138 void set_access_flags(u2 flags) const {
aoqi@0 139 field()->set_access_flags(flags);
aoqi@0 140 }
aoqi@0 141
aoqi@0 142 void set_access_flags(AccessFlags flags) const {
aoqi@0 143 set_access_flags(flags.as_short());
aoqi@0 144 }
aoqi@0 145
aoqi@0 146 Symbol* name() const {
aoqi@0 147 return field()->name(_constants);
aoqi@0 148 }
aoqi@0 149
aoqi@0 150 Symbol* signature() const {
aoqi@0 151 return field()->signature(_constants);
aoqi@0 152 }
aoqi@0 153
aoqi@0 154 Symbol* generic_signature() const {
aoqi@0 155 if (access_flags().field_has_generic_signature()) {
aoqi@0 156 assert(_generic_signature_slot < _fields->length(), "out of bounds");
aoqi@0 157 int index = _fields->at(_generic_signature_slot);
aoqi@0 158 return _constants->symbol_at(index);
aoqi@0 159 } else {
aoqi@0 160 return NULL;
aoqi@0 161 }
aoqi@0 162 }
aoqi@0 163
aoqi@0 164 int offset() const {
aoqi@0 165 return field()->offset();
aoqi@0 166 }
aoqi@0 167
aoqi@0 168 int allocation_type() const {
aoqi@0 169 return field()->allocation_type();
aoqi@0 170 }
aoqi@0 171
aoqi@0 172 void set_offset(int offset) {
aoqi@0 173 field()->set_offset(offset);
aoqi@0 174 }
aoqi@0 175
aoqi@0 176 bool is_offset_set() const {
aoqi@0 177 return field()->is_offset_set();
aoqi@0 178 }
aoqi@0 179
aoqi@0 180 bool is_contended() const {
aoqi@0 181 return field()->is_contended();
aoqi@0 182 }
aoqi@0 183
aoqi@0 184 int contended_group() const {
aoqi@0 185 return field()->contended_group();
aoqi@0 186 }
aoqi@0 187
aoqi@0 188 // bridge to a heavier API:
aoqi@0 189 fieldDescriptor& field_descriptor() const {
aoqi@0 190 fieldDescriptor& field = const_cast<fieldDescriptor&>(_fd_buf);
aoqi@0 191 field.reinitialize(field_holder(), _index);
aoqi@0 192 return field;
aoqi@0 193 }
aoqi@0 194 };
aoqi@0 195
aoqi@0 196 // Iterate over only the internal fields
aoqi@0 197 class JavaFieldStream : public FieldStreamBase {
aoqi@0 198 public:
aoqi@0 199 JavaFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), 0, k->java_fields_count()) {}
aoqi@0 200
aoqi@0 201 int name_index() const {
aoqi@0 202 assert(!field()->is_internal(), "regular only");
aoqi@0 203 return field()->name_index();
aoqi@0 204 }
aoqi@0 205 void set_name_index(int index) {
aoqi@0 206 assert(!field()->is_internal(), "regular only");
aoqi@0 207 field()->set_name_index(index);
aoqi@0 208 }
aoqi@0 209 int signature_index() const {
aoqi@0 210 assert(!field()->is_internal(), "regular only");
aoqi@0 211 return field()->signature_index();
aoqi@0 212 }
aoqi@0 213 void set_signature_index(int index) {
aoqi@0 214 assert(!field()->is_internal(), "regular only");
aoqi@0 215 field()->set_signature_index(index);
aoqi@0 216 }
aoqi@0 217 int generic_signature_index() const {
aoqi@0 218 assert(!field()->is_internal(), "regular only");
aoqi@0 219 if (access_flags().field_has_generic_signature()) {
aoqi@0 220 assert(_generic_signature_slot < _fields->length(), "out of bounds");
aoqi@0 221 return _fields->at(_generic_signature_slot);
aoqi@0 222 } else {
aoqi@0 223 return 0;
aoqi@0 224 }
aoqi@0 225 }
aoqi@0 226 void set_generic_signature_index(int index) {
aoqi@0 227 assert(!field()->is_internal(), "regular only");
aoqi@0 228 if (access_flags().field_has_generic_signature()) {
aoqi@0 229 assert(_generic_signature_slot < _fields->length(), "out of bounds");
aoqi@0 230 _fields->at_put(_generic_signature_slot, index);
aoqi@0 231 }
aoqi@0 232 }
aoqi@0 233 int initval_index() const {
aoqi@0 234 assert(!field()->is_internal(), "regular only");
aoqi@0 235 return field()->initval_index();
aoqi@0 236 }
aoqi@0 237 void set_initval_index(int index) {
aoqi@0 238 assert(!field()->is_internal(), "regular only");
aoqi@0 239 return field()->set_initval_index(index);
aoqi@0 240 }
aoqi@0 241 };
aoqi@0 242
aoqi@0 243
aoqi@0 244 // Iterate over only the internal fields
aoqi@0 245 class InternalFieldStream : public FieldStreamBase {
aoqi@0 246 public:
aoqi@0 247 InternalFieldStream(InstanceKlass* k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {}
aoqi@0 248 InternalFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {}
aoqi@0 249 };
aoqi@0 250
aoqi@0 251
aoqi@0 252 class AllFieldStream : public FieldStreamBase {
aoqi@0 253 public:
aoqi@0 254 AllFieldStream(Array<u2>* fields, constantPoolHandle constants): FieldStreamBase(fields, constants) {}
aoqi@0 255 AllFieldStream(InstanceKlass* k): FieldStreamBase(k->fields(), k->constants()) {}
aoqi@0 256 AllFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants()) {}
aoqi@0 257 };
aoqi@0 258
aoqi@0 259 #endif // SHARE_VM_OOPS_FIELDSTREAMS_HPP

mercurial