155 public static class ClassState {
156 public static final ClassState UNPARSABLE_BY_GC = new ClassState("unparsable_by_gc");
157 public static final ClassState ALLOCATED = new ClassState("allocated");
158 public static final ClassState LOADED = new ClassState("loaded");
159 public static final ClassState LINKED = new ClassState("linked");
160 public static final ClassState BEING_INITIALIZED = new ClassState("beingInitialized");
161 public static final ClassState FULLY_INITIALIZED = new ClassState("fullyInitialized");
162 public static final ClassState INITIALIZATION_ERROR = new ClassState("initializationError");
163
164 private ClassState(String value) {
165 this.value = value;
166 }
167
168 public String toString() {
169 return value;
170 }
171
172 private String value;
173 }
174
175 private int getInitStateAsInt() { return (int) initState.getValue(this); }
176 public ClassState getInitState() {
177 int state = getInitStateAsInt();
178 if (state == CLASS_STATE_UNPARSABLE_BY_GC) {
179 return ClassState.UNPARSABLE_BY_GC;
180 } else if (state == CLASS_STATE_ALLOCATED) {
181 return ClassState.ALLOCATED;
182 } else if (state == CLASS_STATE_LOADED) {
183 return ClassState.LOADED;
184 } else if (state == CLASS_STATE_LINKED) {
185 return ClassState.LINKED;
186 } else if (state == CLASS_STATE_BEING_INITIALIZED) {
187 return ClassState.BEING_INITIALIZED;
188 } else if (state == CLASS_STATE_FULLY_INITIALIZED) {
189 return ClassState.FULLY_INITIALIZED;
190 } else if (state == CLASS_STATE_INITIALIZATION_ERROR) {
191 return ClassState.INITIALIZATION_ERROR;
192 } else {
193 throw new RuntimeException("should not reach here");
194 }
195 }
479 }
480
481 void iterateStaticFieldsInternal(OopVisitor visitor) {
482 TypeArray fields = getFields();
483 int length = (int) fields.getLength();
484 for (int index = 0; index < length; index += NEXT_OFFSET) {
485 short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET);
486 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
487 FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
488 AccessFlags access = new AccessFlags(accessFlags);
489 if (access.isStatic()) {
490 visitField(visitor, type, index);
491 }
492 }
493 }
494
495 public Klass getJavaSuper() {
496 return getSuper();
497 }
498
499 public void iterateNonStaticFields(OopVisitor visitor, Oop obj) {
500 if (getSuper() != null) {
501 ((InstanceKlass) getSuper()).iterateNonStaticFields(visitor, obj);
502 }
503 TypeArray fields = getFields();
504
505 int length = (int) fields.getLength();
506 for (int index = 0; index < length; index += NEXT_OFFSET) {
507 short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET);
508 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
509
510 FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
511 AccessFlags access = new AccessFlags(accessFlags);
512 if (!access.isStatic()) {
513 visitField(visitor, type, index);
514 }
515 }
516 }
517
518 /** Field access by name. */
|
155 public static class ClassState {
156 public static final ClassState UNPARSABLE_BY_GC = new ClassState("unparsable_by_gc");
157 public static final ClassState ALLOCATED = new ClassState("allocated");
158 public static final ClassState LOADED = new ClassState("loaded");
159 public static final ClassState LINKED = new ClassState("linked");
160 public static final ClassState BEING_INITIALIZED = new ClassState("beingInitialized");
161 public static final ClassState FULLY_INITIALIZED = new ClassState("fullyInitialized");
162 public static final ClassState INITIALIZATION_ERROR = new ClassState("initializationError");
163
164 private ClassState(String value) {
165 this.value = value;
166 }
167
168 public String toString() {
169 return value;
170 }
171
172 private String value;
173 }
174
175 public int getInitStateAsInt() { return (int) initState.getValue(this); }
176 public ClassState getInitState() {
177 int state = getInitStateAsInt();
178 if (state == CLASS_STATE_UNPARSABLE_BY_GC) {
179 return ClassState.UNPARSABLE_BY_GC;
180 } else if (state == CLASS_STATE_ALLOCATED) {
181 return ClassState.ALLOCATED;
182 } else if (state == CLASS_STATE_LOADED) {
183 return ClassState.LOADED;
184 } else if (state == CLASS_STATE_LINKED) {
185 return ClassState.LINKED;
186 } else if (state == CLASS_STATE_BEING_INITIALIZED) {
187 return ClassState.BEING_INITIALIZED;
188 } else if (state == CLASS_STATE_FULLY_INITIALIZED) {
189 return ClassState.FULLY_INITIALIZED;
190 } else if (state == CLASS_STATE_INITIALIZATION_ERROR) {
191 return ClassState.INITIALIZATION_ERROR;
192 } else {
193 throw new RuntimeException("should not reach here");
194 }
195 }
479 }
480
481 void iterateStaticFieldsInternal(OopVisitor visitor) {
482 TypeArray fields = getFields();
483 int length = (int) fields.getLength();
484 for (int index = 0; index < length; index += NEXT_OFFSET) {
485 short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET);
486 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
487 FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
488 AccessFlags access = new AccessFlags(accessFlags);
489 if (access.isStatic()) {
490 visitField(visitor, type, index);
491 }
492 }
493 }
494
495 public Klass getJavaSuper() {
496 return getSuper();
497 }
498
499 public static class StaticField {
500 public AccessFlags flags;
501 public Field field;
502
503 StaticField(Field field, AccessFlags flags) {
504 this.field = field;
505 this.flags = flags;
506 }
507 }
508
509 public Field[] getStaticFields() {
510 TypeArray fields = getFields();
511 int length = (int) fields.getLength();
512 ArrayList result = new ArrayList();
513 for (int index = 0; index < length; index += NEXT_OFFSET) {
514 Field f = newField(index);
515 if (f.isStatic()) {
516 result.add(f);
517 }
518 }
519 return (Field[])result.toArray(new Field[result.size()]);
520 }
521
522 public void iterateNonStaticFields(OopVisitor visitor, Oop obj) {
523 if (getSuper() != null) {
524 ((InstanceKlass) getSuper()).iterateNonStaticFields(visitor, obj);
525 }
526 TypeArray fields = getFields();
527
528 int length = (int) fields.getLength();
529 for (int index = 0; index < length; index += NEXT_OFFSET) {
530 short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET);
531 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
532
533 FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
534 AccessFlags access = new AccessFlags(accessFlags);
535 if (!access.isStatic()) {
536 visitField(visitor, type, index);
537 }
538 }
539 }
540
541 /** Field access by name. */
|