1 /*
2 * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
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 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
70 methodOrdering = new OopField(type.getOopField("_method_ordering"), Oop.getHeaderSize());
71 localInterfaces = new OopField(type.getOopField("_local_interfaces"), Oop.getHeaderSize());
72 transitiveInterfaces = new OopField(type.getOopField("_transitive_interfaces"), Oop.getHeaderSize());
73 nofImplementors = new CIntField(type.getCIntegerField("_nof_implementors"), Oop.getHeaderSize());
74 IMPLEMENTORS_LIMIT = db.lookupIntConstant("instanceKlass::implementors_limit").intValue();
75 implementors = new OopField[IMPLEMENTORS_LIMIT];
76 for (int i = 0; i < IMPLEMENTORS_LIMIT; i++) {
77 long arrayOffset = Oop.getHeaderSize() + (i * db.getAddressSize());
78 implementors[i] = new OopField(type.getOopField("_implementors[0]"), arrayOffset);
79 }
80 fields = new OopField(type.getOopField("_fields"), Oop.getHeaderSize());
81 constants = new OopField(type.getOopField("_constants"), Oop.getHeaderSize());
82 classLoader = new OopField(type.getOopField("_class_loader"), Oop.getHeaderSize());
83 protectionDomain = new OopField(type.getOopField("_protection_domain"), Oop.getHeaderSize());
84 signers = new OopField(type.getOopField("_signers"), Oop.getHeaderSize());
85 sourceFileName = type.getAddressField("_source_file_name");
86 sourceDebugExtension = type.getAddressField("_source_debug_extension");
87 innerClasses = new OopField(type.getOopField("_inner_classes"), Oop.getHeaderSize());
88 nonstaticFieldSize = new CIntField(type.getCIntegerField("_nonstatic_field_size"), Oop.getHeaderSize());
89 staticFieldSize = new CIntField(type.getCIntegerField("_static_field_size"), Oop.getHeaderSize());
90 staticOopFieldSize = new CIntField(type.getCIntegerField("_static_oop_field_size"), Oop.getHeaderSize());
91 nonstaticOopMapSize = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), Oop.getHeaderSize());
92 isMarkedDependent = new CIntField(type.getCIntegerField("_is_marked_dependent"), Oop.getHeaderSize());
93 initState = new CIntField(type.getCIntegerField("_init_state"), Oop.getHeaderSize());
94 vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), Oop.getHeaderSize());
95 itableLen = new CIntField(type.getCIntegerField("_itable_len"), Oop.getHeaderSize());
96 breakpoints = type.getAddressField("_breakpoints");
97 genericSignature = type.getAddressField("_generic_signature");
98 majorVersion = new CIntField(type.getCIntegerField("_major_version"), Oop.getHeaderSize());
99 minorVersion = new CIntField(type.getCIntegerField("_minor_version"), Oop.getHeaderSize());
100 headerSize = alignObjectOffset(Oop.getHeaderSize() + type.getSize());
101
102 // read field offset constants
103 ACCESS_FLAGS_OFFSET = db.lookupIntConstant("instanceKlass::access_flags_offset").intValue();
104 NAME_INDEX_OFFSET = db.lookupIntConstant("instanceKlass::name_index_offset").intValue();
105 SIGNATURE_INDEX_OFFSET = db.lookupIntConstant("instanceKlass::signature_index_offset").intValue();
106 INITVAL_INDEX_OFFSET = db.lookupIntConstant("instanceKlass::initval_index_offset").intValue();
107 LOW_OFFSET = db.lookupIntConstant("instanceKlass::low_offset").intValue();
108 HIGH_OFFSET = db.lookupIntConstant("instanceKlass::high_offset").intValue();
109 GENERIC_SIGNATURE_INDEX_OFFSET = db.lookupIntConstant("instanceKlass::generic_signature_offset").intValue();
110 NEXT_OFFSET = db.lookupIntConstant("instanceKlass::next_offset").intValue();
123 super(handle, heap);
124 }
125
126 private static OopField arrayKlasses;
127 private static OopField methods;
128 private static OopField methodOrdering;
129 private static OopField localInterfaces;
130 private static OopField transitiveInterfaces;
131 private static CIntField nofImplementors;
132 private static OopField[] implementors;
133 private static OopField fields;
134 private static OopField constants;
135 private static OopField classLoader;
136 private static OopField protectionDomain;
137 private static OopField signers;
138 private static AddressField sourceFileName;
139 private static AddressField sourceDebugExtension;
140 private static OopField innerClasses;
141 private static CIntField nonstaticFieldSize;
142 private static CIntField staticFieldSize;
143 private static CIntField staticOopFieldSize;
144 private static CIntField nonstaticOopMapSize;
145 private static CIntField isMarkedDependent;
146 private static CIntField initState;
147 private static CIntField vtableLen;
148 private static CIntField itableLen;
149 private static AddressField breakpoints;
150 private static AddressField genericSignature;
151 private static CIntField majorVersion;
152 private static CIntField minorVersion;
153
154 // type safe enum for ClassState from instanceKlass.hpp
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
244 public static long getHeaderSize() { return headerSize; }
245
246 // Accessors for declared fields
247 public Klass getArrayKlasses() { return (Klass) arrayKlasses.getValue(this); }
248 public ObjArray getMethods() { return (ObjArray) methods.getValue(this); }
249 public TypeArray getMethodOrdering() { return (TypeArray) methodOrdering.getValue(this); }
250 public ObjArray getLocalInterfaces() { return (ObjArray) localInterfaces.getValue(this); }
251 public ObjArray getTransitiveInterfaces() { return (ObjArray) transitiveInterfaces.getValue(this); }
252 public long nofImplementors() { return nofImplementors.getValue(this); }
253 public Klass getImplementor() { return (Klass) implementors[0].getValue(this); }
254 public Klass getImplementor(int i) { return (Klass) implementors[i].getValue(this); }
255 public TypeArray getFields() { return (TypeArray) fields.getValue(this); }
256 public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); }
257 public Oop getClassLoader() { return classLoader.getValue(this); }
258 public Oop getProtectionDomain() { return protectionDomain.getValue(this); }
259 public ObjArray getSigners() { return (ObjArray) signers.getValue(this); }
260 public Symbol getSourceFileName() { return getSymbol(sourceFileName); }
261 public Symbol getSourceDebugExtension(){ return getSymbol(sourceDebugExtension); }
262 public TypeArray getInnerClasses() { return (TypeArray) innerClasses.getValue(this); }
263 public long getNonstaticFieldSize() { return nonstaticFieldSize.getValue(this); }
264 public long getStaticFieldSize() { return staticFieldSize.getValue(this); }
265 public long getStaticOopFieldSize() { return staticOopFieldSize.getValue(this); }
266 public long getNonstaticOopMapSize() { return nonstaticOopMapSize.getValue(this); }
267 public boolean getIsMarkedDependent() { return isMarkedDependent.getValue(this) != 0; }
268 public long getVtableLen() { return vtableLen.getValue(this); }
269 public long getItableLen() { return itableLen.getValue(this); }
270 public Symbol getGenericSignature() { return getSymbol(genericSignature); }
271 public long majorVersion() { return majorVersion.getValue(this); }
272 public long minorVersion() { return minorVersion.getValue(this); }
273
274 // "size helper" == instance size in words
275 public long getSizeHelper() {
276 int lh = getLayoutHelper();
277 if (Assert.ASSERTS_ENABLED) {
278 Assert.that(lh > 0, "layout helper initialized for instance class");
279 }
280 return lh / VM.getVM().getAddressSize();
281 }
282
283 // same as enum InnerClassAttributeOffset in VM code.
284 public static interface InnerClassAttributeOffset {
285 // from JVM spec. "InnerClasses" attribute
436
437 public void iterateFields(OopVisitor visitor, boolean doVMFields) {
438 super.iterateFields(visitor, doVMFields);
439 if (doVMFields) {
440 visitor.doOop(arrayKlasses, true);
441 visitor.doOop(methods, true);
442 visitor.doOop(methodOrdering, true);
443 visitor.doOop(localInterfaces, true);
444 visitor.doOop(transitiveInterfaces, true);
445 visitor.doCInt(nofImplementors, true);
446 for (int i = 0; i < IMPLEMENTORS_LIMIT; i++)
447 visitor.doOop(implementors[i], true);
448 visitor.doOop(fields, true);
449 visitor.doOop(constants, true);
450 visitor.doOop(classLoader, true);
451 visitor.doOop(protectionDomain, true);
452 visitor.doOop(signers, true);
453 visitor.doOop(innerClasses, true);
454 visitor.doCInt(nonstaticFieldSize, true);
455 visitor.doCInt(staticFieldSize, true);
456 visitor.doCInt(staticOopFieldSize, true);
457 visitor.doCInt(nonstaticOopMapSize, true);
458 visitor.doCInt(isMarkedDependent, true);
459 visitor.doCInt(initState, true);
460 visitor.doCInt(vtableLen, true);
461 visitor.doCInt(itableLen, true);
462 }
463
464 TypeArray fields = getFields();
465 int length = (int) fields.getLength();
466 for (int index = 0; index < length; index += NEXT_OFFSET) {
467 short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET);
468 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
469 FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
470 AccessFlags access = new AccessFlags(accessFlags);
471 if (access.isStatic()) {
472 visitField(visitor, type, index);
473 }
474 }
475 }
476
675 */
676 public List getDirectImplementedInterfaces() {
677 // Contains an InstanceKlass for each interface in this classes
678 // 'implements' clause.
679
680 ObjArray interfaces = getLocalInterfaces();
681 int length = (int) interfaces.getLength();
682 List directImplementedInterfaces = new ArrayList(length);
683
684 for (int index = 0; index < length; index ++) {
685 directImplementedInterfaces.add(interfaces.getObjAt(index));
686 }
687
688 return directImplementedInterfaces;
689 }
690
691
692 public long getObjectSize() {
693 long bodySize = alignObjectOffset(getVtableLen() * getHeap().getOopSize())
694 + alignObjectOffset(getItableLen() * getHeap().getOopSize())
695 + (getStaticFieldSize() + getNonstaticOopMapSize()) * getHeap().getOopSize();
696 return alignObjectSize(headerSize + bodySize);
697 }
698
699 public Klass arrayKlassImpl(boolean orNull, int n) {
700 // FIXME: in reflective system this would need to change to
701 // actually allocate
702 if (getArrayKlasses() == null) { return null; }
703 ObjArrayKlass oak = (ObjArrayKlass) getArrayKlasses();
704 if (orNull) {
705 return oak.arrayKlassOrNull(n);
706 }
707 return oak.arrayKlass(n);
708 }
709
710 public Klass arrayKlassImpl(boolean orNull) {
711 return arrayKlassImpl(orNull, 1);
712 }
713
714 public String signature() {
715 return "L" + super.signature() + ";";
|
1 /*
2 * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
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 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
70 methodOrdering = new OopField(type.getOopField("_method_ordering"), Oop.getHeaderSize());
71 localInterfaces = new OopField(type.getOopField("_local_interfaces"), Oop.getHeaderSize());
72 transitiveInterfaces = new OopField(type.getOopField("_transitive_interfaces"), Oop.getHeaderSize());
73 nofImplementors = new CIntField(type.getCIntegerField("_nof_implementors"), Oop.getHeaderSize());
74 IMPLEMENTORS_LIMIT = db.lookupIntConstant("instanceKlass::implementors_limit").intValue();
75 implementors = new OopField[IMPLEMENTORS_LIMIT];
76 for (int i = 0; i < IMPLEMENTORS_LIMIT; i++) {
77 long arrayOffset = Oop.getHeaderSize() + (i * db.getAddressSize());
78 implementors[i] = new OopField(type.getOopField("_implementors[0]"), arrayOffset);
79 }
80 fields = new OopField(type.getOopField("_fields"), Oop.getHeaderSize());
81 constants = new OopField(type.getOopField("_constants"), Oop.getHeaderSize());
82 classLoader = new OopField(type.getOopField("_class_loader"), Oop.getHeaderSize());
83 protectionDomain = new OopField(type.getOopField("_protection_domain"), Oop.getHeaderSize());
84 signers = new OopField(type.getOopField("_signers"), Oop.getHeaderSize());
85 sourceFileName = type.getAddressField("_source_file_name");
86 sourceDebugExtension = type.getAddressField("_source_debug_extension");
87 innerClasses = new OopField(type.getOopField("_inner_classes"), Oop.getHeaderSize());
88 nonstaticFieldSize = new CIntField(type.getCIntegerField("_nonstatic_field_size"), Oop.getHeaderSize());
89 staticFieldSize = new CIntField(type.getCIntegerField("_static_field_size"), Oop.getHeaderSize());
90 staticOopFieldCount = new CIntField(type.getCIntegerField("_static_oop_field_count"), Oop.getHeaderSize());
91 nonstaticOopMapSize = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), Oop.getHeaderSize());
92 isMarkedDependent = new CIntField(type.getCIntegerField("_is_marked_dependent"), Oop.getHeaderSize());
93 initState = new CIntField(type.getCIntegerField("_init_state"), Oop.getHeaderSize());
94 vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), Oop.getHeaderSize());
95 itableLen = new CIntField(type.getCIntegerField("_itable_len"), Oop.getHeaderSize());
96 breakpoints = type.getAddressField("_breakpoints");
97 genericSignature = type.getAddressField("_generic_signature");
98 majorVersion = new CIntField(type.getCIntegerField("_major_version"), Oop.getHeaderSize());
99 minorVersion = new CIntField(type.getCIntegerField("_minor_version"), Oop.getHeaderSize());
100 headerSize = alignObjectOffset(Oop.getHeaderSize() + type.getSize());
101
102 // read field offset constants
103 ACCESS_FLAGS_OFFSET = db.lookupIntConstant("instanceKlass::access_flags_offset").intValue();
104 NAME_INDEX_OFFSET = db.lookupIntConstant("instanceKlass::name_index_offset").intValue();
105 SIGNATURE_INDEX_OFFSET = db.lookupIntConstant("instanceKlass::signature_index_offset").intValue();
106 INITVAL_INDEX_OFFSET = db.lookupIntConstant("instanceKlass::initval_index_offset").intValue();
107 LOW_OFFSET = db.lookupIntConstant("instanceKlass::low_offset").intValue();
108 HIGH_OFFSET = db.lookupIntConstant("instanceKlass::high_offset").intValue();
109 GENERIC_SIGNATURE_INDEX_OFFSET = db.lookupIntConstant("instanceKlass::generic_signature_offset").intValue();
110 NEXT_OFFSET = db.lookupIntConstant("instanceKlass::next_offset").intValue();
123 super(handle, heap);
124 }
125
126 private static OopField arrayKlasses;
127 private static OopField methods;
128 private static OopField methodOrdering;
129 private static OopField localInterfaces;
130 private static OopField transitiveInterfaces;
131 private static CIntField nofImplementors;
132 private static OopField[] implementors;
133 private static OopField fields;
134 private static OopField constants;
135 private static OopField classLoader;
136 private static OopField protectionDomain;
137 private static OopField signers;
138 private static AddressField sourceFileName;
139 private static AddressField sourceDebugExtension;
140 private static OopField innerClasses;
141 private static CIntField nonstaticFieldSize;
142 private static CIntField staticFieldSize;
143 private static CIntField staticOopFieldCount;
144 private static CIntField nonstaticOopMapSize;
145 private static CIntField isMarkedDependent;
146 private static CIntField initState;
147 private static CIntField vtableLen;
148 private static CIntField itableLen;
149 private static AddressField breakpoints;
150 private static AddressField genericSignature;
151 private static CIntField majorVersion;
152 private static CIntField minorVersion;
153
154 // type safe enum for ClassState from instanceKlass.hpp
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
244 public static long getHeaderSize() { return headerSize; }
245
246 // Accessors for declared fields
247 public Klass getArrayKlasses() { return (Klass) arrayKlasses.getValue(this); }
248 public ObjArray getMethods() { return (ObjArray) methods.getValue(this); }
249 public TypeArray getMethodOrdering() { return (TypeArray) methodOrdering.getValue(this); }
250 public ObjArray getLocalInterfaces() { return (ObjArray) localInterfaces.getValue(this); }
251 public ObjArray getTransitiveInterfaces() { return (ObjArray) transitiveInterfaces.getValue(this); }
252 public long nofImplementors() { return nofImplementors.getValue(this); }
253 public Klass getImplementor() { return (Klass) implementors[0].getValue(this); }
254 public Klass getImplementor(int i) { return (Klass) implementors[i].getValue(this); }
255 public TypeArray getFields() { return (TypeArray) fields.getValue(this); }
256 public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); }
257 public Oop getClassLoader() { return classLoader.getValue(this); }
258 public Oop getProtectionDomain() { return protectionDomain.getValue(this); }
259 public ObjArray getSigners() { return (ObjArray) signers.getValue(this); }
260 public Symbol getSourceFileName() { return getSymbol(sourceFileName); }
261 public Symbol getSourceDebugExtension(){ return getSymbol(sourceDebugExtension); }
262 public TypeArray getInnerClasses() { return (TypeArray) innerClasses.getValue(this); }
263 public long getNonstaticFieldSize() { return nonstaticFieldSize.getValue(this); }
264 public long getStaticOopFieldCount() { return staticOopFieldCount.getValue(this); }
265 public long getNonstaticOopMapSize() { return nonstaticOopMapSize.getValue(this); }
266 public boolean getIsMarkedDependent() { return isMarkedDependent.getValue(this) != 0; }
267 public long getVtableLen() { return vtableLen.getValue(this); }
268 public long getItableLen() { return itableLen.getValue(this); }
269 public Symbol getGenericSignature() { return getSymbol(genericSignature); }
270 public long majorVersion() { return majorVersion.getValue(this); }
271 public long minorVersion() { return minorVersion.getValue(this); }
272
273 // "size helper" == instance size in words
274 public long getSizeHelper() {
275 int lh = getLayoutHelper();
276 if (Assert.ASSERTS_ENABLED) {
277 Assert.that(lh > 0, "layout helper initialized for instance class");
278 }
279 return lh / VM.getVM().getAddressSize();
280 }
281
282 // same as enum InnerClassAttributeOffset in VM code.
283 public static interface InnerClassAttributeOffset {
284 // from JVM spec. "InnerClasses" attribute
435
436 public void iterateFields(OopVisitor visitor, boolean doVMFields) {
437 super.iterateFields(visitor, doVMFields);
438 if (doVMFields) {
439 visitor.doOop(arrayKlasses, true);
440 visitor.doOop(methods, true);
441 visitor.doOop(methodOrdering, true);
442 visitor.doOop(localInterfaces, true);
443 visitor.doOop(transitiveInterfaces, true);
444 visitor.doCInt(nofImplementors, true);
445 for (int i = 0; i < IMPLEMENTORS_LIMIT; i++)
446 visitor.doOop(implementors[i], true);
447 visitor.doOop(fields, true);
448 visitor.doOop(constants, true);
449 visitor.doOop(classLoader, true);
450 visitor.doOop(protectionDomain, true);
451 visitor.doOop(signers, true);
452 visitor.doOop(innerClasses, true);
453 visitor.doCInt(nonstaticFieldSize, true);
454 visitor.doCInt(staticFieldSize, true);
455 visitor.doCInt(staticOopFieldCount, true);
456 visitor.doCInt(nonstaticOopMapSize, true);
457 visitor.doCInt(isMarkedDependent, true);
458 visitor.doCInt(initState, true);
459 visitor.doCInt(vtableLen, true);
460 visitor.doCInt(itableLen, true);
461 }
462
463 TypeArray fields = getFields();
464 int length = (int) fields.getLength();
465 for (int index = 0; index < length; index += NEXT_OFFSET) {
466 short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET);
467 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
468 FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
469 AccessFlags access = new AccessFlags(accessFlags);
470 if (access.isStatic()) {
471 visitField(visitor, type, index);
472 }
473 }
474 }
475
674 */
675 public List getDirectImplementedInterfaces() {
676 // Contains an InstanceKlass for each interface in this classes
677 // 'implements' clause.
678
679 ObjArray interfaces = getLocalInterfaces();
680 int length = (int) interfaces.getLength();
681 List directImplementedInterfaces = new ArrayList(length);
682
683 for (int index = 0; index < length; index ++) {
684 directImplementedInterfaces.add(interfaces.getObjAt(index));
685 }
686
687 return directImplementedInterfaces;
688 }
689
690
691 public long getObjectSize() {
692 long bodySize = alignObjectOffset(getVtableLen() * getHeap().getOopSize())
693 + alignObjectOffset(getItableLen() * getHeap().getOopSize())
694 + (getNonstaticOopMapSize()) * getHeap().getOopSize();
695 return alignObjectSize(headerSize + bodySize);
696 }
697
698 public Klass arrayKlassImpl(boolean orNull, int n) {
699 // FIXME: in reflective system this would need to change to
700 // actually allocate
701 if (getArrayKlasses() == null) { return null; }
702 ObjArrayKlass oak = (ObjArrayKlass) getArrayKlasses();
703 if (orNull) {
704 return oak.arrayKlassOrNull(n);
705 }
706 return oak.arrayKlass(n);
707 }
708
709 public Klass arrayKlassImpl(boolean orNull) {
710 return arrayKlassImpl(orNull, 1);
711 }
712
713 public String signature() {
714 return "L" + super.signature() + ";";
|